【问题标题】:Problem with codeigniter's redirect functioncodeigniter 的重定向功能有问题
【发布时间】:2011-06-07 00:03:18
【问题描述】:

这可能是一个 n00b 主题,但无论如何,我在这个错误上遇到了相当困难和奇怪的时间。基本上,我正在为显示表单的页面开发一种控制器方法。基本上,我通过 var 使用 codeigniter 的 $this->input->post 函数转储表单输入来调试表单的提交数据,如下所示:

var_dump($this->input->post('first_name'));

每隔一天这都有效,但今天我发现当我将 post 变量转储到浏览器时,它会返回 false,就好像它们没有值一样,即使它们在我提交表单时确实有值。然后我尝试通过 PHP 的 POST 超全局数组直接访问变量,如下所示:

var_dump($_POST['first_name']);

这也返回了空,所以我尝试像这样转储整个帖子数组:

var_dump($_POST);

尽管我填写了整个表格,但它也是空的。尽管如此,我的 MySQL 数据库中的记录正在更新(这意味着即使我的 $_POST 变量显示为空,表单也在提交)。

另外,我推断通常,如果我在重定向函数调用之前在控制器函数中转储变量,它应该给我一个“标头已发送”错误,但它从来没有。它只是将我重定向到假定的成功页面,而不是转储我的变量。

所以在大约 2 小时内,我认为我的 POST 数据没有被发送并重新检查代码是否有错误,并开始一一注释掉语句,直到我在脚本中找到罪魁祸首语句。

最后,我注释掉了一段设置成功消息和重定向的代码,如下所示:

/*
if($record_updated_successfully)
{
    $this->session->set_flashdata('success', $this->lang->line('record-updated-successfully'));
}
redirect('admin/success_page');
*/

然后脚本才开始使用 codeigniter 的 $this->input->post 函数以及 $_POST 超全局数组转储我之前的所有变量转储。

好吧,如果脚本确实重定向了我,尽管变量转储在发送标头之前发送输出,那么我可以看到为什么 $_POST 变量会显示为空。

那么真正的问题是,尽管我在发送标头之前发送了输出,为什么脚本仍然会重定向?有没有人经历过这种情况?

对此的任何帮助将不胜感激。

编辑:关于加载视图,我的脚本的简化版本如下所示 使用调试 var dump 语句:

function some_controller_method() {
    var_dump($this->input->post());
    var_dump($_POST);

    // some code

    if($this->input->post('form_action') == 'update record') {
        // code that runs when the form is submitted
        /*
         * ...
         */

        if($record_updated_successfully)
        {
            $this->session->set_flashdata('success', $this->lang->line('record-updated-successfully'));
        }
        redirect('admin/success_page');
    }

    $this->load->view('my-view-file.php');
}

【问题讨论】:

    标签: php codeigniter redirect header superglobals


    【解决方案1】:

    虽然我不能确定,但​​我会假设您正在输出视图文件中的 var_dump() 之类的内容。一个视图在你调用它的时候并没有被执行,例如:

       $this->load->view('some_view');
       echo "hi!";
    

    在控制器中不会导致某些视图的内容后跟“hi”。它将导致“hi”后跟一些视图的内容。视图实际上是在控制器中的其他所有内容运行后输出的。

    这是您提供的信息唯一想到的。我必须查看更多代码才能提供不同的诊断。

    【讨论】:

    • 您好 Erik,为了回答您的问题,我在控制器中调用了 var_dump 方法,然后再加载任何视图。我编辑了我的问题以显示我的函数的简化版本。
    • 您对问题的描述有问题。您声称 $_POST 未填充,但您的重定向位于取决于帖子值的条件内。
    • 不,该变量 $record_updated_successfully 是通过调用模型函数设置的,无论如何,我在问题快要结束时说,我理解为什么 $_POST 超全局为空。我的问题真的是为什么调用重定向函数,它可能会调用 PHP 自己的头函数(例如 header('Location: somesite.com')),为什么它会重定向我,尽管我将输出回显或 var_dumped 到浏览器在发送标头之前。在某种程度上,我在问为什么它不会以“已发送标头...”错误来停止脚本执行。我可能措辞不清楚
    • 我知道它何时会重定向我的唯一情况,即使我在发送标头之前将输出发送到浏览器是当我打开输出缓冲但据我所知我没有在我的脚本中打开了任何位置,我认为 Codeigniter 也不会默认打开它。所以这就是为什么我很困惑。无论如何,很抱歉最初的问题令人困惑而不是重点。我只是想提供足够的背景信息。
    • 重定向是一个标头。如果您在标头之前向浏览器发送了任何东西(实际上是发送了一些东西),它将无法正常工作。这是所有浏览器的生活事实。你可能认为你已经发送了一些东西然后被重定向,但你没有。
    【解决方案2】:

    我遇到了“相同”的问题,我在代码的循环中发现了一个 unset() 函数。也许这会有所帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-09-16
      • 1970-01-01
      • 1970-01-01
      • 2015-02-10
      • 2015-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多