PHPでの即時リダイレクト
header関数を使用して実行されるリダイレクトは、この関数が呼び出された時点では発生しません。結局のところ、PHP自体はリダイレクトを実行せず、対応するHTTPヘッダーをブラウザに送信するだけだからです。
これは、リダイレクトがPHPがスクリプト全体を最後まで実行したときにのみ発生することを意味します。このため、様々な望ましくない副作用が起こる可能性があります。
例として、次のコードではリダイレクトを実行するか、データベースにクエリを実行したいとします。しかし、リダイレクトのコマンドがあった場合でも、データベースへのクエリは実行されてしまいます:
<?php
if ($_GET['test']) {
header('Location: test.php');
}
$query = "UPDATE users SET changed=1 WHERE id=1";
mysqli_query($link, $query); // リダイレクト時でも実行される!
?>
このような問題を避けるためには、リダイレクトの直後にdie関数を呼び出す必要があります。この関数はスクリプトの実行を即座に終了させ、リダイレクトがすぐに発生するようにします:
<?php
if ($_GET['test']) {
header('Location: test.php');
die();
}
$query = "UPDATE users SET changed=1 WHERE id=1";
mysqli_query($link, $query);
?>
あなたのコードで何らかの望ましくない副作用を再現してください。その後、die関数を使用してそれを修正してください。