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のスーパーグローバル変数($_から始まるやつ)の扱いは名前が表す通り注意が必要だと思いました。

関連:レガシーPHP改善日記シリーズ

Comments


Option