フォームからの入力

トップ > PHP入門 > フォームからの入力

目次

広告

フォームを構成するHTML

掲示板やフォームメールを作成する際、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 にデータの送信方法を指定します。(methodget にすると、URLの後ろにデータが付加されて送信されます。)

<form action="regist.php" method="post"></form>

一行入力

input タグの typetext を指定すると、一行入力項目を表示する事ができます。name で指定したキーワードを基に、PHPでデータを受け取ります。

<input type="text" name="sample" />

複数行入力

textarea タグを指定すると、複数行入力項目を表示する事ができます。name で指定したキーワードを基に、PHPでデータを受け取ります。

<textarea name="sample" cols="30" rows="5"></textarea>

送信ボタン

input タグの typesubmit を指定すると、データ送信ボタンを表示する事ができます。value で指定した語句がボタンに表示されます。

<input type="submit" value="登録する" />

PHPでのデータ受信

上のフォームから送信されたデータを受け取るPHPプログラムを作成します。PHPでは、フォームから送信されたデータは自動的に特別な連想配列に格納されます。

ブラウザからPOSTメソッドで送信されたデータは、$_POST という連想配列に格納されます。PHPが実行されると自動的に値が格納されるため、この連想配列の内容を参照するだけで、フォームからの値を受信することができます。

同様に、GETメソッドで送信されたデータは、$_GET という連想配列に格納されます。こちらも、PHPが実行されると自動的に値が格納されます。

また、POSTメソッド・GETメソッドのどちらで送信した場合でも、$_REQUEST という連想配列にも格納されます。こちらも、PHPが実行されると自動的に値が格納されます。

入力項目の name 属性を comment にして送信した場合、$_POST["comment"] とすれば取得する事ができます。前に挙げたサンプルフォームから値を受け取る場合、form.html と同じフォルダに regist.phpformaction で指定したファイル。)を作成し、以下の内容を記述します。

<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.htmlhttp:// でアクセスし、登録ボタンを押すと入力内容がブラウザに表示されます。

送信されたデータを表示させる

<>&" をブラウザで文字列として表示させるには htmlspecialchars 関数を使用します。これを使用すると、各文字列が &lt;&gt;&amp;&quot; に変換されて返されます。

htmlspecialchars($_POST["name"])

さらに、, に続けて ENT_QUOTES と書くと、' (シングルクォート)も &#039; に変換されて返されます。

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>

GETメソッドでのデータ送信

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