PHP で GET・POST リクエストを判別・処理する
Apache サーバ上に PHP ファイルを置いて、CGI みたく動かしてみたい。
- 通常の GET リクエスト時はページを表示し、URL パラメータによってちょっとした表示切り分けをしたりしたい
- 表示したページに、自ファイルに向けて POST 送信するフォームを用意してある
- 同 PHP ファイルに POST リクエストされた時は、フォーム送信されたパラメータを使って別の処理をして、最終的には元のページを開き直す
こんな仕様の PHP ファイルを作ろうと思う。
そこで使うことになるのが、$_SERVER・$_GET・$_POST といった定義済変数・スーパーグローバル変数たちだ。
目次
$_SERVER: サーバ変数$_GET: GET リクエストパラメータを取得する$_POST: POST パラメータを取得する$_REQUEST: 非推奨- POST 後に元のページを再表示するには
- 以上
$_SERVER : サーバ変数
$_SERVER 変数には、サーバのホスト名や URL、HTTP リクエストの情報などが含まれている。連想配列の形で各種情報が格納されているので、
$_SERVER['SCRIPT_FILENAME'](実行されているスクリプトの絶対パス)$_SERVER['HTTP_HOST'](ホスト)
といったように指定する。
その中でも、$_SERVER['REQUEST_METHOD'] を確認すれば、そのリクエストが GET だったか POST だったか、といった情報が確認できる。
if($_SERVER['REQUEST_METHOD'] === 'GET') {
// GET リクエストの場合の処理
}
else if($_SERVER['REQUEST_METHOD'] === 'POST') {
// POST リクエストの場合の処理
}
こんな感じ。ちなみに、PHP では else if は elseif と1語にしても同じように使える。
比較演算子についても、型までチェックする === と、もう少し曖昧な == とがあって、この辺は JavaScript っぽい。
$_GET : GET リクエストパラメータを取得する
続いて、URL パラメータとして付与された情報を取得するための $_GET 変数を紹介する。
例えば
https://example.com/test.php?hoge=fuga&foo=bar
という URL パラメータが与えられた時は、以下のように取得できる。
echo $_GET['hoge'];
// 「fuga」
echo $_GET['foo'];
// 「bar」
この時、未定義の存在しないパラメータをいきなり取得しようするとエラーになるため、isset() 関数を使って変数が定義されているかチェックする。
if(!isset($_GET['something']) {
echo 'something パラメータは定義されていません';
}
else if(empty($_GET['something'])) {
echo 'something パラメータに値がありません';
}
else {
echo 'something パラメータの内容は [' . $_GET['something'] . '] です';
}
isset() 関数は、変数が存在し、Null でなければ true となる。変数定義がされていても Null が設定されている変数は、true とはならず false 扱いなので注意。
empty() 関数は、変数が存在し、かつ、Null、False、空文字、0、空配列の場合に true となる。JavaScript における Falsy な値のチェックに近い。
なお、URL 上で % エンコーディングされている場合も、デコードされた通常の文字列が取得できるので、変換の必要はない。
$_POST : POST パラメータを取得する
GET・POST の判別ができるようになったので、GET リクエスト時はフォームを表示して、POST 送信してもらえるようにする。
<?php
if($_SERVER['REQUEST_METHOD'] === 'GET') {
// GET リクエストの場合 Start
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="POST">
<input type="text" name="user_id" value="">
<input type="submit" value="送信する">
</form>
<?php
// GET リクエストの場合 End
}
else if($_SERVER['REQUEST_METHOD'] === 'POST') {
// POST リクエストの場合の処理
}
PHP と HTML を混在させてみた。$_SERVER['PHP_SELF'] で、ルート相対パスが取得できるので、自分自身に POST 送信するフォームを書いておく。
name="user_id" なテキストボックスに文字列を入力して送信ボタンを押下すれば、今度は // POST リクエストの場合の処理 の部分のコードが動くことになる。
ココで、POST 送信されているテキストボックスの内容を知るには、$_POST 変数を使用する。
echo $_POST['user_id'];
コチラも、$_GET と同じく、事前に isset() で存在チェックを行っておくと安全だ。
$_REQUEST : 非推奨
$_GET と $_POST とで取れる値をまとめて取得できる、$_REQUEST という変数もある。他に $_ENV、$_COOKIE、$_SERVER の値も組み込まれており、デフォルトでは
$_ENV$_GET$_POST$_COOKIE$_SERVER
の順に値が参照されて $_REQUEST の中に組み込まれていく。
別々の変数で同名のパラメータが存在する場合は、後から読み込まれた値の方が上書きされる。だからもし、$_GET['hoge'] と $_COOKIE['hoge'] が存在する場合は、後から読み込まれる $_COOKIE['hoge'] の値が残ることになる。
あまり利用が推奨されない変数なので、素直に $_GET・$_POST を使った方が良い。
POST 後に元のページを再表示するには
さて、POST リクエストを受け取った後、最後に元のページを再表示したい場合は、以下のように書けば良い。
<?php
if($_SERVER['REQUEST_METHOD'] === 'GET') {
// GET リクエストの場合… (省略)
}
else if($_SERVER['REQUEST_METHOD'] === 'POST') {
// POST リクエストの場合の処理
// 処理は省略
// 遷移元 URL を取得する
$url = $_SERVER['HTTP_REFERER'];
// 遷移元 URL を開き直す
header('Location: ' . $url);
}
このように、$_SERVER['HTTP_REFERER'] を参照して header() 関数で指定してやれば良い。
- 参考 : PHP POST後、POST元に戻る方法
以上
リクエストの判別、処理のやり方がひととおり分かったので、単一 PHP ファイルでの CGI スクリプトが書けそうだ。