第7回 入力チェックとエラー表示(2) - PHP基礎講座

PHP基礎編

Saity先生のPHP基礎講座

Lecutures on PHP

第7回 入力チェックとエラー表示(2) (その1)

 このエントリーをはてなブックマークに追加

入力チェックの解説

  • さて、前回の宿題はどうだったかな?
  • はい。使われている言語の構造は全部知っているものばかりだったから、なんとかわかったような、わからないような。。。
  • それで十分☆そうやって考えることで、力をつけていこう。では前回のプログラムをもう一度見直して、解説を加えていくことにしようか。
<?php 

if (isset($_POST["uranai"])) {
    
    
// 全角のものを半角にする
    
$age mb_convert_kana($_POST["age"], "a""EUC-JP");

    
$error_message array();
    if (
is_numeric($age) == false) {
      
$error_message[] = "年齢は数字で教えてください!";
    } elseif (
$age || $age 120) {
      
$error_message[] = "年齢は1才から120才の範囲で入力してください!";
    }
    
    if (!
count($error_message)) {
        
$sorry_message =  
            
"ちょっとあなたの年齢は対象年齢に含まれていません・・・"
        
$uranai_message[1] =  
            
"10代のあなたには、PHPをお守り代わりに勉強するのが良いみたい。"
        
$uranai_message[2] =  
            
"20代のあなたには、趣味でPHPを使うと良いみたい。"
        
$uranai_message[3] =  
            
"30代のあなたには、ビジネススキルとしてPHPを勉強すると良いみたい。"
        
$uranai_message[4] =  
            
"40代のあなたには、PHPは新たなフロンティアとなるでしょう。"

        
$sedai floor($age 10); 

        if (isset(
$uranai_message[$sedai])) { 
          print(
$uranai_message[$sedai]); 
        } else { 
          print(
$sorry_message); 
        } 
    }
} else {
    
$age 25;
}
?>
<html>
<body>

<?php
// エラーメッセージを出力する
if (count($error_message)) {
    foreach (
$error_message as $message) {
        print(
$message);
    }
}
?>
<form action="uranai_result.php" method="post">
年齢を教えてください:
<input type="text" name="age" 
value="<?php print(htmlspecialchars($ageENT_QUOTES)); ?>" >
<input type="submit" name="uranai" value="占う!" >
</form>
</body>
</html>
  • まずはmb_convert_kana関数ですね。mb_convert_kana関数は、前回簡単に教わりましたね。
  • そうだね。mb_convert_kana関数の第2引数は変換する条件で、マニュアルに書いてあるとおり「a」は全角数字を半角数字に変換する、という指定だね。また、第3引数は文字コードを指定するのだった。ずっと前に説明したとおり、このプログラムもブラウザへの出力もEUC-JPで行われているはずなんだ。だから、引数には明示的にEUC-JPと指定しているんだよ。
  • うんうん、そうでした。それで、is_numeric関数で入力値が数値かどうかを判定してるんですね。
  • お、考えてきただけはあるね。ユキちゃんの言うとおり、is_numeric関数は引数が数字かどうかを判定する関数だ。ここでは数値ではなかった場合、$error_message変数を配列として、その中に数値ではなかった旨を伝えるエラーメッセージを入れているのさ。
  • その後のelseif のところで使われてる演算子も、この前習ったわ!ここでは、1より小さい、もしくは120より大きかった場合にはエラーメッセージを入れてるんですよね。
  • おお、すごい☆つまり、1以上120以下の数値が入力された場合だけ、エラーなしになるってことなんだ。
  • 次のcount関数のところが、何をやっているのかよくわからなかったわ。「!」マークがついているし。。。
  • count関数は、引数に指定した配列の要素がいくつあるか、の個数を返す関数だね。「!」マークは、簡単に言うと「 == false 」の省略形だと思ってほしい。つまりここは、$error_message配列のようその数をcount関数でカウントして、1つもない場合にだけif の { } のブロックの中を実行する、という判定を行っているんだ。
  • なるほど~。つまりこの判定は「エラーが無いときだけ実行」ってことなんですね!ここが前回教えてもらった「バリデーション」にあたるのかな??
  • よく覚えていたね。そう、今説明した部分の一連の流れが、入力チェックを行う「バリデーション」にあたる部分だ。で、そこを通過した場合だけ、$uranai_message配列を定義してるんだ。
  • floor関数は切り捨てをする関数だったから、小数を入力した人も強制的に整数に変換されるわけですね。
  • この関数も前にやったね。ここで、年齢が何十代か、というのを計算して、その世代用の$uranai_message配列の値が定義されていたら、占い結果を出力する、って仕組みだね。
  • ところで、$error_messageが配列になってるのは、なぜなんですか?
  • うん。これを配列にしたのは、複数のエラーメッセージを出力できるようにするためなんだ。今はチェックが1つしかないから、エラーメッセージも1つしかないけどね。
  • ふむふむ。それで、下の方でforeach構文を使ってエラーメッセージを全部表示してるのかぁ。
  • もう1つ、inputタグのvalue属性にデフォルト値をセットしている所があるね。このage変数は、初回表示時には25と、一度送信された場合はその数値を出力するようにしているよ。こうすることで、入力エラーの時も自分が何て入力したのか分かりやすいよね。
  • そういう工夫の仕方もあるんですね!
  • 1
  • 2

  



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)