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(全角で「91」と入れる)

1つ目:全角で80より大きい数をいれても不合格になる。
   91で不合格 
2つ目:全角で入れられたらエラーを返す
   91半角数字ではありません。 
3つ目:変換してあげる
   91で合格 
4つ目:filter_input
   で不合格

1つ目は80より大きい数字をいれているのですが全角であるため、エラーが表示されます。4つ目は半角の数字のみ残し、整数値にするということで、全部フィルターされて、結局不合格になっていまいます。

表示2(「91点」と入れる)

1つ目:全角で80より大きい数をいれても不合格になる。
   91点で合格 
2つ目:全角で入れられたらエラーを返す
   91点半角数字ではありません。 
3つ目:変換してあげる
   91点で合格 
4つ目:filter_input
   91で合格 

2つ目以外は認識されています。 3つ目は点という文字列が入っていますが、評価されます。

表示3(「50.1点」と入力する)

1つ目:全角で80より大きい数をいれても不合格になる。
   50.1点で不合格 
2つ目:全角で入れられたらエラーを返す
   50.1点半角数字ではありません。 
3つ目:変換してあげる
   50.1点で不合格 
4つ目:filter_input
   501で合格 

4つ目が小数点と点がとられて501になり、合格と判定されます。

考察

開発者が意図しない入力をされたときに、エラーを出すか、変換をしてあげるのかを考えなければなりません。 色々な方法があるので、それは次回数字入力について考える2で話していきたいと思います

以上

最終更新:2015年08月08日 22:34