Проблема с функцией перенаправления codeigniter

#php #codeigniter #redirect #header #superglobals

#php #codeigniter #перенаправление #заголовок #суперглобальные

Вопрос:

Возможно, это тема n00b, но, в любом случае, у меня было довольно сложное и странное время с этой ошибкой. В основном я работал над методом контроллера для страницы, которая отображает форму. В принципе, я отлаживал отправленные данные формы, var сбрасывал входные данные формы с помощью $this->input->post функции codeigniter следующим образом:

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

Через день это срабатывало, но сегодня я обнаружил, что когда я сбрасывал переменные post в браузер, они возвращали false, как если бы у них не было значений, хотя они имели значения, когда я отправлял форму. Затем я попытался получить доступ к переменным через PHP POST superglobal array напрямую, вот так:

 var_dump($_POST['first_name']);
  

и это тоже вернуло пустоту, поэтому я попытался сбросить весь массив post следующим образом:

 var_dump($_POST);
  

и она также была пустой, несмотря на то, что я заполнил всю форму. Тем не менее, записи в моей базе данных MySQL обновлялись (что означает, что форма отправлялась, даже несмотря на то, что мои переменные $ _POST казались пустыми).

Кроме того, я предположил, что обычно, если я сбрасываю переменные var в функции контроллера перед вызовом функции перенаправления, это должно выдавать мне ошибку «Заголовки уже отправлены», но этого так и не произошло. Он просто перенаправил меня на предполагаемую страницу успеха вместо сброса моих переменных.

Итак, в течение примерно 2 часов я думал, что мои данные POST не отправляются, и повторно проверил код на наличие ошибок и начал комментировать операторы один за другим, пока не смог найти оператор culprit в моем скрипте.

Наконец, я закомментировал фрагмент кода, который выдает сообщение об успешном завершении и перенаправляет, вот так:

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

и только тогда скрипт начал выгружать все мои предыдущие дампы переменных, используя $this->input->post функцию codeigniter, а также $_POST суперглобальный массив.

Итак, хорошо, если скрипт действительно перенаправляет меня, несмотря на дампы переменных, отправляющие выходные данные перед отправкой заголовков, тогда я могу понять, почему переменные $ _POST будут казаться пустыми.

Итак, тогда реальный вопрос заключается в том, почему скрипт все еще перенаправляет, несмотря на мою отправку выходных данных до отправки заголовков? Кто-нибудь когда-нибудь сталкивался с этим?

Любая помощь с этим была бы оценена.

РЕДАКТИРОВАТЬ: что касается загрузки представления, вот упрощенная версия моего скрипта, похожая на отладочные инструкции дампа var:

 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');
}
  

Ответ №1:

Хотя я не могу быть уверен, я собираюсь предположить, что вы выводили такие вещи, как var_dump () в вашем файле просмотра. Представление не выполняется во время его вызова, например:

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

В контроллере не будет отображаться содержимое некоторого представления, за которым следует «hi». Результатом будет «hi», за которым следует содержимое некоторого представления. Представление фактически выводится после запуска всего остального в контроллере.

Это единственное, что приходит на ум из представленной вами информации. Мне пришлось бы просмотреть больше кода, чтобы предложить другой диагноз.

Комментарии:

1. Что-то не так в вашем описании проблемы. Вы утверждаете, что $_POST она не заполнена, но ваше перенаправление находится внутри условия, которое зависит от значения post.

2. Нет, эта переменная $record_updated_successfully устанавливается с помощью вызова функции модели, и в любом случае я сказал ближе к концу своего вопроса, что я понял, почему суперглобальный $ _POST был пуст. Мой вопрос действительно заключался в том, почему вызов функции перенаправления, которая, вероятно, может вызывать собственную функцию заголовка PHP (например, header(‘Location: somesite.com ‘ )), почему это перенаправило бы меня, несмотря на тот факт, что я повторил или отправил вывод var_dumped в браузер перед отправкой заголовков. В некотором смысле, я спрашиваю, почему это не остановило бы выполнение скрипта с ошибкой «Заголовки уже отправлены …». Вероятно, я сформулировал это неясно

3. Единственное известное мне обстоятельство, когда это перенаправляло меня, даже если я отправлял вывод в браузер до отправки заголовков, — это когда у меня включена буферизация вывода, но, насколько я знаю, я нигде не включал have в своих скриптах, и я не думаю, что Codeigniter также включает его по умолчанию. Так вот почему я в замешательстве. В любом случае, извините за то, что исходный вопрос был запутанным и не по существу. Я просто хотел дать достаточно справочной информации.

4. Перенаправление — это заголовок. Если вы отправили что-либо — фактически отправили что-либо — в браузер до заголовка, это не сработает. Это факт жизни для всех браузеров. Вы можете подумать, что отправили что-то, а затем перенаправили, но это не так.

Ответ №2:

У меня была «та же самая» проблема, и я обнаружил unset() функцию в цикле в моем коде. Возможно, это поможет.