找到答案,请在下面查看我的答案。
我有两个文件。
1)1.php
2)2.php
1.php执行,并在调用创建用户的函数(sql语句 - 插入)后,重定向到2.php
这是1.php文件的流程
<?php
ob_start(); // Output buffuring enabled, to be able to output before the call of header()
session_start(); // I store the name of created user in a variable.
create_random_user(); // just inserting a fake user into an sql database
?>
注意:在create_random_user()中调用header();
create_random_user()功能是:
1)执行sql查询。
2)在查询完成后使用header()重定向。
function create_random_user(){
queryToCreateUser() // A mysqli prepare statement, inserting into table. Inside that query when it finishes i store a variable in session.
exit(header("Location: 2.php")); // I tried without the exit, i tried with die(), it is the same
ob_end_flush();
}
我的问题是什么:
如果我不使用header(),用户的插入工作正常。它创造了一个没有任何问题的用户,就是这样。
如果我使用header(),我已经通过我的数据库表看到它可能会创建两个用户。并非总是如此,但是很有可能。
我发现但我不知道为什么会发生这种情况:
我已经搜索过这个问题了,我发现使用错误日志确实发生了什么。
当1.php被执行时,它的工作非常好,查询中没有错误,但是当调用header()时,在重定向到2.php之前,1.php再次执行。所以,这就是创建2个用户而不仅仅是一个用户的原因。
这是使用ob_start()发生的问题吗?或session_start()?
之前有没有人遇到过这个问题?
其他一些信息:
我正在使用ob_start()因为我在调用header()之前有一些回声;
我正在使用session_start()来存储用户的信息并在2.php文件中使用它们。
答案 0 :(得分:1)
通过查看您的代码,我看不出为什么1.php
应该再次执行的原因。虽然,那说你还没有发布2.php
的代码,所以问题可能就在那里。
但是,您的问题只是您遇到的更大问题的症状。系统性比例之一。即您如何构建代码,没有明确和简洁的关注点分离。输出缓冲区内容是最清晰的指标,一旦您重新构建代码以避免这些问题,您会发现代码将更容易修复。
这里有一个先前的答案,how to fix header errors,这将使你走上正确的道路。
作为旁注,die()
/ exit()
通常在<{em> header()
来电之后。不在身边。此外,exit()
之后的任何内容都不会被执行。因此ob_end_flush()
是不必要的。
答案 1 :(得分:0)
使用queryToCreateUser()
更改file_put_contents("temp.txt",date('Y-m-d H:i:s')."\n",FILE_APPEND);
以查看日期是否已写入一次。如果不是,问题可能来自queryToCreateUser()
功能
使用exit(header("Location: 2.php"));
更改die('<meta http-equiv="refresh" content="0; url=2.php" />');
以查看任何更改
答案 2 :(得分:0)
你有没有尝试写出完整的网址?
exit(header("Location http://example.com/2.php"));
这可以消除一些错误。另外,您可以发布2.php
的代码吗?
答案 3 :(得分:0)
这很愚蠢,经过几个小时的搜索后,我发现了这种情况,让我解释一下。
当我复制粘贴网址以达到1.php时,即使在按下&#34之前,输入&#34; 1.php正在执行。
因此,第一个用户是在我粘贴网址时创建的,第二个用户是在&#34;输入&#34;被压了。
我不知道为什么会发生这种情况,它必须是谷歌浏览器,甚至谷歌。例如,如果我尝试去google.com而不按Enter,它就不会去。但在我的情况下,我说它已经执行了一次。
答案 4 :(得分:-1)
试试这个,应该工作
echo&#34; location.replace(&#39; someurl.php&#39;)&#34 ;;而不是标题