我有一个只使用
的用户登录/注册系统// 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?
答案 0 :(得分:31)
我一直在寻找答案。我找到了什么:
如果在header('Location: http://something')
脚本可能继续导致意外行为后未放置die()或exit()。例如,这可能导致您实际想要通过重定向(HTTP 301)阻止您公开的内容。对于最终用户而言,上述内容可能不是直接可见的,因为浏览器可能不呈现它(由于301)。结论,exit()和die()函数阻止脚本继续。
我也想知道这些功能之间的区别,因为似乎没有。但是,在PHP中,Header输出存在明显差异。 在下面的例子中,我选择使用不同的标题,但为了显示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()则不会。无论您是否要保持连接打开或关闭它,都取决于性能。两者都有优点和缺点,取决于您的具体要求。
答案 1 :(得分:8)
http://php.net/manual/en/function.exit.php
http://php.net/manual/en/function.die.php
此函数用于中断脚本执行。您需要使用exit
或die
在header("Location: " . getenv("HTTP_REFERER"));
之后停止执行您的脚本,因为在其他情况下,您的脚本将执行到最后,什么可能导致一些意想不到的行为。
答案 2 :(得分:4)
答案已被接受,但似乎每个人都错过了问题中明显的WTF:
header("Location: " . getenv("HTTP_REFERER"));
用户代理
很容易伪造
没有告诉用户登录失败的方法
没有身份验证失败的HTTP语义通信
虽然环境变量HTTP_REFERER应该与请求标头变量相同,但它没有在RFC 3875中指定,因此即使在请求中提供给Web服务器的地方,getenv(“HTTP_REFERER”)也可能返回不同的值
答案 3 :(得分:2)
在脚本结束时调用header()
时,无需拨打exit()
,也不需要die()
,因为:
一旦脚本执行结束,服务器的链接将立即关闭,除非通过显式调用mysql_close()将其关闭。 - php.net/function.mysql-connect
答案 4 :(得分:1)
好的,从最后一个答案开始已经很长时间了。无论如何:D我不知何故遇到了类似的问题,看看我的解决方案是什么:
die( Header( "Location: mytarget.php?arg1=foobar" ) );
两只一石二鸟似乎对我有用。
答案 5 :(得分:0)
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()之间的区别是什么”)的诚实回答是–这两个函数之间没有一个明显的区别。它们都是相同的,一个是另一个的别名。如果你们中的任何一个都能发现真正的明显区别,那么如果您可以将其发布在此博客的评论部分中,我将不胜感激。
直到下一次,快乐的PHP编程!