#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()
функцию в цикле в моем коде. Возможно, это поможет.