header()函数在重定向之前执行相同的php文件

时间:2016-09-22 08:45:52

标签: php redirect header

  

找到答案,请在下面查看我的答案。

我有两个文件。

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文件中使用它们。

5 个答案:

答案 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 ;;而不是标题