PHPはサーバーサイドのスクリプトです。そのため、何らかのイベントで命令を実行するイベントドリブン型のJavaScriptと違いサーバーサイドならではの使い方をする場合が多いです。
今回はユーザーからの入力に応じてサーバーから返答が返ってくる仕組みについてみていきます。
入力フォームの作成
inputタグを使用してユーザーの名前を入力してもらうと、「ようこそ、〜さん」と返答する単純な仕組みです。
手順
ユーザーの入力の仕組みはhtmlのform要素とinput要素で作成します。
<div id="main"> <form method="post" action="request2.php"> <dl> <dt><label for="name">名前:</label></dt> <dd><input type="text" id="name" name="name"></dd> </dl> <p><input type="submit" value="送信"></p> </form> </div>
「input type=”text”」でテキストボックスを作成しています。「input」タグは属性の「type」の値を変更すればさまざまなフォームのパーツになります。リファレンスを確認して各種パーツの作成方法をしっかりとマスターしておきましょう。
「label」の「for」属性と「input」の属性である「id」を同じ値にすることでお互いに関連しあうようになります。
ポストデータ(POST)とクエリ文字列(GET)
入力データの送信方法は2種類あります。その指定は「form」の「method属性」を使います。値には「post」と「get」があります。
2つの送信方法
POSTの方法
<form method="post" action="request2.php">
GETの方法
<form method="get" action="request2.php">
GETは本質的にはサーバーに対して何らかのリクエストを行う場合に、そのリクエスト文を送るために使用するものです。それはつまりクエリ情報だったりします。もっとわかりやすい例でいうとWordPressのある投稿記事のurlアドレスなどです。(実はこの記事もWordPressで作成していますが、パーマリンクの設定でデフォルトのクエリ情報は表示されないようになっています)
「method」をgetで送信をした場合、入力値がURLの後ろの?以降に追加されます。
?以降に追加された文字のことを特に「クエリ情報」といいます。ワードプレスのデフォルト設定での記事のurlアドレスはそのようになっているはずです。
クエリと聞いただけでなんだか難しいイメージがありますが、直訳すると「クエリ」=「質問」です。つまり「問い合わせ」とすればよいのです。アドレスの?以降は「〜というデータについて問い合わせしたい」という事です。
getのクエリ情報はまとまった送信には不向きですが、URLの一部のためブックマークできる利点があります。
methodを明示的に指定しないで省略するとデフォルト値は「method=”get”」になります。
GETにすべきかPOSTにすべきかハムレットのごとく悩んでしまうところですが、単にURLにクエリ情報が付くかどうかだけではなく、実はもっと本質的なことがあります。
HTTPの仕様ではGETリクエストはidempotentであるとなっています。idempotent? 日本語にすると「冪等(べきとう)」・・・・・余計に分からん。。
wikipediaによると、
数学において、冪等性(べきとうせい、英: idempotence 「巾等性」とも書くが読み方は同じ)は、大雑把に言って、ある操作を1回行っても複数回行っても結果が同じであることをいう概念です。
つまり、GETリクエストの結果は何回リクエストしても同じ結果になるものでなければならないということです。そんな仕組みだからブラウザはGETリクエストに対するレスポンスをキャッシュすることが出来るわけです。GETリクエストだと毎回同じ回答だからキャッシュしておけってことですね。
POSTリクエストは冪等ではありませんので、当然ブラウザはキャッシュしません。ショッピングカートの中身を表示したり、掲示板に書き込みをしたりする場合はGETリクエストを使用してはならないということです。
このポイントを押さえるとGETにすべきかPOSTにすべきかハムレットのように悩むこともなくなりますね。
postのサンプル
getのサンプル
上のサンプルを実行してそれぞれpostの結果とgetの結果のページをブックマークしてみましょう。
postの結果のページをブックマークから表示してもデータの入った結果は表示されませんが、getの結果はデータが入った結果が表示されます。
ブラウザはGETリクエストに対するレスポンスをキャッシュしていることが確認できます。
action属性はサブミット(実行)された時の動作を指定します。通常は何らかのプログラムのファイルを指定することになります。formで得たデータをサブミット(実行)するとmethod属性の方法でaction属性で指定されたプログラムに渡すということになります。
ここまでの作業をHTMLが担当することになるわけです。
PHPプログラムの作成
コードを見てみましょう
<p> こんにちは、 <?php print htmlspecialchars($_POST['name'],ENT_QUOTES, 'UTF-8'); ?> さん! </p>
formのページから送信されたデータを受け取るのは簡単です。POST方式で送信した場合は次のように書きます。
$_POST['name']
GET方式で送信した場合は次のように書きます。
$_GET['name']
これらはスーパーグローバル変数と呼ばれるものです。
POSTやGETで渡されたパラメータの内容(ユーザーがフォームで入力したデータ)は配列として保持されています。$_POST[‘name’]ではパラメータの名前がキーとなります。
サンプルの$_POST[‘name’]はフォームのname属性で指定された値がキーとして入っています。まぎらわしいですが、今回のサンプルではname属性の値がnameです。nameというname属性で指定したテキストボックスに入力されたユーザーの名前が配列で送信されます。それを$_POST[‘name’]を使用してnameというname属性の値を配列から引っ張り出して表示させる役割があります。
基本的にはこれでデータを受け取ることができるのですが、悪意のあるデータが無いとも限りません。
ユーザーからの入力値をそのまま表示することは危険でもあります。そのためにはスクリプトなど実行させないような手立てが必要です。
タグをそのまま表示させることでJavaScriptなどを無効にしてしまう「htmlspecialchars」を活用します。
htmlspecialchars(文字列,エスケープの種類,文字コード)
第1引数の文字列には$_POST[‘name’]でフォームから送信されたデータを取ります。
第2引数のエスケープの種類はENT_QUOTESを使用します。これは定数ですからクオートで囲みません。
第3引数は文字コードを指定します。通常はUTF-8を指定。