Webフォーム:ブラウザからサーバにデータを送るためのしくみ

はじめに
これから始めるPHP入門コラムでは、PHPを学ぶ人が、PHPで簡単なプログラムを書けるようになるまでに必要な知識とポイントをTips的に書いていきます。今後PHPのスキルを身につけて仕事に役立てたい、という方のために「PHP技術者認定初級試験」の出題範囲を意識しながら進めていきますので、ぜひ最後までお付き合いください。
今回のあらすじ
- リクエストとレスポンス
- データを取得する
- データを表示する
- セキュリティ上の問題を修正する
リクエストとレスポンス
さて、前回まではサーバで動いているPHPに注目していましたが、今回はPHPで作られたシステム(Webページなど)の利用者側にも焦点を当てたいと思います。Webシステムは、テレビのように一方的に何かを表示すればよいものばかりではありません。利用者からの指示や入力したいデータを受け取る必要があります。
利用者がWebサーバに何か指示を送るためには、通常ブラウザを使いますよね。連載の第1回で、図1、図2のようなやり取りの図を紹介しました。

図1:ブラウザは、欲しい情報をサーバに伝える(リクエスト)

図2:サーバはブラウザのリクエストに返答する(レスポンス)
このときブラウザはサーバに、以下のようなリクエストを送っています。
GET http://example.jp/profile.php
GETというのは「HTTPリクエスト」の種類です。HTTPリクエストは、URLに対して何をしてほしいのかを伝えます。GETは一番基本のHTTPリクエストで、「URLが指している情報を取得したい」という意味になります。ブラウザのURL欄に直接URLを入力したり、Webページ上の一般的なリンクをクリックしたりしたときは、GETリクエストが送られます。
データを取得する
このサーバにある profile.php は、利用者が入力した「名前」「年齢」「コメント」の3つの項目を表示するプログラムだとしましょう。ブラウザを介して利用者から3つのデータを受け取るにはどうしたら良いでしょうか。ここでは2つの方法を紹介します。
URLを使ってデータを送る
GETリクエスト(通常のリンク)で以下のURLにアクセスする方法です。
http://example.jp/profile.php?name=John&age=25&comment=Hello
PHPのプログラムでは、URLの「?」以降の「キー=値」となっているところ(複数ある場合は「&」でつなぐ)を、$_GETというグローバル変数を使って受け取ることができます。この場合、$_GET の中には以下のデータが入ります。
<?php echo $_GET["name"]; // John echo $_GET["age"]; // 19 echo $_GET["comment"]; // Hello ?>
このように、URLの後ろに文字列を付け加えるだけで、PHPにデータを渡すことができます。
しかし値に「=」や「&」を含めようとすると、データの区切りの記号と区別が付かなくなってしまいます。そのため、URLに使う文字列は「URLエンコード」する必要があります。例えば「y=2x」という値をコメントに使いたい場合、「comment=y%3d2x」となります。「=」が「%3d」に変換されているのが分かりますね。文字列をURLエンコードするには、PHPの関数urlencodeを利用します。このとき、$_GET["comment"] の中には、エンコード前の「y=2x」が入っています。