スポンサードリンク

PHP フォームに入力された値をチェックする方法。

前回までに作ったPHPの計算プログラムは、テキストボックスに入力された値をチェックしていませんでした。そのため「未入力」や「不適切な値」の場合は、計算結果がおかしくなったり、エラーの原因になります。

php-97.gif

ユーザーがいつも適切な値を入力してくれるとは限りませんので、チェックが大切になります。値をチェックする方法はいくつかあります。

1.サーバーのPHP側で入力チェックする方法
2.サーバーのPHPに送る前に、クライアントのブラウザで入力チェックする方法
(ブラウザでは JavaScript などの言語を使って行います)

まずは 1 の方法で入力チェックする方法から解説します。


【1】sample010 フォルダをコピーして sample011 フォルダを作成します。

php-83.gif


【2】calc.html の変更はありません。 calc.php だけ変更します。

php-84.gif

*「\」はWindowsではエンマークのことです。

保存先 C:\phpdev\www\test\sample011
ファイル名 calc.html

<html>
  <head>
    <title>calc.html</title>
  </head>
  <body>
    <form name="form1" action="calc.php" method="post">
      <input type = "text" name = "txtA"> 

      <select name="selOpe" size=1>
        <option value = "+">+</option>
        <option value = "−">−</option>
        <option value = "×">×</option>
        <option value = "÷">÷</option>
      </select> 

      <input type = "text" name = "txtB"> = ? 
      <br>
      <input type = "submit" value = "計算">
      <input type = "reset" value = "クリア">
    </form>
  </body>
</html>


保存先 C:\phpdev\www\test\sample011
ファイル名 calc.php

<?php
  //値を取得
  $a = $_POST['txtA'];
  $b = $_POST['txtB'];
  $ope = $_POST['selOpe'];

  dataCheck($a,"txtA");
  dataCheck($b,"txtB");

  //セレクトボックスによって処理を変える
  switch ($ope) {
    case "+":
      $answer = $a + $b;
      break;
    case "−":
      $answer = $a - $b;
      break;
    case "×":
      $answer = $a * $b;
      break;
    case "÷":
      $answer = $a / $b;
      break;
    default:
      break;
  }

  function dataCheck($str,$name){
    if(strlen($str) == 0 || ereg("[^0-9]",$str)){
      print("<html><head><title>入力エラー</title></head><body>");
      print($name." は半角数字を入力してください。<br /><br />\n");
      print("<a href=\"#\" onClick=\"history.back(); return false;\">再入力</a>\n");
      print("</body></html>");
      exit;
    }
  }

?>


<html>
  <head>
    <title>calc.php</title>
  </head>
  <body>
    <?php
      //計算結果を表示
      print ($a." ".$ope." ".$b." = ".$answer."\n");
    ?>
    <br />
    <br />
    <a href="#" onclick="history.back(); return false;">前の画面へ戻る</a>
  </body>
</html>



*上記のプログラムはページの都合上、インデント(字下げ)が半角スペース2つになっていますが、実際には半角スペース4つにするのが好ましいです。インデントはプログラムの動作には影響しません。


【3】C:\phpdev にある 2K-NT-XP-phpdev_start.bat をダブルクリックして、phpdev を起動します。

php-02.gif

準備ができたら作成したPHPプログラムを実行してみましょう。


【4】ブラウザのアドレスに http://localhost/test/sample011/calc.html と入力し、実行します。


【5】calc.html の画面が表示されました。

php-85.gif


【6】テキストボックスに何も入力しないで、そのまま「計算」ボタンをクリックします。

php-86.gif


【7】calc.php が表示され、メッセージが表示されました。

php-87.gif


【8】ソースを表示してみましょう。

php-89.gif


【9】ちゃんと入力エラー時のHTMLになっています。

php-90.gif


【10】「再入力」リンクをクリックします。

php-88.gif


【11】テキストボックスにわざと文字の「a」を入力します。

php-91.gif


【12】メッセージが表示されました。

php-92.gif


【13】「再入力」リンクをクリックします。

php-93.gif


【14】今度は正しくテキストボックスに半角数字を入力し、「計算」ボタンをクリックします。

php-94.gif


【15】1つ目のテキストボックスはOKですが、2つ目の値が不適切なのでメッセージが表示されます。

php-95.gif


【16】2つのテキストボックスの値が適切なら、計算結果が表示されます。

php-96.gif


【17】値やセレクトボックスをいろいろ変えて、動作を確認してください。


【解説】

今回 calc.html側の変更はありません。


■calc.php側

(1)PHPとHTMLを分離しました。PHPの処理を最初にまとめて、計算結果だけHTMLの中に出力しています。


(2)ユーザー定義関数を呼び出している部分です。この関数は受け取った値が適切かどうかチェックします。引数はテキストボックスの値と、入力エラー時に出力するための名前です。

dataCheck($a,"txtA");
dataCheck($b,"txtB");


(3)ユーザー定義関数の書き方

function 関数名(引数,引数){
  処理;
  return;
}

*返り値(以降は戻り値とします)がなければ、 return は省略できます。


(4)データのチェックは何度も使いますので、ユーザー定義関数としました。

function dataCheck($str,$name){
  if(strlen($str) == 0 || ereg("[^0-9]",$str)){
    print("<html><head><title>入力エラー</title></head><body>");
    print($name." は半角数字を入力してください。<br /><br />\n");
    print("<a href=\"#\" onClick=\"history.back(); return false;\">再入力</a>\n");
    print("</body></html>");
    exit;
  }
}

・渡された引数をもとにif文で処理を分けています。
if(strlen($str) == 0 || ereg("[^0-9]",$str)){

もし $str($aや$b)が0文字 または 半角数字以外が入力されていたら、
メッセージとリンクを表示して終了します。

終了するのでそれ以降のプログラムやHTMLは出力されません。そのため最低限のHTMLはメッセージとリンクの前後に出力しています。


(5)正規表現
[^0-9] の部分は正規表現です。正規表現は強力で文字列を扱うときに威力を発揮します。マッチングや置換など、正規表現だけで1冊の本になるほどです。このPHP講座では必要に応じて少しずつ解説します。

ereg()はPHPでマッチングを行うときに使う関数で、以下の例では $str の変数に、数字以外が1文字でも使われていたらマッチします。

ereg("[^0-9]",$str)
例 123a456


【ワンポイント】
if(strlen($str) == 0 || ereg("[^0-9]",$str)){
のかわりに
if(intval($str)==0){
を使うこともできますが、上記のほうが細かい設定が可能です。

intval()関数は引数を整数にして返します。成功時は整数、失敗時は 0です。


スポンサードリンク






PHP初心者入門講座TOPへ