2010-05-27 2 views
2

Я создаю простой веб-сайт. Моя ситуация такая. После регистрации пользователя я хочу перенаправить пользователя после 3 секунд на главную страницу (если регистрация завершается успешно). Код у меня сейчас как нижеПроблема при перенаправлении пользователя после регистрации

$query = "INSERT INTO Privileges VALUES('$user','$password1','$role')"; 

$result = mysql_query($query, $dbcon) 
or die('Registration Failed: ' . mysql_error()); 
print 'Thanks for Registering , You will be redirected shortly'; 

ob_start(); 

echo "Test"; 

header("Location: http://www.php.net"); 

ob_flush() 

Я получаю сообщение об ошибке Предупреждение: Не удается изменить информацию в заголовке - заголовки уже прислал (выход начался в/дома/SRINIVASA/public_html/ThanksForRegistering.php: 27) in/home/srinivasa /public_html/ThanksForRegistering.php в строке 35.

Что мне нужно сделать сейчас?

ответ

2

Для начала удалите и распечатайте заявление и сообщите нам, что произойдет.

+0

Его проблема с выдачей HTTP заголовков после он уже отправил контент. Не стесняйтесь перечитывать его вопрос и откладывать голос. –

+1

Ian здесь правильно ... – Zak

+2

@Ian P: Это не ответ, это должен быть комментарий. – 2010-05-27 20:24:56

1

Вы не можете сделать это с PHP, так как все оценивается до того, как страница будет отправлена ​​клиенту. То, что вы можете сделать, это вывести некоторый JavaScript, который выполняет перенаправление через 3 секунды.

Это будет выглядеть примерно так (я не знаю, PHP очень хорошо, так что я не уверен, что ob_start и ob_flush делать):

$query = "INSERT INTO Privileges VALUES('$user','$password1','$role')"; 

$result = mysql_query($query, $dbcon) 
or die('Registration Failed: ' . mysql_error()); 
print 'Thanks for Registering , You will be redirected shortly'; 
print '<script type="text/javascript">' 
print 'setTimeout(function() { window.location = "http://www.php.net"; }, 3000);' 
print '</script>' 

ob_start(); 
ob_flush(); 
+0

Функции ob выполняют буферизацию вывода. В принципе, когда вызывается start, вывод сохраняется в буфере, он отправляется при вызове ob_flush. Если бы OP поместил ob_start() в начале, проблема не возникла бы, потому что он буферизует вывод и отправляет заголовки перед любым контентом. –

+0

@Arda: Разве это не сделало бы перенаправление без отображения какого-либо текста «Спасибо за регистрацию»? – Claudiu

+0

Правда, но проблема (ошибка) исчезнет. –

0

Вы не можете echo 'test' или напечатать любую другую информацию в браузер затем установите заголовок перенаправления ... Если вы отправляете текст, заголовок для text/html отправляется в браузер, а затем - содержимым.

Единственный способ перенаправления после отправки содержимого без заголовка через javascript. Поэтому, если вы хотите сообщить клиенту что-то перед перенаправлением, вы можете сделать 1 из 2 вещей.

1) отправить JavaScript на странице, которая будет рассчитывать на 3 секунды, затем сделать редирект

2) установить заголовок обновления (до вторя ничего), чтобы обновить ту же самую страницу, и перенаправлять когда обновление происходит.

<?php 

// refresh/redirect to an internal web page 
// ------------------------------------------ 
header('refresh: 5; url=/webdsn/'); 
echo '<h1>You will be re-directed in 5 seconds...</h1>'; 

От быстрого поиска Google по этому адресу: http://www.desilva.biz/php/phprefresh.html

+0

вы правы. Отредактировано, чтобы не вызвать всех людей, игнорирующих «Предупреждение: не удается изменить информацию заголовка, уже отправленные заголовки», предупреждает о задержках. – Zak

+0

Люди уверены, что креативны, когда дело доходит до попыток сделать переадресацию. К сожалению, в спецификации HTTP нет заголовка 'refresh'. –

+0

Мне нужно указать, что я не использовал заголовок обновления в течение длительного времени, но просто помнил об этом. Википедия говорит, что это что-то введенное через оригинальный браузер netscape: http://en.wikipedia.org/wiki/URL_redirection # Refresh_Meta_tag_and_HTTP_refresh_header И не является частью спецификации HTTP. – Zak

1

Для того, чтобы перенаправить пользователя после 3-х секунд, у вас есть два варианта.

Сначала удалите функцию header.

Затем вы можете использовать Javascript:

<script type="text/javascript"> 
    setTimeout('function() {window.location = "http://example.com";}',3000); 
</script> 

Или мета тег обновления в головной секции:

<meta http-equiv="refresh" content="3;url=http://example.com/" /> 

Вы не можете сделать это с PHP в одиночку.

+0

должен исправить ваш JavaScript там, он ничего не сделает, как есть. Если 'redirect()' каким-то образом вызвано, то он будет просто продолжать звонить каждые 3 секунды. – Claudiu

+0

Я понял, что перед вами оставил комментарий и исправил его. –

0

Вместо этого используйте javascript, чтобы текст можно было распечатать на экране.

Вы можете использовать способ here как один из вариантов.

Обязательно укажите ссылку для них, чтобы нажать, если по какой-либо причине javascript не работает в браузере.

1

Вопрос: «Почему вы перенаправляете?». Если вы хотите отправить пользователя на страницу, которую они хотели, прежде чем они должны были зарегистрироваться. И все же дать им дружественное сообщение «Спасибо за регистрацию», вы можете подумать о том, чтобы добавить сообщение об успешном завершении в переменную $_SESSION и повторить ее на целевой странице ,

Что-то вроде:

//process registration 
if($success) { 
    $_SESSION['reg_success']="You're one of us now!"; 
    header("Location: http://www.php.net"); 
    exit; 
} 
//otherwise have another go at registering 
+0

Или, может быть, что-то вроде $ _SESSION ['message'], чтобы можно было отправить сообщение об ошибке. –

0

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

$query = "INSERT INTO Privileges VALUES('$user','$password1','$role')"; 

ob_start(); 

$result = mysql_query($query, $dbcon) 
or die('Registration Failed: ' . mysql_error()); 
print 'Thanks for Registering , You will be redirected shortly'; 


echo "Test"; 

header("Location: http://www.php.net"); 

ob_flush(); 

Это исправит ваше сообщение об ошибке заголовка, но вы будете иметь, чтобы использовать один из других решений, размещенных, чтобы сделать немного редирект с яваскрипта или мета-теги

+0

Не перенаправляет после показа сообщения, как он хочет. –

Смежные вопросы