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 スクリプトが書けそうだ。