Shift-JIS環境での開発、とりわけ携帯サイト開発になるんですが、
FORM処理にてDBにデータを格納するときに起こる問題について、そのときのメモ書きと対策です。

5C文字とは【表】【館】【ソ】などの2バイト目の文字コードが”5C”になっている文字の事を指します。
全部で40文字あります。
“5C”はShift-JISでは【\】を表します。

これで問題になるのが、(とりあえず、magic_quotes_gpcやaddslashes,stripslashesなんかはクリアしているとします。)
  ・文末の1文字が”5C”文字の時
  ・”5C”文字が改行の直前にある時
この2点です。

DBに登録する直前で上記2点の問題を回避してからDBに登録しないと、DBに登録できない、または登録しても2度と編集する事ができないなどの問題がおこります。
なので、それを回避するメソッドを作成します。

lastCharCheck()は一番最後の文字が”5C”文字なのかをチェックし、”5C”文字の場合半角スペースを付加します。
newLineCheck()は文章内の改行を探し出し、その直前に”5C”文字があろうが無かろうが半角スペースを付加します。

    /**
     *	文末の1文字が文字コード5Cを含むかどうかのチェックを行います。
     *	5C文字であれば文末に半角スペースを付加してリターンします。
     *
     *	@param 検索したい文字列
     */
    function lastCharCheck($pData){

        $tmp = mb_strlen($pData);
        $lastChar = mb_substr($pData,$tmp-1,1);

        //csvファイル"5c.csv"には40文字の5c文字が入っています。これはググって下さい
        $fp = fopen("5c.csv","r") or die("ファイルオープンに失敗しました");
        while(($line = fgetcsv($fp,1000,",")) !== false){
        	for($i=0;$i<count($line);$i++){
                if($lastChar == $line[$i]){

                    return $pData." ";
                }
            }
        }
        return $pData;
    }

    /**
     *	文章内の改行を探し出し、改行の前に半角スペースを挿入します。
     *
     *	@param 検索したい文字列
     */
    function newLineCheck($pData){
        return preg_replace("/\\r\\n/"," \r\n",$pData);
    }

これでDBに登録は問題ないのですが、このままだとDBに登録したデータを編集する時に問題がおこります。
それは、半角スペースが編集の度にどんどんどんどん、付加されて行くというお粗末な問題です。
ですので、編集するデータをDBから引っ張ってくる直前に下記のメソッドに通してあげます。


    /**
     *	入力したデータをDBから取得し、編集する場合は必ずこのメソッドを通します。
     *	文章内の改行の前に半角スペースがあれば半角スペースを取り除く。
     *
     */
    function trimSpace($pData){
        return preg_replace("/ \\r\\n/","\r\n",$pData);
    }

以上が5C文字がDBにインサート出来ない、編集してアップデートが出来ないなどの問題に直面した時の
解決方法です。

Trackback URL

2 Responses to “5c問題に打ち勝つ”

Leave a Reply

カテゴリー
ブログロール