ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

PHP:header()関数で画面遷移させる場合の注意点

Webシステムのプログラムで、ログインしていない状態なのに、なぜかデータベースの参照を行っていました。
index.phpにアクセスされると、ログインしていなければlogin.phpに遷移するようになっています。
ログインしていれば、login.phpには遷移せず、index.phpの実行を継続し、データベースの参照を行います。

ログインしている/していないの判定を行ない、ログインしていなければ、header()関数でLocationを指定して遷移しています。

<?php
if ($login === false) {
    header("Location: ./login.php");
}

遷移はしていますが、以降のコードの実行を行ってから遷移しています。

f:id:AJYA:20180525225934j:plain
photo credit: Daniel M. Hendricks PHP Programming for Windows via photopin (license)

exit()関数が必要

ソースコードを見ていて思い出しましたが、header()関数で遷移する場合、exit()関数を書かないと以降のコードの実行が継続してしまいます。

<?php
if ($login === false) {
    header("Location: ./login.php");
    exit();
}

Manualにも、書かれています。

<?php
header("Location: http://www.example.com/"); /* ブラウザをリダイレクトします */

/* リダイレクトする際に、これ以降のコードが実行されないことを確認してください */
exit;
?>

PHP: header - Manual


何年も前に作成されたシステムで辞めた同僚のから引き継ぎましたが、同僚は気がついていなかったということになります。
無駄なデータベースの参照が減って、ほんの少しだけでしょうが、速度は改善しているはずです。