【问题标题】:header() function executes same php file before redirectingheader() 函数在重定向之前执行相同的 php 文件
【发布时间】:2016-09-22 08:45:51
【问题描述】:

找到答案了,看看下面我的答案。

我有两个文件。

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

?>

注意 : header() 在 create_random_user() 内部被调用;

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

【问题讨论】:

  • 2.php中是否包含1.php?

标签: php redirect header


【解决方案1】:

通过查看您的代码,我看不出应该再次执行 1.php 的任何原因。不过,这表示您尚未发布来自 2.php 的代码,因此问题可能出在此处。

但是,您的问题只是您遇到的更大问题的症状。系统比例之一。即您如何构建代码,而没有清晰简洁的关注点分离。输出缓冲区的内容是最明确的指标,您会发现,一旦您重组代码以避免这些问题,您的代码将更容易修复。
这里有一个先前的答案,how to fix header errors,它会让你走上正确的道路。

作为旁注,die()/exit() 通常出现在header() 调用之后。不在它周围。此外,exit() 之后的任何内容都不会被执行。所以ob_end_flush() 是不必要的。

【讨论】:

  • 我不认为 2.php 有问题,而且现在我正在重定向到一个只有回显“hi”的 html 页面。而且问题仍然存在,这意味着问题出在 1.php 我猜
  • @Tony 2.php 可能会再次执行 1.php,因为它包含在 2.php 的顶部。我们可以看到 2.php 吗?
  • 找到了答案,请看下面,感谢您提供给我的信息,很高兴知道!
【解决方案2】:
  • queryToCreateUser() 更改为file_put_contents("temp.txt",date('Y-m-d H:i:s')."\n",FILE_APPEND); 以查看日期是否写入一次。如果不是问题可能来自queryToCreateUser() 函数

  • exit(header("Location: 2.php")); 更改为die('&lt;meta http-equiv="refresh" content="0; url=2.php" /&gt;'); 以查看任何更改

【讨论】:

  • 找到了答案,如果你想看下面,谢谢你的帮助。
【解决方案3】:

你试过写出完整的网址吗?

exit(header("Location http://example.com/2.php"));

这可以消除一些错误。另外,可以发2.php的代码吗?

【讨论】:

  • 这不会改变任何事情,只要两个文件都在同一个文件夹中。如果不是,那么它会产生 404。
  • 没错,但由于我们没有那个细节,我想添加它以消除可能的错误来源。
  • 我们能看到2.php吗?
  • 找到答案,请往下看。
【解决方案4】:

这很愚蠢,经过几个小时的搜索,我发现了这种情况发生了什么,让我解释一下。

当我复制粘贴 url 以点击 1.php 时,甚至在按下“enter”之前 1.php 正在执行。

所以第一个用户是在我粘贴 url 时创建的,第二个用户是在按下“enter”时创建的。

我不知道为什么会这样,它一定是谷歌浏览器,甚至谷歌。例如,如果我尝试在不按 Enter 的情况下访问 google.com,它就不会去。但就我而言,正如我所说的,它已经执行了一次。

【讨论】:

  • Facepalms 这对你来说是“有用”的功能......不过很高兴你想通了,我希望我们也能帮助你学习其他东西。 :)
  • 我这辈子从未见过这种浏览器行为!!! .您确定仅通过在浏览器栏中粘贴 Uri 来发送请求吗?
  • 是的,如果我打开控制台-> 网络选项卡,则不会捕获请求。
【解决方案5】:

试试这个,应该可以的

echo "location.replace('someurl.php')";而不是标题

【讨论】:

    猜你喜欢
    • 2011-04-14
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多