PHPでハマったことをPHPの落とし穴と題して逐次書いていきたいと思います。
問題
ログインができない!動いている環境とPHPのバージョンも合わせたのになぜ!?
$_REQUEST
に$_COOKIE
の値が入ってないぞ。
原因
$_REQUEST
の中身はphp.iniのrequest_order
ディレクティブの値に依存する。デフォルトではCookieのCが含まれてない。
PHP: コア php.ini ディレクティブに関する説明 - Manual
解決策
php.iniのrequest-order
ディレクティブにCを追加する?
そうではなくCookieを使いたい場合はこういった環境依存のある$_REQUEST
ではなく$_COOKIE
を使うべき。コードの意図も伝わりやすい。
しかし、一度大量に混入したcookie用途の$_REQUEST利用を全て修正するのは難しそうだ。単純にreplaceはできないので$_REQUEST
でgrepして、文脈から判断するしかなさそうだ。
明確な理由がない限り$_REQUESTはおすすめできない。
$_GET
, $_POST
, $_COOKIE
を使うべきだ。
PHPのスーパーグローバル変数($_から始まるやつ)の扱いは名前が表す通り注意が必要だと思いました。