フリー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
メソッドで情報を渡すこともできますが、テキストリンクでページ移動をさせたい場合には有効です。