我有一个用户登录/注册系统,只需使用
// execute queries, set cookies, etc. here
header("Location: " . getenv("HTTP_REFERER"));
我最近读了一篇关于
exit();
和 die();
的文章,但不知道我应该使用这些。据我了解,他们让PHP结束了?那是对的吗?我可以实现这一目标的最佳方法是什么,只需在 header(); 之后直接添加这些函数之一即可。我有执行力吗?
我有 AJAX、jQuery 读取我的 login.php/register.php,这会受到任何影响吗?
编辑:除了 header(); 之后,我还应该在哪里使用
exit();
或 die();
函数? exit();
更多用于 PHP,而 die();
更多用于 Perl?
我也一直在寻找这个问题的答案。我发现了什么:
如果您不在
header('Location: http://something')
之后放置 die() 或 exit(),您的脚本可能会继续导致意外行为。例如,这可能会导致您实际上想要通过重定向 (HTTP 301) 阻止的内容被泄露。上述内容对于最终用户来说可能无法直接看到,因为浏览器可能不会呈现它(由于 301)。结论,exit() 和 die() 函数阻止脚本继续运行。
我也想知道这些功能之间的区别,因为它似乎没有。然而,在 PHP 中,标头输出存在明显差异。 在下面的示例中,我选择使用不同的标头,但为了显示 exit() 和 die() 之间的差异,这并不重要。
<?php
header('HTTP/1.1 304 Not Modified');
exit();
?>
结果:
HTTP/1.1 304 Not Modified
Connection: Keep-Alive
Keep-Alive: timeout=5, max=100
<?php
header('HTTP/1.1 304 Not Modified');
die();
?>
结果:
HTTP/1.1 304 Not Modified
Connection: close
因此,die() 会关闭连接,而exit() 则不会。无论您想要保持连接打开还是关闭连接,这取决于性能。两者都有优点和缺点,具体取决于您的具体要求。
http://php.net/manual/en/function.exit.php
http://php.net/manual/en/function.die.php
该函数用于中断脚本执行。您需要使用
exit
或die
在header("Location: " . getenv("HTTP_REFERER"));
之后停止执行脚本,因为在其他情况下,您的脚本将执行到最后,这可能会导致一些意外的行为。
答案已被接受,但似乎每个人都忽略了问题中明显的WTF:
header("Location: " . getenv("HTTP_REFERER"));
返回引用者对于用户代理来说是可选的
很容易被伪造
没有办法告诉用户登录失败
没有身份验证失败的 HTTP 语义通信
虽然环境变量 HTTP_REFERER 应与请求标头变量相同,但 RFC 3875 中未指定它,因此即使在请求中呈现给 Web 服务器,getenv("HTTP_REFERER") 也可能返回不同的值
好吧,距离上次给出答案已经过去很长时间了。无论如何:D不知怎的,我偶然发现了一个类似的问题,看看我的解决方案是什么:
die( Header( "Location: mytarget.php?arg1=foobar" ) );
一石二鸟 - 似乎对我有用。
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
exit("\n Using exit(), We are done");
}
}
现在让我们看一下使用 die() 的同一示例;
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
die("\n Using die(), We are done");
}
}
其中每一个的输出分别为:“使用 exit(),我们完成了 使用 die(),我们完成了”。现在让我们尝试每一个来输出一个数字。
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
exit(-1);
}
}
使用 die() 查看同一示例的输出;
for($i = 0; $i < 10; $i++)
{
if ($i == 2)
{
die(-1);
}
}
这些示例是使用文本板编辑器编辑的。上述两种情况的输出均为“工具已完成,退出代码为 -1”。
因此,对于“php 中 die() 和 exit() 之间有什么区别”这个问题的诚实答案是 – 这两个函数之间没有任何明显的区别。它们都是相同的,一个是另一个的别名。如果你们中的任何一个人都能找到真正明显的差异,那么如果您能将其发布在本博客的评论部分,我将不胜感激。
当在脚本末尾调用
header()
时,无需调用 exit()
,也无需调用 die()
,因为:
脚本执行结束后,到服务器的链接将立即关闭,除非通过显式调用 mysql_close() 提前关闭。 - php.net/function.mysql-connect