フリーPHPスクリプト配布サイト。
掲示板やフォームメールを作成する際、HTMLで構成されたフォームからデータを送信し、PHPプログラムで受信します。このようなフォームでのデータのやり取りは、Webアプリケーションでは必須の機能です。
PHPはWebアプリケーション作成に特化した言語なので、この処理を非常に簡単に行えるようになっています。
今回はフォームからデータを送信し、PHPで受信するプログラムを作成してみますが、まずはフォームのHTMLについて解説します。
まずは form.html を作成し、以下のHTMLを記述します。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sample</title>
</head>
<body>
<form action="regist.php" method="post">
名前:<br />
<input type="text" name="name" size="30" value="" /><br />
メールアドレス:<br />
<input type="text" name="mail" size="30" value="" /><br />
コメント:<br />
<textarea name="comment" cols="30" rows="5"></textarea><br />
<br />
<input type="submit" value="登録する" />
</form>
</body>
</html>
これをブラウザで表示すると、以下のように表示されます。

form タグを使用すると、入力フォームを表示させる事ができます。action にデータの送信先、method にデータの送信方法を指定します。(method を get にすると、URLの後ろにデータが付加されて送信されます。)
<form action="regist.php" method="post"></form>
input タグの type に text を指定すると、一行入力項目を表示する事ができます。name で指定したキーワードを基に、PHPでデータを受け取ります。
<input type="text" name="sample" />
textarea タグを指定すると、複数行入力項目を表示する事ができます。name で指定したキーワードを基に、PHPでデータを受け取ります。
<textarea name="sample" cols="30" rows="5"></textarea>
input タグの type に submit を指定すると、データ送信ボタンを表示する事ができます。value で指定した語句がボタンに表示されます。
<input type="submit" value="登録する" />
上のフォームから送信されたデータを受け取るPHPプログラムを作成します。PHPでは、フォームから送信されたデータは自動的に特別な連想配列に格納されます。
ブラウザからPOSTメソッドで送信されたデータは、$_POST という連想配列に格納されます。PHPが実行されると自動的に値が格納されるため、この連想配列の内容を参照するだけで、フォームからの値を受信することができます。
同様に、GETメソッドで送信されたデータは、$_GET という連想配列に格納されます。こちらも、PHPが実行されると自動的に値が格納されます。
また、POSTメソッド・GETメソッドのどちらで送信した場合でも、$_REQUEST という連想配列にも格納されます。こちらも、PHPが実行されると自動的に値が格納されます。
入力項目の name 属性を comment にして送信した場合、$_POST["comment"] とすれば取得する事ができます。前に挙げたサンプルフォームから値を受け取る場合、form.html と同じフォルダに regist.php (form の action で指定したファイル。)を作成し、以下の内容を記述します。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sample</title>
</head>
<body>
<table border="1">
<tr>
<td>名前</td><td><?php echo $_POST["name"] ?></td>
</tr>
<tr>
<td>メールアドレス</td><td><?php echo $_POST["mail"] ?></td>
</tr>
<tr>
<td>コメント</td><td><?php echo $_POST["comment"] ?></td>
</tr>
</table>
</body>
</html>
これで form.html に http:// でアクセスし、登録ボタンを押すと入力内容がブラウザに表示されます。
< や > や & や " をブラウザで文字列として表示させるには htmlspecialchars 関数を使用します。これを使用すると、各文字列が <、>、&、" に変換されて返されます。
htmlspecialchars($_POST["name"])
さらに、, に続けて ENT_QUOTES と書くと、' (シングルクォート)も ' に変換されて返されます。
htmlspecialchars($_POST["name"], ENT_QUOTES)
これによって、$_POST["name"] にHTMLタグが含まれていても、画面にはHTMLが反映されません。(普通の文字列として表示されます。)
この処理は、訪問者から送信されたデータを表示する際には必ず行うようにしてください。もしこの処理を忘れると、フォームから送信する際に入力されたHTMLやJavaScriptをそのまま解釈してしまいます。
もし悪意あるJavaScriptが埋め込まれると訪問者全員に影響を与えてしまうため、それを防ぐためにも htmlspecialchars で安全な文字列に変換します。
改行が含まれる文字列を表示させるには nl2br 関数を使用します。これを使用すると、文字列中の改行文字が <br /> に変換されて返されます。
nl2br($_POST["comment"])
また、PHPの設定によっては ' や " や \ などが自動的にエスケープされることがあります。(文字の直前に \ が付加されることがあります。)これを無くすには stripslashes 関数を使用します。また逆に、addslashes を使用すると、強制的にエスケープする事ができます。
stripslashes($_POST["name"])
addslashes($_POST["name"])
データベースにデータを送信する際には一部のデータをエスケープする必要があるのですが、これはそのための影響です。
最終的に以下のようにすれば、特殊な記号や改行が意図したとおりに表示されるようになります。
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>sample</title>
</head>
<body>
<table border="1">
<tr>
<td>名前</td><td><?php echo htmlspecialchars($_POST["name"], ENT_QUOTES) ?></td>
</tr>
<tr>
<td>メールアドレス</td><td><?php echo htmlspecialchars($_POST["mail"], ENT_QUOTES) ?></td>
</tr>
<tr>
<td>コメント</td><td><?php echo nl2br(htmlspecialchars($_POST["comment"], ENT_QUOTES)) ?></td>
</tr>
</table>
</body>
</html>
フォームを構成するHTMLで紹介したように、form タグの method 属性を get にすると、URLの後ろにデータが付加されて送信されます。
具体的には、フォームの各入力欄に以下の値を入力したとします。
| 入力欄 | 値 |
|---|---|
| 名前 | taro |
| メールアドレス | taro@example.com |
| コメント | これはテストです。 |
そうすると regist.php が呼び出される際、以下の値が付加されます。
?name=taro&mail=taro@example.com&comment=%82%B1%82%EA%82%CD%83e%83X%83g%82%C5%82%B7%81B
これは、各入力欄の「name 属性」と「入力された値」が = で連結され、その連結した各値を & で連結したものです。その際、値に全角文字や特殊文字が含まれていると、URLエンコードと呼ばれる変換処理によって半角文字のみに置き換えられます。(ブラウザが自動的に変換します。)
これを利用して、フォーム以外からデータを送信することも可能です。つまり、
<a href="http://www.example.com/regist.php?name=taro&mail=taro@example.com&comment=test">データ送信</a>
このようなリンクをクリックさせることにより、regist.php に対して値を送信することも可能です。
上の例のようなフォームだと get メソッドで送信するメリットはありませんが、記事を一覧表示する処理のページ移動などによく利用されます。つまり
<a href="http://www.example.com/blog.php?page=2">次のページを表示</a>
このようなリンクを表示させることにより、プログラムに「何ページ目から記事を表示するか?」という情報を渡すことができます。もちろん post メソッドで情報を渡すこともできますが、テキストリンクでページ移動をさせたい場合には有効です。