目次
入力フォームのタイトルに例えば、「タイトルを入力してください。50バイトまで」と表記したところで、初心者はバイトって何?と思われてしまう。 UTF-8な環境が主流になりつつ現在、入力された文字の長さを測ることは困難であるが、それでもエラー対応をするためにある程度は文字入力の制限をしなければならない。
http://yanok.net/2012/08/post-226.html を見ると、文字数制限のやっかいさについて書かれているが今回はphpで実装されている文字のカウントについてまとめてみる。
文字 | 幅 |
U+0000 - U+0019 | 0 |
U+0020 - U+1FFF | 1 |
U+2000 - U+FF60 | 2 |
U+FF61 - U+FF9F | 1 |
U+FFA0 - | 2 |
さて、どれを使えば理想かというと、ユーザ視点で考えれば、2か3かもしれない。1は多めにデータベースの型のカラムをとっておけば対応できる。 と思って2や3のみで対応すると、改行をたくさん入れられた際に文字数0、バイト数(7行であれば14)バイトとでてしまい、データベースの型のフィールドにうまく収まらない可能性がある。ということで入力チェックを1と2で対応するのがよく3はあまり使わない・・・カモ。そんなコードをあまり見たことがない・・・。
<?php $hoge = $_POST["hoge"]; $error = ''; if(strlen($hoge) > 255) $error .= '255バイトを超えています。<br>';/*textarea等に使用*/ if(mb_strlen($hoge) > 60) $error .= '60文字以内にしてください<br>'; if(mb_strwidth($hoge) > 40) $error .= 'もう少し幅を小さくしてください?<br>';/*これあんまり使わない*/ print $error; if($error == ''){ 処理プログラム。 } ?>
特殊文字をHTMLエンティティに変換する関数。主に一般ユーザのJavascript埋め込みを防ぐのに使われる。XSS対策。
使い方は以下。
print htmlspecialchars($hoge, ENT_QUOTES);
よく使う関数であるので毎回htmlspecialcharsと書くのはめんどくさい。 そこで関数を作ってあげて、簡単に記述させる。
function h($str){ return htmlspecialchars($str,ENT_QUOTES,"UTF-8"); }
これを指定しておけば楽に記述することができる。
GETメソッド時、数字しか処理できいないようにする。
$a = filter_input(INPUT_GET, 'aaa', FILTER_SANITIZE_NUMBER_INT);
FILTER_SANITIZE_NUMBER_INTは数字、プラス記号、マイナス記号 以外のすべての文字を取り除く。