Как перенаправить на другую страницу на php после заполнения формы?
У меня есть регистрационная форма на сайте, который я создаю. Если он заполнен правильно, я хочу, чтобы пользователь вернулся на главную страницу.
Я пытался использовать header
, но я получаю "Не могу изменить информацию заголовка..." Я думаю, это происходит потому, что я публикую в $_SERVER['PHP_SELF']
;
Любые предложения о том, как я могу перенаправить пользователя, если форма в порядке? (Кроме страницы успеха с кнопкой)
3 answers
Вы можете использовать функцию header()
только в том случае, если веб-сервер не выводил другие текстовые/строковые данные в браузер пользователя.
Вам нужно будет поместить логику перенаправления в начало вашего скрипта, прежде чем что-либо еще:
<?php
// Process form
// If processing was successful, redirect
if($success)
{
header("Location: http://www.main-page-url.com/");
}
?>
Причина этого в том, что когда браузер получает информацию с веб-сервера, он получает HTTP-заголовок (на который функция header()
выводит перенаправление), а затем выводит тело HTTP-ответа после HTTP-заголовка. Если ваш сценарий echo
вводит что-либо перед командой заголовка, вы будете продолжать получать эту ошибку.
Вы получаете сообщение невозможно изменить информацию о заголовке, потому что вы пытаетесь отправить новые заголовки в браузер после того, как содержимое было отображено на странице. Если вы выполните вызов header() перед любыми вызовами echo/print, он будет перенаправлен. В противном случае вам понадобится мета-перенаправление. Место, куда вы отправляете форму, не имеет значения.
Причина, по которой это не работает, заключается в том, что заголовки предшествуют содержимому в HTTP-запросе. Когда вы выводите контент, PHP опережает игру, отправляя все заголовки и весь контент, который он обработал до сих пор. Для отправки HTTP-запросов нет CTRL+Z, поэтому функция header()
не может добавлять заголовки после их отправки.
Однако вы можете вызвать header()
после того, как содержимое будет отражено, если вы используете семейство функций буферизации ob. Вызовите ob_start()
для буферизации вывода страницы, сделайте все необходимые вызовы заголовка или вывод содержимого и, наконец, отправка вывода с помощью ob_end_flush()
. Например
<?php
ob_start(); //Start buffering
?>
<p>This is output!!!</p>
<?php
header('403 Moved Permanently'); //Fancy redirect is fancy
ob_end_flush(); //Send page content with redirect header
?>
Единственным возможным недостатком использования буферизации является то, что пользователь будет испытывать небольшое зависание при получении содержимого до тех пор, пока не будет вызвана команда ob_end_flush()
. Скорее всего, это не будет заметно, так что вам не стоит беспокоиться об этом!
Прежде чем пройти через все это, вы могли бы рассмотреть возможность перемещения всех ваших вызовов заголовка в место до того, как содержимое будет выведено в вашем коде. Также проверьте открытие тега PHP для предыдущих пробелов, так как они заставят отправлять заголовки и содержимое.