文字数のカウントと改行~mb_strlenとtextarea~ | 一からWebサービス&アプリを作る日誌!

一からWebサービス&アプリを作る日誌!

webデザインとHTML・CSSまわりの知識のみでしたが、PHPにも挑戦。一からやりたいサイトを作ってバージョンアップを重ねる過程のこまごましたメモ。
他にiPhoneアプリ、VBAメモも。

フォームのテキストエリアにJSで
twitterみたいに残りの入力できる文字数をリアルタイム表示させたら。。


phpのmb_strlenでのカウントと誤差が・・・!

厳密にいうと、ブラウザのフォーム横に表示されたJSの残文字数はまだ大丈夫なのに、
phpで、データをDBにインサートする前に念のためチェックした
if(mb_strlen( $inputtext, "utf-8" ) <= 300)
{
インサート~!
}
で引っかかる。


なんなんだろうと調べたらどうやら改行コードらしい。

CRLFだと
mb_strlenにて、改行が2でカウントされてしまうと。

[メモ] mb_strlenと改行コードの罠
【PHP】改行コードをmb_strlenに渡すと2を返します


ちょっと面倒。PHPのコーディングはCRLFが良いとどっかで読んだから必ずずっとCRLFにしていたよ。


対処方法の通り\r\nを\nに置換してみても・・・むむむ?改行コードを1とカウントしてくれない・・


いろいろ見てみるとさらに原因がありました。
ユーザーの入力したデータをDBに入れる場合には
必ず
mysql_real_escape_string
をしなければなりませんが、
これを通す通さないで改行コードの文字数が変わる。

結論としては
・表示上のJSでのカウント数と、実際にインサート可能な文字数(mb_strlenでカウントした数)が合っていれば使用上は問題ない。

・DBの型varchar(300)を実際は改行コード分もDBに格納されるので、上記の文字数よりも多めの桁数の型にしておく

ということで、データを2種類用意。

---
$input_data=$_POST['ユーザーヨリ'];

カウント用
$input_data_1 = str_replace("\r\n", "\n", $input_data); 

DBインサート用
$input_data_2 = mysql_real_escape_string(trim($input_data)); (←カウント用でエスケープしたら文字数増量してしまうため)
$input_data_2 = htmlspecialchars($input_data_2); (←WEB表示用のエスケープ文字数に関係なさそうだったのでここで)

(↑DBインサート用はmysql_real_escape_stringも通したほうがいい[2012/12追記])

if(mb_strlen( $input_data_1, "utf-8" ) <= 300)
{
インサート~!
$query = "UPDATE テーブル SET カラム名 = '$input_data_2', updated_at = NOW() WHERE ☆☆☆";
mysql_query($query, $conn);
}
----


上記だと厳密にいうと
改行ばっかり入れられてしまうと、フォームもmb_strlenも通るけど、
DBのvarchar()に入らず切れてしまうことになるので、
ゆくゆくは考えなくてはならないかもしれない。
でも異常な程改行されるパターンを切れないようにする労力対効果を考え見送り。


■■表示の話
さらにこれで終わりかとおもいきや、
textareaで入力時に入れた改行が
普通にページに表示させると改行されていない。

\r\nになっているものをHTMLタグ
にしてあげなきゃいけないんですね。

入力フォームの改行位置にbrタグを入れてくれる関数
echo nl2br($input_data_2);

これで勝手に
を入れてくれるという。
いろいろな関数が用意されているものだ・・