WebアプリケーションのためのPHP

第3章 インタラクティブなWebページ

前へ | 目次へ |次へ  | YCポータルサイト

 

3.1 HTMLフォームによるデータの送信

■HTMLフォーム

 クライアントのブラウザに表示されているWebページからデータを入力して、Webサーバにデータを送信することができます。このとき、HTMLの<form>タグを使います。<form>タグを使ったデータの入力様式をHTMLフォームといいます。HTMLフォームにはたとえば次のようなコントロールがあります。

・テキスト      1行の文字列を入力します
・ラジオボタン    複数の項目のうちの一つをオンにします
・チェックボックス  複数の項目のなかの任意の項目をオンにします
・テキストエリア   複数行の文字列を入力します
・選択メニュー   複数の一覧メニューから一つを選択します
・隠し項目     Webページには表示しないで、値のみをWebサーバに送信します、
・送信ボタン    HTMLフォームのデータをWebサーバに送信します

 各コントロールにはフィールド名をつけて識別します。

■メソッド

 HTMLフォームは<form>タグで始まり、</form>タグで終わります。<form>タグでは、WebページからWebサーバに向けてどのような方法でデータを送信するのか送信方法を指定する必要があります。これをメソッドといいます。メソッドにはGETメソッドとPOSTメソッドがあります。

 また、Webサーバに送信したデータをどのPHPファイルに引き継ぐのかも指定する必要があります。これにはACTION属性を使います。

■GETメソッド

 GETメソッドを使う場合、次のように記述します。

<form method="get" action="file.php">

 つまり、これから記述するHTMLフォームのデータは送信ボタンがおされたときに、GETメソッドを用いて”file.php”というPHPファイルに引き継ぎなさいという意味になります。GETメソッドの場合、引き継がれるデータはURLに付加された形でWebサーバに送信され、次のPHPファイルに渡されます。たとえば、

URL http://www.abc.com/apl/file2.php?menu=main&id=12

の場合は、次に実行されるPHPファイルは"www.abc.com"というWebサーバの"/apl/file2.php"というPHPファイルで、引き継ぐデータはmenuという変数の値が"main"で、idという変数の値が12ということになります。

 GETメソッドで受信されたフォーム内のコントロールのデータをPHPで参照するには、次の書式とします。

$_GET["フィールド名"]

【注意】$_GET( )でなく、$GET_[ ]です。

■POSTメソッド

POSTメソッドを使う場合、次のように記述します。

<form method="post" action="file.php">

 つまり、これから記述するHTMLフォームのデータは送信ボタンがおされたときに、POSTメソッドを用いて”file.php”というPHPファイルに引き継ぎなさいという意味になります。POSTメソッドの場合、引き継がれるデータは標準入出力によりWebサーバに送信され、次のPHPファイルに渡されます。

 POSTメソッドで受信されたフォーム内のコントロールのデータをPHPで参照するには、次の書式とします。

$_POST["フィールド名"]

【注意】$_POST( )でなく、$POST_[ ]です。

■テキスト

リスト3.1.1のPHPファイルform.phpは1行のテキストを入力するHTMLフォームをWebページに表示するためのPHPファイルです。

<input name="data" size=20>

は、テキスト入力コントロールを表示するためのHTMLタグで、type="text"が省略されています。nameは入力されたデータを格納するフィールド名です。sizeはテキスト入力コントロールの長さを半角文字数で示します。

<input type="submit" value=" OK ">

は、送信ボタンを表示するためのHTMLタグです。ボタンにはvalueの値が表示されます。

リスト3.1.1 form_text.php

<html>
<head>
<title>form_text.php</title>
<!-- form:テキスト -->
</head>
<body>
<form action="form_text2.php" method="post">
  入力:<input name="data" size=20>
  <input type="submit" value=" OK ">
</form>
</body>
</html>

 リスト3.1.1のfrom_text.phpファイルにアクセスすると、次のWebページが表示されます。

 

 リスト3.1.1のPHPファイルでは、「OK」ボタンがクリックされると、次にform_text2.phpファイルを起動するようになっています。リスト3.1.2はそのform_text2.phpファイルのリストです。

リスト3.1.2 form_text2.php

<html>
<head>
<title>form_text2.php</title>
<!-- form:テキストデータの受信 -->
</head>
<body>
<?php
 print "入力データは[";
 print $_POST["data"];      // POSTメソッドでのフォームデータの受信
 print "]です。<br>";
?>
</body>
</html>

$_POST["data"]

は、HTMLフォームの中のフィールド名「data」の値をPOSTメソッドで取得(受信)するための文です。ここでは、受信したデータをそのままWebページに表示するようにしています。

 テキスト入力コントロールに次図のように文字を記述します。

「OK」ボタンをクリックすると、リスト3.1.2のform_text2.phpファイルが起動され、form_text2.phpファイルは次図のWebページを生成します。

 なお、form.text2.phpファイルは、リスト3.1..3のform.text2a.phpファイルのようにあるいはリスト3.1.4のform.text2b.phpファイルのように記述することもできます。

リスト3.1.3 form_text2a.php

<html>
<head>
<title>form_text2a.php</title>
<!-- form:テキストデータの受信 -->
</head>
<body>
入力データは[<?php print $_POST["data"];?>]です。
</body>
</html>

リスト3.1.4 form_text2b.php

<html>
<head>
<title>form_text2b.php</title>
<!-- form:テキストデータの受信 -->
</head>
<body>
入力データは[<?=$_POST["data"];?>]です。
</body>
</html>

■ラジオボタン

 リスト3.1.5のform_radio.phpファイルは、ラジオボタンを表示するためのPHPファイルの例です。次に起動するファイルとしては、前と同じform_text2.phpファイルを使用しています。

 同じnameをもつinputタグで一つのグループを作り、その内の一つが排他的に選択されます。

<input="radio" name="data" VALUE="男">1.男

リスト3.1.5 form_radio.php

<html>
<head>
<title>form_radio.php</title>
<!-- form:ラジオボタン -->
</head>
<body>
<form action="form_text2.php" method="post">
  入力:<br>
  <input type="radio" name="data" value="男">1、男
  <input type="radio" name="data" value="女">2、女

  <input type="submit" value=" OK ">
</form>
</body>
</html>

 リスト3.1.5のform_radio.phpファイルにアクセスすると、次図のWebページが表示されます。

 たとえば、次図のように「1.男」のラジオボタンをオンにして、「OK」ボタンをクリックします。

 

 すると次図のWebページが表示され、フィールド名「data」には、「男」が代入されていることがわかります。

 選択された項目の値を文字列でなく、数値にする場合は、リスト3.1.6のように記述します。

リスト3.1.6 form_radio2.php

<html>
<head>
<title>form_radio2.php</title>
<!-- form:ラジオボタン -->
</head>
<body>
<form action="form_text2.php" method="post">
  入力:<br>
  <input type="radio" name="data" value="1">1、男
  <input type="radio" name="data" value="2">2、女

  <input type="submit" value=" OK ">
</form>
</body>
</html>

 結果は次図のようになります。

■チェックボックス

 リスト3.1.7のform_check.phpファイルは、チェックボックスを表示するためのPHPファイルの例です。次に起動するファイルとしては、form_check2.phpファイルを使用しています。

 チェックボックスのコントロールの書式は次のようにします。

<input type="checkbox" name="arr_data[0]" value="1">1、Windows

 typeは"checkbox"で、nameは"arr_data[0]"のように配列形式にします。

リスト3.1.7 form_check.php

<html>
<head>
<title>form_check.php</title>
<!-- form:チェックボックス -->
</head>
<body>
<form action="form_check2.php" method="post">
使用中のOSを選択してください(複数可能)。<br>
<input type="checkbox" name="arr_data[0]" value="1">1、Windows
<input type="checkbox" name="arr_data[1]" value="2">2、UNIX
<input type="checkbox" name="arr_data[2]" value="3">3、LINUX

  <br>
<input type="submit" value=" OK ">
</form>
</body>
</html>

 アクセスした結果、次のように表示されます。

 PHPファイルで受信する場合は次のように記述します。受信して代入する変数も配列型となります。

$arr_data = $_POST["arr_data"];

 具体的には、以下のように代入されます。

$arr_data[0] = $_POST["arr_data"][0];
$arr_data[1] = $_POST["arr_data"][1];
$arr_data[2] = $_POST["arr_data"][2];

 リスト3.1.8にform_check2.phpファイルを示します。

リスト3.1.8 form_check2.php

html>
<head>
<title>form_check2.php</title>
<!-- form:チェックボックスデータの受信 -->
</head>
<body>
<?php
 $arr_data = $_POST["arr_data"];      /* POSTメソッドでの
                       フォームデータの受信。
                       配列型のデータとなる。 */
 print "入力データは以下です。<br>";
 foreach ( $arr_data as $key => $val ) {
   print "[$key]=$val<br>";
 }
?>
</body>
</html>

 たとえば、次図のように、1番目と3番目のチェックボックスをチェックして「OK」ボタンをクリックします。

 すると次図のようにWebページが表示され、配列$arr_data[]の1番目と3番目にデータが入っていることがわかります。

■テキストエリア

 リスト3.1.9のform_textarea.phpファイルは、テキストエリアを表示するためのPHPファイルの例です。次に起動するファイルとしては、form_textarea2.phpファイルを使用しています。

 テキストエリアのコントロールを記述するHTMLタグの書式はたとえば次の通りです。

<textarea name="data" rows="5" cols="40"></textarea>

 <input>タグでなく<textarea>タグを使用します。「rows」属性でテキストエリアの行数を「cols」属性で文字数(半角換算)を設定します。最後に</textarea>タグが必要です。なお、下記のように

<textarea name="data" rows="5" cols="40">文字列</textarea>

<textarea>タグと</textarea>タグの間に文字列を記述すると、テキストエリアに初期値として表示されます。

リスト3.1.9 form_textarea.php

<html>
<head>
<title>form_textarea.php</title>
<!-- form:テキストエリア -->
</head>
<body>
<form action="form_textarea2.php" method="post">
入力:<br>
<textarea name="data" rows="5" cols="40"></textarea>
<br>

<input type="submit" value=" OK ">
</form>
</body>
</html>

 テキストエリアに受信データを表示するために、次のように記述します。

<textarea name="data" rows="5" cols="40"><?=$_POST["data"]?></textarea>

 <?=$_POST["data"]?>の部分はPHPのスクリプトで、<?php print $_POST["data"]; ?>と同義です。つまりブラウザにPOSTメソッドで受信したデータを折り返し出力しています。この出力された文字列は、テキストエリア内に表示されます。リスト3.1.10にサンプルファイルを示します。

リスト3.1.10 form_textarea2.php

<html>
<head>
<title>form_textarea2.php</title>
<!-- form:テキストエリアデータの受信 -->
</head>
<body>
<form action="form_textarea2.php" method="post">
入力データは以下です。<br>
<textarea name="data" rows="5" cols="40"><?=$_POST["data"]?></textarea>
<br>
<input type="submit" value=" OK ">
</form>
</body>
</html>

 リスト3.1.10のform_textarea.phpにアクセスすると、次図のWebページが表示されます。

 たとえば、次図のように記入して、「OK」ボタンをクリックします。

 サーバ側では、form_textarea2.phpファイルが起動され、入力したテキストエリア内の文字列がテキストエリアに表示されます。

■選択メニュー

 リスト3.1.11のform_menu.phpファイルは、選択メニューを表示するためのPHPファイルの例です。次に起動するファイルとして、form2.phpファイルを使用しています。

 選択メニューのコントロールの書式は、たとえば以下のようにします。

  <select name="data">
    <option value="1">PHP</option>
    <option value="2">Perl</option>
    <option value="3">C++</option>
  </select>

 まず、<select>タグでフィールド名を定義します。次に<option>タグで選択肢を順次定義します。最後は</select>タグで閉じます。

リスト3.1.11 form_menu.php

<html>
<head>
<title>form_menu.php</title>
<!-- form:選択メニュー -->
</head>
<body>
<form action="form_text2.php" method="post">
  選択してください:<br>
  <select name="data">
    <option value="1">PHP</option>
    <option value="2">Perl</option>
    <option value="3">C++</option>
  </select>

  <input type="submit" value=" OK ">
</form>
</body>
</html>

 リスト3.1.11のform_menu.phpファイルにアクセスします。下向き矢印をクリックすると、プルダウン形式で選択肢(メニュー)が表示されます。

 選択肢の中のいずれかを選択し、OKボタンをクリックします。

 すると、サーバ側では、form_text.phpが起動され、次図のWebページが表示されます。つまり「1」番目の選択肢が選択されたことが確認されます。

■選択メニュー(複数選択可能)

 選択メニューは、同時に複数選択可能な形式もあります。リスト3.1.12のform_menu2.phpファイルは、複数選択型の選択メニューを表示するためのPHPファイルの例です。次に起動するファイルはform_menu2a.phpです。

 複数選択型の選択メニューコントロールの記述例を次に示します。

<select name="data[]" multiple size="3">

 受信するデータは配列型とするので、<select>タグ内のname属性に設定するフィールド名は"data[]"のように、変数名の後に「[]」をつけます。また、multiple属性を記入します。複数選択型メニューの場合、メニューはドロップダウン形式ではなくリスト表示となります。リストの行数をsize属性で指定します。

リスト3.1.12 form_menu2.php

<html>
<head>
<title>form_menu2.php</title>
<!-- form:複数選択型選択メニュー -->
</head>
<body>
<form action="form_menu2a.php" method="post">
  選択してください(複数可能):<br>
  <select name="data[]" multiple size="3"> <!-- multipleを記述 -->
    <option value="1">PHP</option>
    <option value="2">Perl</option>
    <option value="3">C++</option>
  </select>
  <input type="submit" value=" OK ">
</form>
</body>
</html>

 リスト3.1.12では、OKボタンをクリックすると、form_menu2a.phpファイルが起動します。リスト3.1.13はform_menu2a.phpファイルです。

リスト3.1.13 form_menu2a.php

<html>
<head>
<title>form_menu2a.php</title>
<!-- form:複数選択メニューの受信 -->
</head>
<body>
<?php
  $arr_data = $_POST["data"];   /* POSTメソッドでの
                    フォームデータの受信。
                    配列型のデータとなる。 */
  print "入力データは以下です。<br>";
  foreach ( $arr_data as $key => $val )
  {
    print "[$key]=$val<br>";
  }
?>
</body>
</html>

 リスト3.1.12のform_menu2.phpにアクセスすると、次図のWebページが表示されます。

 Ctrlキーを押しながらたとえば1番目と3番目のメニューを選択し、「OK」ボタンをクリックします。

 次図のWebページが表示され、配列に選択した「1」と「3」が格納されたことがわかります。

■パスワード

 リスト3.1.14のform_password.phpファイルは、パスワードコントロールをWebページに表示するためのPHPファイルの例です。次に起動するファイルをform_password2.phpとしています。

パスワードコントロールの書式を次に示します。

<input type="password" name="user_passwd" size=20>

type属性に"password"と記述します。あとは、テキストコントロールと同じです。

リスト3.1.14 form_password.php

<html>
<head>
<title>form_password.php</title>
<!-- form:パスワード -->
</head>
<body>
 <form action="form_password2.php" method="post">
   ユーザ名 :
   <input type="text" name="user_name" size=20><br>
   パスワード:
   <input type="password" name="user_passwd" size=20><br>
   <input type="submit" value=" OK ">
 </form>
</body>
</html>

 リスト3.1.15はform_password2.phpファイルです。

リスト3.1.15 form_password2.php

<html>
<head>
<title>form_password2.php</title>
<!-- form:パスワードデータの受信 -->
</head>
<body>
  ユーザ名 は[<?=$_POST["user_name"];?>]です<br>
  パスワードは[<?=$_POST["user_passwd"];?>]です。
</body>
</html>

 リスト3.1.14のform_password.phpファイルにアクセスすると、次図のようなWebページが表示されます。

 たとえば、ユーザ名欄に"yamada"と入力し、パスワード欄に"password"とパスワードを入力すると、次図のようにパスワード欄に入力した文字のかわりに「*」が表示され、パスワードが表示されないようになります。

 「OK」ボタンをクリックすると、次図が表示され、リスト3.1.14のform_password2.phpファイルにパスワード等が送信されたことがわかります。

■ボタン

 ボタンはクリックしたときに、特定の処理を行うようにするコントロールです。主なものに送信ボタンとリセットボタンがあります。

 送信ボタンは、フォームに入力されたデータを送信するためのコントロールです。送信ボタンの書式は次のいずれかです。

<button type="submit">OK</button>
あるいは
<input type="submit" value="OK">

 リセットボタンはフォームの内容を初期値に戻すためのコントロールです。リセットボタンの書式は次のいずれかです。

<button type="reset">リセット</button>
あるいは
<input type="reset" value="リセット">

 サンプルをリスト3.1.16に示します。

リスト3.1.16 form_button.php

<html>
<head>
<title>form_button.php</title>
<!-- form:ボタン -->
</head>
<body>
 <form action="form_text2.php" method="post">
   入力:<br>
   <input type="text" name="data" size=20>
   <input type="reset" value="reset"><br>  <!-- リセットボタン -->
   <input type="submit" value=" OK ">     <!-- 送信ボタン -->
 </form>
</body>
</html>

 リスト3.1.16のform_button.phpファイルにアクセスすると、次図のようなWebページが表示されます。

 次図のように間違えて記入したような場合に、「reset」ボタンをクリックすると、上図の初期状態に戻ります。

■隠しコントロール

 「送信ボタン」によってフォームに入力したデータが、action属性で指定されたPHPファイルに送信されますが、フォームに入力したデータ以外のデータも送信することができます。その場合には隠しコントロールを使います。

 リスト3.1.17は隠しコントロールを使用したPHPファイルの例です。次に起動されるファイルはform_hidden2.phpファイルとしています。

 隠しコントロールの書式を次に示します。

<input type="hidden" name="access_date" value="<?=$str_date?>">

 <input>タグでtype属性を"hidden"にします。そして、value属性を値か変数に設定します。ここではPHPスクリプトでの変数$str_dateを設定しています。

リスト3.1.17 form_hidden.php

<html>
<head>
<title>form_hidden.php</title>
<!-- form:隠しコントロール -->
</head>
<body>
 <form action="form_hidden2.php" method="post">
   入力:<br>
   <input type="text" name="data" size="20">
   <?php $str_date = date("Y-m-d"); ?>   <!-- date関数の呼び出し -->
   <input type="hidden" name="access_date" value="<?=$str_date?>">
                       <!-- 隠しコントロール -->
   <input type="submit" value=" OK ">
 </form>
</body>
</html>

 リスト3.1.18にform_hidden2.phpファイルを示します。

リスト3.1.18 form_hidden2.php

<html>
<head>
<title>form_hidden2.php</title>
<!-- form:隠しコントロールの受信 -->
</head>
<body>
 入力は[<?=$_POST["data"]?>]です<br>
 隠しコントロールは[<?=$_POST["access_date"]?>]です。
</body>
</html>

  リスト3.118のform_hidden.phpファイルにアクセスすると、次図ののWebページが表示されます。隠れコントロールのデータはWebページ上には表示されません。

  文字を入力し、「OK」ボタンをクリックします。

 次図のように入力データが表示されます。また、隠しコントロールでサーバに送信したデータも正常に受信され、表示されていることが確認できます。

 

3.2 URLによるデータの送受信

■GETメソッド

 3.1項では、HTMLフォームに入力されたデータをWebサーバのPHPファイルに送信する方法としてPOSTメソッドを使いました。別の方法としてGETメソッドがあることは先に述べました。ここでは、GETメソッドによるデータの送受信方法について述べます。

 次のリストのform_text_get.phpは、リスト3.1.1のform_txt.phpファイルのmethod="post"をmethod="get"に置き換えたものです。次に起動するファイルはform_text_get2.phpとしています。

リスト3.2.1 form_text_get.php

<html>
<head>
<title>form_text_get.php</title>
<!-- form:テキスト(GETメソッド) -->
</head>
<body>
 <form action="form_text_get2.php" method="get"> <!-- GETメソッド -->
   入力:<input name="data" size=20>
   <input type="submit" value=" OK ">
 </form>
</body>
</html>

 以下にリスト form_text_get2.phpを示します。

リスト3.2.2 form_text_get2.php

<html>
<head>
<title>form_text_get2.php</title>
<!-- form:テキストデータの受信(GETメソッド) -->
</head>
<body>
<?php
 print "入力データは[";
 print $_GET["data"];      // GETメソッドでのフォームデータの受信
 print "]です。<br>";
?>
</body>
</html>

 form_text_get.phpファイルにアクセスし、入力コントロールに「hello」と入力し、「OK」ボタンをクリックします。

 下図のようにform_text_get2.phpファイルが起動されます。

 このとき、URLで以下のようにGETメソッドによるコントロールデータの送信がおこなわれているのが確認できます。

http://----/form_text_get2.php?data=hello

 「?」が後続の文字列がGETメソッドによる送信データであることを示しています。「data」は最初の変数名です。「=」はその直後がその変数の値であることを示してます。「hello」は値です。つまり、変数「data」の値は「hello」であることをform_text_get.phpファイルからform_text_get2.phpファイルに向けて送信しています。

■GETメソッドでの送信データが2バイト文字の場合

 別の例として、送信データが2バイト文字の例を示します。

 form_text_get.phpファイルにアクセスし、入力コントロールに「今日は」と入力し、「OK」ボタンをクリックします。

 下図のようにform_text_get2.phpファイルが起動されます。

 URLで以下のようにGETメソッドによるコントロールデータの送信がおこなわれているのが確認できます。ただし、この場合は値の文字列は自動的にURLエンコードされています。つまり、2バイト文字は「%XX」形式に置き換えられています。

http://----/form_text_get2.php?data=%8D%A1%93%FA%82%CD

■GETメソッドで送信するデータが2個の場合

 送信するデータが2個の場合の例を次のリストform_text_get_b.phpに示します。

リスト3.2.3 form_text_get_b.php

<html>
<head>
<title>form_text_get_b.php</title>
<!-- form:テキスト(GETメソッド、2個のデータ) -->
</head>
<body>
<form action="form_text_get2_b.php" method="get"><!-- GETメソッド -->
  入力1:<input name="data1" size=20>     <!-- 第1のデータ -->
  <br>
  入力2:<input name="data2" size=20>     <!-- 第2のデータ -->
  <input type="submit" value=" OK ">
</form>
</body>
</html>

 起動されるファイルは次のリストform_text_get2_b.phpです。

リスト3.2.4 form_text_get2_b.php

<html>
<head>
<title>form_text_get2_b.php</title>
<!-- form:テキストデータの受信(GETメソッド、2個のデータ) -->
</head>
<body>
<?php
 print "入力データ1は[";
 print $_GET["data1"];           // 第1のデータの受信
 print "]です。<br>";
 print "入力データ2は[";
 print $_GET["data2"];           // 第2のデータの受信
 print "]です。<br>";?>
</body>
</html>

 form_text_get_b.phpファイルにアクセスし、入力1コントロールに「hello」と入力し、入力2コントロールに「Yamada」と入力し「OK」ボタンをクリックします。

 下図のようにform_text_get2_b.phpファイルが起動されます。

 URLのGETメソッドによる送信データ部分は以下のようになっています。

http://----/form_text_get2_b.php?data1=hello&data2=Yamada

 ここで、「&」は、データが複数ある場合のデータ間の区切りの記号です。

■リンクによるデータの送受信

 ハイパーリンクによりデータを送信することもできます。リスト url_get.phpに例を示します。その場合の<a>タグの書式は次のようになります。

<a href="form_text_get2.php?data=hello">リンク</a>

リスト3.2.5 url_get.php

<html>
<head>
<title>url_get.php</title>
<!-- リンクによるデータの送受信 -->
</head>
<body>
 <a href="form_text_get2.php?data=hello">リンク</a>
</body>
</html>

 url_get.phpファイルにアクセスしハイパーリンクとなっている「リンク」の文字列をクリックします。

 次の図のようにURLに送信データを付加したGETメソッドによりデータが送信されていることがわかります。

 なお、送信する変数名や値に2バイト文字等が含まれる可能性がある場合は、強制的にurlencode関数でURLエンコードしておく必要があります。

 サンプルをリスト url_get_encode_encode.phpに示します。

リスト3.2.6 url_get_encode.php

<html>
<head>
<title>url_get_encode.php</title>
<!-- リンクによるデータの送受信 -->
</head>
<body>
<?php
 $url = "form_text_get2.php?data=" . urlencode("今日は");
                   // urlencode関数の呼び出し
?>
<a href="<?= $url ?>">リンク</a>
</body>
</html>

 url_get_encode.phpファイルにアクセスし、ハイパーリンクをクリックすると、

 次図のWebページが表示され、送信データの2バイト文字が正しく表示されています。

 

3.3 HTMLフォームを使ったデータの再表示

 HTMLフォームの入力データに誤りなどがあった場合は、前に入力した値を確認のため再表示し、再入力を求める場合があります。その場合は、各コントロールに前に入力した値を初期値として設定します。

 以下のサンプルでは、「OK」ボタンをクリックすると、再度自分自身のWebページ(PHPファイル)を表示することとします。その場合は、action=""とします。

■テキスト

 テキストコントロールの場合の初期値の設定例をリストform_text_r.phpに示します。次の書式でvalue属性に初期値を設定します。POSTメソッドで受信した値をそのまま初期値としています。

<input name="data" size=20 value="<?= $_POST['data'] ?>">

リスト3.3.1 form_text_r.php

<html>
<head>
<title>form_text_r.php</title>
<!-- form:テキスト -->
</head>
<body>
<?php
 if ( $_POST['data'] =="" )
 {
   print "データが入力されていません<br>";
 }
 else
 {
   print "以下のデータが入力されました<br>";
 }
?>
<form action="" method="post">
  入力:<input name="data" size=20 value="<?= $_POST['data'] ?>">
                       <!-- 初期値の設定 -->
  <input type="submit" value=" OK ">
</form>
</body>
</html>

 form_text_r.phpに初めてアクセスすると次図のようなWebページが表示されます。

 次図のように文字列を入力し、「OK」ボタンをクリックします。

 次図のように再表示されます。前に入力した値が、初期値として表示されます。

■ラジオボタン

 ラジオボタンコントロールの場合の初期値の設定例をリスト3.3.2 form_radio_r.phpに示します。次の書式でchecked属性を設定します。

<input type="radio" name="data" value="男" <?= $val?>>1、男

オンになっていれば、$val="checked"で、ブラウザには次のように送信されます。

<input type="radio" name="data" value="男" checked>1、男

オフになっていなければ、$val=""で、ブラウザには次のように送信されます。

<input type="radio" name="data" value="男" >1、男

リスト3.3.2 form_radio_r.php

<html>
<head>
<title>form_radio_r.php</title>
<!-- form:ラジオボタン -->
</head>
<body>
<?php
 if ( $_POST['data'] =="" )
 {
   print "データが入力されていません<br>";
 }
 else
 {
   print "以下のデータが入力されました<br>";
 }
?>
<form action="" method="post">
  <?php ( $_POST["data"] == "男" ) ? $val = "checked" : $val = "" ; ?>
              <!-- 3項演算子による初期値の設定 -->
  <input type="radio" name="data" value="男" <?= $val?>>1、男
  <br>
  <?php ( $_POST["data"] == "女" ) ? $val = "checked" : $val = "" ; ?>
  <input type="radio" name="data" value="女" <?= $val?>>2、女
  <br>
  <input type="submit" value=" OK ">
</form>
</body>
</html>

 form_radio_r.phpに初めてアクセスすると次図のようなWebページが表示されます。

 次図のようにオンにし、「OK」ボタンをクリックします。

 次図のように再表示されます。前に入力した値が、初期値として表示されます。

■チェックボックス

 チェックボックスコントロールの場合の初期値の設定例をリスト3.3.3 form_check_r.phpに示します。次の書式でchecked属性を設定します。

<input type="checkbox" name="data[0]" value="1" <?= $val?>>1、Windows

 チェックされていれば、$val="checked"で、ブラウザには次のように送信されます。

<input type="checkbox" name="data[0]" value="1" checked>1、Windows

 チェックされていなければ、$val=""で、ブラウザには次のように送信されます。

<input type="checkbox" name="data[0]" value="1" >1、Windows

リスト3.3.3 form_check_r.php

<head>
<title>form_check_r.php</title>
<!-- form:チェックボックスの再表示 -->
</head>
<body>
<?php
 if ( $_POST['data'][0] . $_POST['data'][1] . $_POST['data'][2] =="" )
 {
   print "データが入力されていません<br>";
 }
 else
 {
   print "以下のデータが入力されました<br>";
 }
?>
<form action="" method="post">
 使用中のOSを選択してください(複数可能)。<br>
 <?php ( $_POST["data"][0] == "1" ) ? $val = "checked" : $val = "" ; ?>
                 <!-- 3項演算子による初期値の設定 -->
 <input type="checkbox" name="data[0]" value="1" <?= $val?>>1、Windows
 <?php ( $_POST["data"][1] == "2" ) ? $val = "checked" : $val = "" ; ?>
 <input type="checkbox" name="data[1]" value="2" <?= $val?>>2、UNIX
 <?php ( $_POST["data"][2] == "3" ) ? $val = "checked" : $val = "" ; ?>
 <input type="checkbox" name="data[2]" value="3" <?= $val?>>3、LINUX
 <br>
 <input type="submit" value=" OK ">
</form>
</body>
</html>

 form_check_r.phpに初めてアクセスすると次図のようなWebページが表示されます。

 次図のようにチェックし、「OK」ボタンをクリックします。

 次図のように再表示されます。前に入力した値が、初期値として表示されます。

■テキストエリア

 テキストエリアコントロールの場合の初期値の設定例をリスト3.3.4 form_textarea_r.phpに示します。次の書式で初期値を設定します。

<textarea name="data" rows="5" cols="40"><?= $_POST['data'] ?></textarea>

 <?= $_POST['data'] ?>の部分で初期値を設定しています。

リスト3.3.4 form_textarea_r.php

<html>
<head>
<title>form_textarea_r.php</title>
<!-- form:テキストエリアの再表示 -->
</head>
<body>
<?php
 if ( $_POST['data'] =="" )
 {
   print "データが入力されていません<br>";
 }
 else
 {
   print "以下のデータが入力されました<br>";
 }
?>
<form action="form_textarea2.php" method="post">
 入力:<br>
 <textarea name="data" rows="5" cols="40"><?= $_POST['data'] ?></textarea>
                     <!-- 初期値の表示 -->
 <br>
 <input type="submit" value=" OK ">
</form>
</body>
</html>

 form_textarea_r.phpに初めてアクセスすると次図のようなWebページが表示されます。

 次図のように入力し、「OK」ボタンをクリックします。

 次図のように再表示されます。前に入力した値が、初期値として表示されます。

■選択メニュー

 選択メニューコントロールの場合の初期値の設定例をリスト3.3.5 form_menu_r.phpに示します。次の書式で初期値を設定します。

<option value="1" <?= $val?>>PHP</option>

 選択されていれば、$val="selected"で、ブラウザには次のように送信されます。

<option value="1" selected>PHP</option>

 選択されていなければ、$val=""で、ブラウザには次のように送信されます。

<option value="1" >PHP</option>

リスト3.3.5 form_menu_r.php

<html>
<head>
<title>form_menu_r.php</title>
<!-- form:選択メニューの再表示 -->
</head>
<body>
<?php
 if ( $_POST['data'] =="" )
 {
   print "データが入力されていません<br>";
 }
 else
 {
   print "以下のデータが入力されました<br>";
 }
?>
<form action="" method="post">
 選択してください:<br>
 <select name="data">
  <?php ( $_POST["data"] == "1" ) ? $val = "selected" : $val = "" ; ?>
                   <!-- 3項演算子による初期値の設定 -->
  <option value="1" <?= $val?>>PHP</option>
  <?php ( $_POST["data"] == "2" ) ? $val = "selected" : $val = "" ; ?>
  <option value="2" <?= $val?>>Perl</option>
  <?php ( $_POST["data"] == "3" ) ? $val = "selected" : $val = "" ; ?>
  <option value="3" <?= $val?>>C++</option>
 </select>
 <input type="submit" value=" OK ">
</form>
</body>
</html>

 form_menu_r.phpに初めてアクセスすると次図のようなWebページが表示されます。

 次図のように選択し、「OK」ボタンをクリックします。

 次図のように再表示されます。前に選択した値が、初期値として表示されます。

 

3.4 ハッカー対策等の入力データ変換

■エスケープ文字を元に戻す

 HTMLのテキスト入力コントロール(テキストボックスあるいはテキストフィールドとも呼ぶ)に、文字列を記入できますが、「\」(円マーク。日本語ではバックスラッシュの代わり)や「"」(ダブルクオーテーション)など特殊な記号も記入できます。

 リスト3.1.1でテキスト入力コントロールの幅を80文字と広くしたリスト3.1.4に示すform_text3.phpファイルにアクセスします。テキストボックスに

円マーク記号は"\"です。

と入力してみましょう。

 結果は、次のように表示されます。

 エスケープ
 これは、特殊記号「\」や「"」の前に、「\」が強制的に挿入されているからです。このような文字列処理を特殊文字のエスケープ処理といいます。エスケープ処理のために挿入される特殊文字(記号)をエスケープ文字といいます。ここでは「\」がエスケープ文字として挿入されていることになります。

magic_quotes_gpc
このようなエスケープ処理は、GETメソッドやPOSTメソッドを使う時に行われます。エスケープ処理を自動的に行うかどうかは、PHPの環境設定ファイルである「php.ini」ファイルの中で設定されています。「php.ini」ファイルの中で
magic_quotes_gpc = On

となっていれば、GETメソッドやPOSTメソッドでブラウザからサーバに送られる文字列の中の「\」、「"」、「'」(シングルクォーテーション)、「NULL」(ヌル、\0)の4文字に対してエスケープ処理され、おのおの「\\」、「\"」、「\'」などに変換されます。

SQLインジェクション
このようなエスケープ処理は、PHPファイルで、データベースのSQL文を使用しているときに、不正攻撃を防止するために必須となります。SQL文を偽造する不正攻撃は一般にSQLインジェクションと呼ばれます。SQLインジェクションの詳細はたとえば、以下のWebサイトを参照してください。

http://www.atmarkit.co.jp/fsecurity/rensai/webhole02/webhole01.html

 

 stripslashes()関数
  入力された文字列をSQL文で使用しない場合は、エスケープ処理は不要になります。エスケープ文字を元に戻すには、組み込み関数stripslashes()関数を使用します。

 リスト3.1.2のform_text2.phpファイルの中に、stripslashes()関数によりエスケープ文字を元に戻すスクリプトを追加したリストをリスト3.4.1に示します。

リスト3.4.1 form_text2d.php

<html>
<head>
<title>form_text2d.php</title>
<!-- form:テキストデータの受信 -->
</head>
<body>
<?php
 $str = $_POST["data"];   // POSTメソッドでのフォームデータの受信
 $str = stripslashes($str); // エスケープ文字を元に戻す
 $str = "入力データは[". $str . "]です。<br>";
 print $str;
?>
</body>
</html>

 テキスト入力コントロールの幅を80文字と広くし、POSTメソッドで起動するファイルをform_text2d.phpファイルとしたファイルをfrom_text4.phpとします。そのリストをリスト3.4.2に示します。

リスト3.4.2 from_text4.php

<html>
<head>
<title>form_text4.php</title>
<!-- form:テキスト -->
</head>
<body>
<form action="form_text2d.php" method="post">
入力:<input name="data" size=80>
<input type="submit" value=" OK ">
</form>
</body>
</html>

 form_text4.phpファイルにアクセスし、テキストボックスに

円マーク記号は"\"です。

と入力してみましょう。結果は、エスケープ文字「\」が取り除かれ、以下のように入力文字列と同じ文字列が表示されます。

■HTMLタグの入力の危険性

 form_text4.phpファイルにアクセスし、テキストボックスに

今日は、<b>山田</b>です。

と入力してみましょう。

 結果は、次のように表示されます。つまり、"山田"の文字列が太文字で表示されます。

 このように、テキストボックスからは、HTMLタグで修飾した文字列も入力でき、一見便利にみえますが、タグを使えるということは、Javascriptのようなスクリプトも入力し、動作できることになります。 テキストボックスに、たとえば

<SCRIPT>alert("DANGER");</SCRIPT>

と入力してみましょう。

すると、Javascriptが起動し、alert()関数によりダイアログボックスが表示されます。

 このことは、テキストボックスに任意のJavascriptのスクリプトを記述し、クライアントPC上で起動させることができることを示しています。たとえば、クライアントPCのCookieの情報を盗み見たり、ファイルを削除したりもできます。

 ただ、テキストボックスを表示するクライアントPCが自分のPCで、Javascriptのスクリプトが起動されるクライアントPCも自分のPCであれば、被害を受けるのは自分自身ですから、そんないたずらはしないのですが、同じような処理を「GET」メソッドでもできることに注意する必要があります。

 たとえば、リスト3.4.2のform_text4.phpファイルで「POST」メソッドの代わりに「GET」メソッドを使用するようにしたファイルをfrom_text5.phpとし、起動するファイルもリスト3.4.1のform_text2dファイルの「POST」メソッドでの受信をを「GET」メソッドでの受信に書きかえたファイルをform2e.phpとし、同じように、

<SCRIPT>alert("DANGER");</SCRIPT>

と入力してみましょう。今度は、「GET」メソッドを使用しているので、URLに入力データが付加された形でform_text2dファイルにデータが渡されます。

 クロスサイトスクリプティング
 このことは、次のようにハイパーリンクのURLに任意のJavascriptのスクリプトを記述しておき、たまたまそのハイパーリンクをクリックしたユーザのクライアントPC上でそのJavascriptのスクリプトを起動させることができることを示しています。これは非常によく知られた不正攻撃の一つで、クロスサイトスクリプティングとして知られています。

http://(信頼できるサーバ)/form_text2e.php?data=%3CSCRIPT%3Ealert%28%22DANGER%22%29%3B%3C%2FSCRIPT%3E

クロスサイトスクリプティングの詳細については、以下を参照してください。

・広瀬ほか:「PHP4徹底攻略 実践編」、ソフトバンクパブリッシング、pp.25-27

http://www.ipa.go.jp/security/awareness/vendor/programming/a01_02.html

 

■HTMLタグの入力制限

 このようなクロスサイトスクリプティングによる不正攻撃を防止するためには、テキストボックスなどのフォームからのHTMLタグの入力を制限する必要があります。HTMLタグの入力を制限する方法として、HTMLタグが入力された場合に削除してしまう方法と、HTMLタグをHTMLにおける表示のための特殊文字コード(これをHTMLエンティティと呼ぶ)に変換する方法があります。HTMLのソースコードなどを掲示板で表示したい場合には、後者の方法を採用することになります。

 htmlspecialchars()関数
 HTMLタグ等の特殊文字(<、>、&、")を、HTMLエンティティ(&lt;、&gt;、&amp;、&quot;)に変換する組み込み関数として、htmlspecialchars()関数があります。エンティティのことを実体参照ともいいます。

 リスト3.4.1のform_text2d.phpファイルに、htmlspecialchars()関数により、入力データの中のHTMLタグ等をHTMLエンティティに変換するスクリプトを挿入したファイルをform_text2f.phpファイルとし、リスト3.4.3に示します

リスト3.4.3 form_text2f.php

<html>
<head>
<title>form_text2f.php</title>
<!-- form:テキストデータの受信 -->
</head>
<body>
<?php
 $str = $_POST["data"];       // POSTメソッドでのフォームデータの受信
 $str = stripslashes($str);     // エスケープ文字を元に戻す
 $str = htmlspecialchars($str);   // HTMLタグ等のHTMLエンティティへの変換
 $str = "入力データは[". $str . "]です。<br>";
 print $str;
?>
</body>
</html>

 リスト3.4.2のfrom_text4.phpファイルで、「POST」メソッドによる起動ファイルを、リスト3.4.3のform_text2f.phpファイルにしたファイルをfrom_text6.phpファイルとしリスト3.4.4に示します。

リスト3.4.4 from_text6.php

<html>
<head>
<title>form_text6.php</title>
<!-- form:テキスト -->
</head>
<body>
<form action="form_text2f.php" method="post">
入力:<input name="data" size=80>
<input type="submit" value=" OK ">
</form>
</body>
</html>

 from_text6.phpファイルにアクセスし、

<SCRIPT>alert("DANGER");</SCRIPT>

と入力してみます。結果は、以下のように、Javascriptは起動せず、タグがそのまま文字としていわゆる実態参照として表示されます。

実験用のWebアプリケーション用PHPファイルであっても、インターネットに公開しているサーバにアップロードする場合は、ハッカーによる不正攻撃を防止するために必ず、上記htmlspecialchars()関数によるHTMLタグ等のHTMLエンティティへの変換処理を実行するようにしてください。

■改行コード

 HTMLフォームの中に、複数行の文字列を入力できるテキストエリアというコントロールがあることは、先にリスト3.1.9のサンプルで示しました。このときは、POSTメソッドで、リスト3.1.10に示したform_textarea2.phpファイルを起動し、入力データを再度テキストエリアに表示しました。入力データの編集の必要性がなく表示するだけであれば、HTMLフォームを使わなくてもWebページにprint文で表示すれば十分です。

 そこで、リスト3.1.9を書き換えて、POSTメソッドでリスト3.4.1に示したform_text2d.phpファイルを起動するようにしてみます。これをリスト3.4.5に示します。form_text2.phpファイルでは、POSTメソッドで受信したデータを単にprint文で表示するだけです。

リスト3.4.5 form_textarea3.php

<html>
<head>
<title>form_textarea.php</title>
<!-- form:テキストエリア -->
</head>
<body>
<form action="form_text2d.php" method="post">
入力:<br>
<textarea name="data" rows="5" cols="40"></textarea>
<br>
<input type="submit" value=" OK ">
</form>
</body>
</html>

 このform_textarea3.phpファイルにアクセスし、以下の4行の文字列を入力し、「OK」ボタンをクリックします。

 結果は、以下のように表示されます。つまり改行が行われず、1行で表示されてしまいます。

 つまり、テキストエリア内に表示した場合は自動的に改行されたのに、print文で表示した場合は改行されません。これはなぜでしょうか?

 これを理解するためには、改行コードと改行タグについて理解する必要があります。

 改行コード
 改行コードは文字コードの一つです。ただ英数字コードのように単純には目に見えません。制御コードとも呼ばれコンピュータを制御するために使われます。改行コードは一般にキーボードで「Enter」キーを押すと入力されます。改行コードには「CR」(キャリッジリターン)と「LF」(ラインフィード)の2種類があります。

 PHPでは、「CR」はエスケープ文字を使って「\r」と表します。「LF」は同じく「\n」と表します。エスケープ文字というのは、「直後の1文字は本来の文字から離れて別の意味で使います」 ということを示す制御文字のことです。

改行コードの実際は、OSによって異なります。
Windows系OSでは、「\r\n」です。
UNIX系OSでは、「\n」です。
Mac系OSでは、「\r」です。

 改行タグ
  実はHTMLフォームのテキストエリア 内では、この改行コードが有効に機能します。ただし、HTMLのテキストエリア以外のWebページ内では、この改行コードはすべて無視されます。そのかわり、Webページ内で改行を行うには、HTMLタグの一つである改行タグ「<br>」を使います。

 以上のことから、HTMLフォームから入力された文字列の中の改行コードは、Webページ内にprint文で表示する前に、あらかじめ改行タグに変換しておく必要があることがわかります。

 nl2br()関数
 PHPには、改行コードの前に改行タグ 「<br>」を挿入する組み込み関数nl2br()関数が準備されています。nl2brは「Newline to BR」の略です。ただ、nl2br()関数は、改行コードを削除してくれないので、ここでは、改行コードを改行タグに置き換えるユーザ定義関数nl_rep_br()関数を作成することとします。

 リスト3.4.1のform_text2d.phpファイルに、nl_rep_br()関数により、入力データの中の改行コードに改行タグに変換するスクリプトを挿入したファイルをform_text2h.phpファイルとし、リスト3.4.6に示します。

リスト3.4.6 form_text2h.php

<html>
<head>
<title>form_text26.php</title>
<!-- form:テキストデータの受信 -->
</head>
<body>
<?php
 $str = $_POST["data"];   // POSTメソッドでのフォームデータの受信
 $str = stripslashes($str); // エスケープ文字を元に戻す
 $str = nl_rep_br($str);  // 改行コードを改行タグに変換
 $str = "入力データは[". $str . "]です。<br>";
 print $str;
?>
</body>
</html>
<?php
function nl_rep_br($str)
{
 // 改行コードを改行タグに変換
 $str = preg_replace( "/(\r\n|\r|\n)/", "<br />", $str);
 return $str;
}
?>

 nl_rep_br()関数では、各OSに対応した改行コードを、HTMLの改行タグ「<br>」でなく、XHTMLの改行タグである「<br />」に変換(置換)しています。 preg_replace()関数は、文字列の置換処理を行う組み込み関数で、Perl互換の正規表現を使用できます。最初の引数、「"/(\r\n|\r|\n)/"」は、第3の引数の文字列に、「\r\n」あるいは「\r」あるいは「\n」の文字列があればその文字列を第2の引数の文字列に置換しなさいという意味です。

 リスト3.4.5のform_textarea3.phpファイルを書き換えて、POSTメソッドで、リスト3.4.6のform_text2h.phpファイルを起動するようにしたファイルをform_textarea4.phpファイルとします。

 form_textarea4.phpファイルにアクセスし、同じ4行の文字列を入力してみます。今度は、以下のように改行されているのがわかります。

■入出力データ変換用ユーザ定義関数の作成

 HTMLフォームから入力した入力データの変換や、HTMLフォームに表示するための出力データの変換は、上に述べたように複雑です。そこで、これらの入出力データの変換をユーザ定義関数でまとめて実行するようにしておきます。

 HTMLタグ等の扱いについては、@HTML実体参照(エンティティ)に変換する、AHTMLタグ等の入力を許容する、BHTMLタグは自動的に削除する。CHTMLタグが入力されたら警告するようにする、などの方法が考えられますが、ここでは、@に限定したデータ変換を行うこととします。

 HTMLタグ等をHTML実体参照に変換するタイミングとして、WebサーバがクライアントPCからデータを受信した時点とする場合と、WebサーバからクライアントPCにデータを送信する時点のいずれかが考えられます。HTMLタグ等は、クライアントPCからHTMLフォームに入力する形でWebサーバに送信される場合のほかに、電子メール等でWebサーバに送信される場合も想定されることから、一般には、WebサーバからクライアントPCにデータを送信する時点でHTMLタグ等をHTML実体参照に変換することが推奨されています。

 ただ、この場合、改行コードは改行タグに変換せずにそのままにしておく必要があります。nl2br()関数は必ずhtmlspecialchars()関数より後に記述しないと論理矛盾に陥るからです。そうすると、文字列データをCSVファイル等に保存する場合、改行コードの扱いが面倒になります。改行コードが改行タグに変換されていればCSVファイルに保存する場合に問題になりません。

 そこで、ここでは、WebサーバがクライアントPCからデータを受信した時点でHTMLタグ等をHTML実体参照に変換することとします。この場合、Webサーバ上では、文字列の中にHTMLタグが含まれる場合は、HTML実体参照に変換されて、保存されることになります。

 以上のような前提の場合、WebサーバがHTMLフォーム等からGETメソッドやPOSTメソッドで文字列データを受信した場合、受信後に以下の処理を行うことになります。

@stripslashes()関数により、「'」、「"」、「\」のエスケープ処理された文字を元にもどす。
Ahtmlspecialchars()に関数により、「<」、「>」、「&」、「"」をHTML実体参照に変換する。
Bnl2br()関数により、改行コードを改行タグ「<br>」に変換する。

 このユーザ定義関数名を「tag_entity_input()」とすることとします。

 次に、入力データをHTMLフォームのテキストエリアに表示する場合は、改行タグを改行コードにもどしておく必要があります。このユーザ定義関数名を「tag_entity_form()」とすることとします。

 なお、入力データをprint文でWebページに表示する場合、表示前に特に変換処理は必要ありません。

 tag_entity_form()関数とtag_entity_input()関数をリスト3.4.7に示します。なお、一般的なユーザ定義関数はインクルードファイルcommon.phpファイルにまとめて記述しておくこととします。

リスト3.4.7 common.php (ダウンロード:common-3.4.7.zip

<?php
// include file(common.php)

// -------------------------------------
// ユーザ定義関数
/*
tag_entity_input
tag_entity_form
*/

// -------------------------------------
// 改行コードを改行タグ「<br />」に変換
function nl_rep_br($str)
{
/*
 $string = 入力文字列
 戻り値 = 変換後文字列
*/
 // 改行コードを改行タグに変換
 $str = preg_replace( "/(\r\n|\r|\n)/", "<br />", $str);
 return $str;
}

// -------------------------------------
// GETメソッド、POSTメソッドによる入力データ変換処理
// (HTMLタグ等をHTML実体参照に変換するモードの場合)
function tag_entity_input($string)
{
/*
 $string = 入力文字列
 戻り値 = 変換後文字列
*/
 if(empty($string)) {return "";}
 
 // 「'」,「"」,「\」のエスケープ処理された文字を元にもどす
 $string = stripslashes($string);
 
 // 「<」,「>」,「&」,「"」をHTML実体参照に変換する
 $string = htmlspecialchars($string);
 
 // 改行コードを改行タグ「<br />」に変換する。
 $string = nl_rep_br($string);
 return $string;
}

// -------------------------------------
// HTMLフォームのテキストエリアにデータを表示する直前の
// データ変換処理
// (HTMLタグ等をHTML実体参照に変換するモードの場合)
function tag_entity_form($string)
{
/*
 $string = 入力文字列
 戻り値 = 変換後文字列
*/
 if(empty($string)) {return "";}
 
 // 改行タグを改行コードに変換
 $string = preg_replace( "/(<br>|<br \/>)/", "\n", $string);
 return $string;
}

フォームのテキストボックスとテキストエリアで入力したデータを再度、フォームに表示するとともに、print文でも表示するスクリプトをform_script.phpとし、サンプル3.4.8に示します。

サンプル3.4.8 form_script.php

<?php
 // インクルードファイルの読み込み
 include "common.php";
?>
<html>
<head>
<title>form_script.php</title>
<!-- form:スクリプト -->
</head>
<body>
<?php
 // データの受信
 $title = $_POST['title'];
 $script = $_POST['script'];

 // 入力データの変換
 $title = tag_entity_input($title);
 $script = tag_entity_input($script);

 // テキストエリア用出力データの変換
 $script2 = tag_entity_form($script);
?>
フォームでの入出力
<form action="form_script.php" method="post">
タイトル:<br>
<input name="title" size="60"value="<?=$title?>"><br>
スクリプト:<br>
<textarea name="script" rows="5" cols="60"><?=$script2?></textarea>
<br>
<input type="submit" value=" OK ">
</form>
print文での表示<br>
<?php
 print '$title=[' . $title . "]<br>\n";
 print '$script=' . "<br>\n";
 print $script;
?>
</body>
</html>

  form_script.phpにアクセスし、以下の文字列を入力します。

 結果は、次のように表示されます。

 

3.5 デバッグツール

デバッグ時には、変数や配列の値が、ある時点で期待した値になっているか確認できた方が効率的な場合があります。そこで、以下のデバグ用ツール(ユーザ定義関数)を作成し、インクルードファイル「common.php」に保存して、活用することとします。

disp_arr()    // 配列のダンプ表示(デバグ用)
disp_func()   // 関数名の表示(デバグ用)
disp_mes()   // メッセージの表示(デバグ用)
disp_var()    // 変数の表示(デバグ用)
disp_var_hex() // 変数の16進数表示(デバグ用)

これらのソースリストをリスト3.5.1に示します。

リスト3.5.1 common.php(追加部分のみ)

// ----------------------------------------------
// 配列のダンプ表示
function disp_arr($disp,&$arr,$arr_name)
{
/*
$disp = 表示モード
(=0:非表示、=1:黒文字で表示、=2:赤文字で表示、=3:青文字で表示
=4:ライム色で表示、=5:アクア色で表示)
$arr = 配列の値
$arr_name = 配列名
DEBUG = デバグモード指定定数(インクルードファイルuser.php内で定義)
(=0:非デバグモード、=1:デバグモード)
*/
 if(DEBUG == 0){return;}
 if($disp == 0) {return;}
 if($disp == 1)
 {
 $color = "black";
 }
 elseif($disp == 2)
 {
  $color = "red";
 }
 elseif($disp == 3)
 {
  $color = "blue";
 }
 elseif($disp == 4)
 {
  $color = "lime";
 }
 elseif($disp == 5)
 {
  $color = "aqua";
 }
 print "<span style='color:" .$color . "'>";

 // 配列でない場合
 if(!is_array($arr))
 {
  print $arr_name . "= [" . $arr . "] is not array<br>\n";
  return;
 }
 if(count($arr) < 1 )
 {
  print $arr_name . "[] is empty<br>\n";
  return;
 }
 print "<br>\n";
 foreach($arr as $key => $value)
 {
  if(is_array($value))
  {
   foreach($value as $key2 => $value2)
   {
    if(is_array($value2))
    {
     foreach($value2 as $key3 => $value3)
     {
      if(is_array($value3))
      {
       foreach($value3 as $key4 => $value4)
       {
        print $arr_name . "[" . $key . "][". $key2 . "][" .
           $key3 . "][". $key4 . "]=" . $value4 . "<br>\n";
       }
      }
      else
      {
       print $arr_name . "[" . $key . "][". $key2 . "][" .
          $key3 . "]=" . $value3 . "<br>\n";
      }
     }
    }
    else
    {
     print $arr_name . "[" . $key . "][". $key2 . "]=" .
        $value2 . "<br>\n";
    }
   }
   print "<br>\n";
  }
  else
  {
   print $arr_name . "[" . $key . "]=" . $value . "<br>\n";
  }
 }
 print "</span>\n";
}

// ----------------------------------------------
// 関数名の表示
function disp_func($on,$f_name,$mess)
{
/*
$on = 表示モード
(=0:非表示、=1:黒文字で表示、=2:赤文字で表示、=3:青文字で表示
=4:ライム色で表示、=5:アクア色で表示)
$f_name = 関数名
$mess = 表示メッセージ(入口:"Hi"、出口:"Bye")
DEBUG = デバグモード指定定数(インクルードファイルuser.php内で定義)
(=0:非デバグモード、=1:デバグモード)
*/
 if(DEBUG == 0){return;}
 if($on == 1)
 {
  $color = "black";
 }
 elseif($on == 2)
 {
  $color = "red";
 }
 elseif($on == 3)
 {
  $color = "blue";
 }
 elseif($on == 4)
 {
  $color = "lime";
 }
 elseif($on == 5)
 {
  $color = "aqua";
 }
 if($on != 0)
 {
  print "<span style='color:" .$color . "'>";print "<br>【" . $mess . " ! " .       $f_name . "】<br>\n";print "</span>\n";
 }
}

// ----------------------------------------------
// メッセージの表示
function disp_mes($disp,$str_mes)
{
/*
$disp = 表示モード
(=0:非表示、=1:黒文字で表示、=2:赤文字で表示、=3:青文字で表示
=4:ライム色で表示、=5:アクア色で表示)
$str_mes = メッセージ
DEBUG = デバグモード指定定数(インクルードファイルuser.php内で定義)
(=0:非デバグモード、=1:デバグモード)
*/
$on = 1;
disp_func($on,'disp_mes','Hi');
 if(DEBUG == 0){return;}
 if($disp == 0) {return;}
 if($disp == 1)
 {
  $color = "black";
 }
 elseif($disp == 2)
 {
  $color = "red";
 }
 elseif($disp == 3)
 {
  $color = "blue";
 }
 elseif($disp == 4)
 {
  $color = "lime";
 }
 elseif($disp == 5)
 {
  $color = "aqua";
 }
 print "<span style='color:" .$color . "'>"
    . $str_mes . "</span><br>\n";
disp_func($on,'disp_mes','Bye');
}

// ----------------------------------------------
// 変数の表示
function disp_var($disp,$var,$var_name){
/*
$disp = 表示モード
(=0:非表示、=1:黒文字で表示、=2:赤文字で表示、=3:青文字で表示
=4:ライム色で表示、=5:アクア色で表示)
$var = 変数の値
$var_name = 変数名
DEBUG = デバグモード指定定数(インクルードファイルuser.php内で定義)
(=0:非デバグモード、=1:デバグモード)
*/
 if(DEBUG == 0){return;}
 if($disp == 0){return;}
 if($disp == 1)
 {
  $color = "black";
 }
 elseif($disp == 2)
 {
  $color = "red";
 }
 elseif($disp == 3)
 {
  $color = "blue";
 }
 elseif($disp == 4)
 {
  $color = "lime";
 }
 elseif($disp == 5)
 {
  $color = "aqua";
 }
 elseif(is_null($var))
 {
  $var = "NULL";
 }
 elseif($var === FALSE)
 {
  $var = "FALSE";
 }
 elseif($var === TRUE)
 {
  $var = "TRUE";
 }
 print "<span style='color:" .$color . "'>"
    . $var_name . "=" . $var . "</span><br>\n";
}

// ----------------------------------------------
// 変数の16進数表示
function disp_var_hex($disp,$var,$var_name)
{
/*
$disp = 表示モード
(=0:非表示、=1:黒文字で表示、=2:赤文字で表示、=3:青文字で表示
=4:ライム色で表示、=5:アクア色で表示)
$var = 変数の値
$var_name = 変数名
DEBUG = デバグモード指定定数(インクルードファイルuser.php内で定義)
(=0:非デバグモード、=1:デバグモード)
*/
 if(DEBUG == 0){return;}
 if($disp == 0){return;}
 if($disp == 1)
 {
  $color = "black";
 }
 elseif($disp == 2)
 {
  $color = "red";
 }
 elseif($disp == 3)
 {
  $color = "blue";
 }
 elseif($disp == 4)
 {
  $color = "lime";
 }
 elseif($disp == 5)
 {
  $color = "aqua";
 }
 $var = "【" . bin2hex($var). "】";
 print "<span style='color:" .$color . "'>"
    . $var_name . "=" . $var . "</span><br>\n";
}

これらのデバグツールを使う場合は、リスト3.5.2のuser.phpファイルを作成し、定数DEBUGを1に設定します。

リスト3.5.2 user.php

<?php
// include file(user.php)
define(DEBUG,1) // 0:非デバッグモード、1:デバッグモード
?>

 このuser.phpファイルは、インクルードファイルcommon.phpの中で、インクルードファイルとして読み込みます。

リスト3.5.3 common.php (ダウンロード:common-3.5.3.zip

<?php
// include file(common.php)
// インクルードファイルの読み込み
include "user.php";

これらのデバグツールを活用したサンプルをリスト3.5.4に示します。ファイル名はform_password_debug.phpです。

リスト3.5.4 form_password_debug.php
<?php
include "common.php";
?>
<html>
<head>
<title>form_password_debug.php</title>
<!-- form:パスワード -->
</head>
<body>
<?php
disp_mes(1,"GETメソッド、POSTメソッドの値の確認");
disp_arr(2,$_GET,'$_GET');
disp_arr(2,$_POST,'$_POST');

 $name = $_POST['user_name'];
 $password = $_POST['user_passwd'];
disp_var(3,$name,'$name');
disp_var(4,$password,'$password');
disp_var_hex(5,$password,'$password');

?>
<form action="form_password_debug.php" method="post">
   ユーザ名 :
   <input type="text" name="user_name" size=20 value='<?=$name?>'><br>
   パスワード:
   <input type="password" name="user_passwd" size=20                     value='<?=$password?>'><br>
   <input type="submit" value=" OK ">
</form>
</body>
</html>

form_password_debug.phpにアクセスし、以下のように記入します

結果は、次のように表示されます。

 

 

 

 

 


前へ | 目次へ |次へ  | YCポータルサイト

執筆 山田豊通
更新日: 2006年7月30日