我正在创建一个表单验证脚本,我想问一个问题。 当我使用头信息(如下面的示例)时,我需要立即使用exit吗?我的意思是,使用header也意味着默认情况下它正在退出,因此我不需要使用exit命令吗?
// cancel button clicked
if (isset($_POST['cancel'])) {
header("Location: http://localhost/admin/tracks.php");
exit;
}
echo '<p>$name</p>'
我正在创建一个表单验证脚本,我想问一个问题。 当我使用头信息(如下面的示例)时,我需要立即使用exit吗?我的意思是,使用header也意味着默认情况下它正在退出,因此我不需要使用exit命令吗?
// cancel button clicked
if (isset($_POST['cancel'])) {
header("Location: http://localhost/admin/tracks.php");
exit;
}
echo '<p>$name</p>'
你应该调用exit()
,因为header()
不会自动停止脚本的执行 - 或者即使它这样做(老实说我也不100%确定),它肯定不会立即停止脚本。
例如,尝试运行以下代码:
<?php
header("Location: http://www.google.com");
unlink(__FILE__);
?>
这个小脚本使用header()
将你重定向到谷歌,然后删除自己。如果你运行它,你会注意到在重定向后,文件仍然被删除了。这意味着尽管header()
调用了重定向,unlink()
调用仍然执行了。
exit
,因为我希望能够绝对信赖脚本不会越过header->location调用。虽然上面的答案听起来很棒,但如果您不确定代码路径,这可能会导致意外结果。例如,如果您正在使用依赖于代码执行将从头到尾运行的框架,则可能会无意中中断它。
从用户角度来看,这可能是可以接受的,因为他们仍将被重定向,并且不会有任何问题,但请考虑以下内容:
您正在使用期望记录重定向或设置其他标头(或任何其他项目)的框架(操作系统或自定义)。通过调用exit
,您正在绕过该逻辑,因此可能会获得意外结果。
因此,简而言之,是的,上述方法将起作用,只是要注意在短路之前知道您希望发生什么。
它不会停止您的脚本运行,您的脚本将继续运行,有时候一个人(可能是出于恶意)只需要让您的脚本达到某个特定点,他就可以执行X操作。Header()只会重定向,而exit();则会立即停止脚本(在exit();处)。或者像其他人在用户名下所述:
Cody. A. Ray:是的,如果您不明确终止它,则调用header('Location: http://google.com')后脚本将继续处理!我刚在本地尝试了一下。我在Apache网站中添加了test.php,并添加了以下内容。
<?php
header('Location: http://google.com');
error_log("WE MADE IT HERE SOMEHOW");
?>
并检查了我的 /var/log/apache2/error_log,寻找这个条目:
[Tue Feb 12 23:39:23 2013] [error] [client 127.0.0.1] WE MADE IT HERE SOMEHOW
如果像这样重定向,通常不会发送输出(取决于输出缓冲等),但是如unlink()示例所示,脚本不会因header()而死亡。
因此,如果您想要在重定向后阻止脚本继续运行,则需要使用exit()或die()调用。