Как перенаправить на другую страницу на php после заполнения формы?


У меня есть регистрационная форма на сайте, который я создаю. Если он заполнен правильно, я хочу, чтобы пользователь вернулся на главную страницу.

Я пытался использовать header, но я получаю "Не могу изменить информацию заголовка..." Я думаю, это происходит потому, что я публикую в $_SERVER['PHP_SELF'];

Любые предложения о том, как я могу перенаправить пользователя, если форма в порядке? (Кроме страницы успеха с кнопкой)

Author: AYBABTU, 2011-01-26

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 вводит что-либо перед командой заголовка, вы будете продолжать получать эту ошибку.

 8
Author: Jason Miller, 2011-10-21 22:44:21

Вы получаете сообщение невозможно изменить информацию о заголовке, потому что вы пытаетесь отправить новые заголовки в браузер после того, как содержимое было отображено на странице. Если вы выполните вызов header() перед любыми вызовами echo/print, он будет перенаправлен. В противном случае вам понадобится мета-перенаправление. Место, куда вы отправляете форму, не имеет значения.

 1
Author: Spechal, 2011-01-26 00:17:23

Причина, по которой это не работает, заключается в том, что заголовки предшествуют содержимому в 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 для предыдущих пробелов, так как они заставят отправлять заголовки и содержимое.

 1
Author: Bailey Parker, 2011-01-26 00:31:40