我正在创建一个验证表单的脚本,我问自己一个问题。当我使用标题(参见下面的示例)时,我是否需要在之后使用退出?我的意思是,使用标题也意味着它默认退出,因此我不需要使用命令exit?
// cancel button clicked
if (isset($_POST['cancel'])) {
header("Location: http://localhost/admin/tracks.php");
exit;
}
echo '<p>$name</p>'
答案 0 :(得分:23)
你应该调用exit()
,因为header()
不会自动停止脚本执行 - 或者如果它(我老实说不是100%),它绝对不会停止剧本即刻。
例如,请尝试以下代码:
<?php
header("Location: http://www.google.com");
unlink(__FILE__);
?>
这个小脚本使用header()
将您重定向到Google,然后删除自己。如果您运行它,您会注意到在重定向后,该文件仍然被删除。这意味着即使unlink()
调用重定向您,header()
调用仍然执行。
答案 1 :(得分:7)
我在header-&gt;位置调用之后使用exit
因为我希望能够绝对依赖脚本不会超过header-&gt;位置调用这一事实。
如果某个地方出现了错误并且您的脚本在header-&gt;位置调用之前开始生成输出,则调用将失败,并且脚本执行将继续正常(除非您调用exit)
答案 2 :(得分:1)
虽然上面的答案听起来很棒,但如果您不确定代码路径,可能会导致意外结果。例如,如果您使用的框架依赖于代码执行将从头到尾运行的事实,您可能会无意中断它。
从用户的角度来看,这可能没问题,因为它们仍然会被重定向,并且不会更明智,但请考虑以下因素:
您正在使用期望记录重定向的框架(操作系统或自定义),或设置其他标头(或任意数量的其他项)。通过调用exit
,你可以绕过这种逻辑,因此可能会得到意想不到的结果。
所以简而言之,是的,上述方法是有效的,只需要谨慎一点,知道在短路之前你会发生什么。
答案 3 :(得分:0)
如果你像这样重定向,通常不会发送输出(取决于输出缓冲等),但是如unlink()示例所示,脚本不会因header()而死亡。
因此,如果要在重定向后阻止脚本继续运行,则必须使用exit()或die()调用。
答案 4 :(得分:0)
它不会阻止你的脚本运行,你的脚本会继续运行,有时候所有人(可能有不良意图)需要你的脚本到达他可以做X的特定点.Header()将只是redirect,exit();但是会立即停止脚本(exit(); is)。或者用其他人在用户名下说明:
科迪。 A. Ray:是的,如果你没有明确地终止它,脚本会在调用标题(&#39;位置:http://google.com&#39;)之后继续处理!我刚在当地尝试过。我将test.php添加到apache中包含这些内容的站点
<?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
所以最终结论:标题不会阻止脚本运行。
答案 5 :(得分:-1)
使用标题也意味着它默认退出
怎么样?
如果您的标题不是Location:
,而是Content-type:
或Cache-control
或其他什么,该怎么办?