PHPのよいところは型を宣言しなくても柔軟に対応してくれるところではありますが、中には対応してくれないものもあります。今回はそんな中で数字の入力について考えてみます。8月8日記事
目次
ID,年齢,生年月日の入力でユーザから数字を入力させるシーンはよくあります。ECサイトでフォームの入力エラーがあると、それで成約率が下がってくるそうです。そんな中で、エンドユーザから入力されたフォームをどう処理していけばよいのかを考えていきます。
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>数字チェック</title> </head> <body> <p>80より大きければ合格と表示させるプログラム<br>「全角数字で80より大きい数字」や「小数点」や「数字+文字」など色々入力してみてください。</p> <form action="confirm.php" method="post"> <dl> <dt>なにもなし</dt><dd><input type="text" name="number"></dd> <dt>数字エラー表示</dt><dd><input type="text" name="error"></dd> <dt>半角数字に変換する</dt><dd><input type="text" name="convert"></dd> <dt>INT型filter_inputを使う</dt><dd><input type="text" name="filter"></dd> </dl> <input type="submit" name="submit"> </form> </body> </html>
色々な数字や小数点等を入れてみてください。
入力された文字を色々と変換したり、フィルターしたりするプログラム。 本来、htmlspecialchars関数は使うべきですが、今回は構造を簡単にするために使っていません。ご了承ください。
<!DOCTYPE HTML> <html> <head> <meta charset="utf-8"> <title>数字チェック</title> </head> <body> <dl> <dt>1つ目:全角で80より大きい数をいれても不合格になる。</dt> <dd> <?php $number = $_POST["number"]; echo $number; if($number > 80){ echo "で合格"; }else{ echo "で不合格"; } ?> </dd> <dt>2つ目:全角で入れられたらエラーを返す</dt> <dd> <?php $error = $_POST["error"]; echo $error; //!を入れて否定を表し、正規表現でチェックする。 if (!preg_match("/^[0-9]+$/", $error)) { echo '半角数字ではありません。'; }else{ if($error > 80){ echo "で合格"; }else{ echo "で不合格"; } } ?> </dd> <dt>3つ目:変換してあげる</dt> <dd> <?php $convert = $_POST["convert"]; echo mb_convert_kana($convert, 'n'); $convert1 = mb_convert_kana($convert, 'n'); if($convert1 > 80){ echo "で合格"; }else{ echo "で不合格"; } ?> </dd> <dt>4つ目:filter_input</dt> <dd> <?php //整数にする。 $filter = filter_input(INPUT_POST,'filter',FILTER_SANITIZE_NUMBER_INT); echo $filter; if($filter > 80){ echo "で合格"; }else{ echo "で不合格"; } ?> </dd> </dl> </body> </html>
1つ目:全角で80より大きい数をいれても不合格になる。 91で不合格 2つ目:全角で入れられたらエラーを返す 91半角数字ではありません。 3つ目:変換してあげる 91で合格 4つ目:filter_input で不合格
1つ目は80より大きい数字をいれているのですが全角であるため、エラーが表示されます。4つ目は半角の数字のみ残し、整数値にするということで、全部フィルターされて、結局不合格になっていまいます。
1つ目:全角で80より大きい数をいれても不合格になる。 91点で合格 2つ目:全角で入れられたらエラーを返す 91点半角数字ではありません。 3つ目:変換してあげる 91点で合格 4つ目:filter_input 91で合格
2つ目以外は認識されています。
3つ目は点という文字列が入っていますが、評価されます。
1つ目:全角で80より大きい数をいれても不合格になる。 50.1点で不合格 2つ目:全角で入れられたらエラーを返す 50.1点半角数字ではありません。 3つ目:変換してあげる 50.1点で不合格 4つ目:filter_input 501で合格
4つ目が小数点と点がとられて501になり、合格と判定されます。
開発者が意図しない入力をされたときに、エラーを出すか、変換をしてあげるのかを考えなければなりません。
色々な方法があるので、それは次回数字入力について考える2で話していきたいと思います
以上