PHPで <input type="text"> や <textarea> の受け取り方で最も良い方法はどのようなものでしょうか?
入門書を見ても統一されてなくてどれがベストなのかわかりません。
例えば以下のようなフォームがあったとします。
HTML
1 <form action="accept.php" method="post"> 2 3 苗字: 4 <input type="text" name="lName" size="25" maxlength="15" required> 5 6 名前: 7 <input type="text" name="fName" size="25" maxlength="15" required> 8 9 題名: 10 <input type="text" name="subject" maxlength="30" size="30"> 11 12 コメント: 13 <textarea name="comment" cols="30" rows="7" maxlength="200" required></textarea> 14 15 <input type="submit" value="送信"> 16 17</form> 18
これを受け取るPHPコードは以下です。(※CSRF対策はしていません)
PHP
1$errors = []; 2 3$space=[" ", " "]; //半角と全角スペース 4 5//苗字と名前(必須) 6if (($_POST["fName"]==="")||($_POST["lName"]==="")){ 7 $errors[] = "空です。"; 8}else { 9 $fName = $_POST["fName"]; 10 $fName = mb_substr($fName, 0, 15); 11 $fName = str_replace($space, "", $fName); 12 $fName = trim(mb_convert_kana($fName, "s", 'UTF-8')); 13 14 $lName = $_POST["lName"]; 15 $lName = mb_substr($lName, 0, 15); 16 $lName = str_replace($space, "", $lName); 17 $lName = trim(mb_convert_kana($lName, "s", 'UTF-8')); 18} 19 20//題名 21if (isset($_POST["subject"])){ 22 $subject = $_POST["subject"]; 23 $sybject = trim(mb_convert_kana($subject, "s", 'UTF-8')); 24 $subject = strip_tags($subject); 25 $subject = mb_substr($subject, 0, 30); 26} else { 27 $subject = ""; 28} 29 30//コメント(必須) 31if (isset($_POST["comment"])){ 32 $comment = $_POST["comment"]; 33 $comment = trim(mb_convert_kana($comment, "s", 'UTF-8')); 34 $comment = strip_tags($comment); 35 $comment = mb_substr($comment, 0, 200); 36} else { 37 $comment = ""; 38 $errors[] = "空です。"; 39} 40
一応、出力のコードも記載します。
PHP
1//エラーがあったとき 2if (count($errors) > 0){ 3 foreach ($errors as $value) { 4 echo $value; 5 } 6 exit(); 7}else { 8 //h()はHTMLエスケープ関数 9 echo h($fName); 10 echo h($lName); 11 echo h($subject); 12 echo h($comment); 13}
入力値チェックの後にやっていることはほとんど同じですが、
題名subject(必須でない)については、変数がセットされてない、又はそれがNULLであれば空文字に置き換えるという処理をしています。入力値がNULLになるときはあるのかわかりませんが...
入門書を読むと、フォーム値の受け取りで if($_POST["fName"]==="")のように空でないかチェックしていたり、issetやemptyを使っていたりします。
安全面も考慮すると、初めの入力値チェックはどのように行うのがよいのでしょうか?if else の構成はどのようにすべきですか?また必須項目でなくてもNULLはエラー対象にするべきでしょうか?
入力値チェックの後、文字数制限をしてスペースを取り除いてよい場合は上記の方法で問題ないでしょうか?
ご回答よろしくお願いします。
回答2件
あなたの回答
tips
プレビュー