Corredor

ウェブ、プログラミングの勉強メモ。

PHP で GET・POST リクエストを判別・処理する

Apache サーバ上に PHP ファイルを置いて、CGI みたく動かしてみたい。

  • 通常の GET リクエスト時はページを表示し、URL パラメータによってちょっとした表示切り分けをしたりしたい
  • 表示したページに、自ファイルに向けて POST 送信するフォームを用意してある
  • 同 PHP ファイルに POST リクエストされた時は、フォーム送信されたパラメータを使って別の処理をして、最終的には元のページを開き直す

こんな仕様の PHP ファイルを作ろうと思う。

そこで使うことになるのが、$_SERVER$_GET$_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 ifelseif と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 パラメータを取得する

GETPOST の判別ができるようになったので、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 の値も組み込まれており、デフォルトでは

  1. $_ENV
  2. $_GET
  3. $_POST
  4. $_COOKIE
  5. $_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 ファイルでの CGI スクリプトが書けそうだ。