2010-08-04 2 views
0

Я пишу сценарий входа. Мой db.php does not echo/print ничего, поэтому почему doesnt header ("Location: index.php"); перенаправлять при успешном входе в систему? информация для входа верна. Я знаю, что мне нужно санировать вход, но это не проблема на данный момент.Почему мой PHP-редирект не работает?

<?php 
     require('db.php'); 
     $username = $_POST['un']; 
     $password = $_POST['pw']; 
     $qry="SELECT uid FROM users WHERE name='$username' AND pass='".md5($password)."'"; 
     $result=mysql_query($qry); 
     if(mysql_num_rows($result) == 1){ 
      session_regenerate_id(); 
      $user = mysql_fetch_assoc($result); 
      $_SESSION['S_UID'] = $user['uid']; 
      session_write_close(); 
      header("Location: index.php"); 
      exit(); 
     }else{ 
      echo "<center><form action='index.php' name='login'>Login failed! Please try again with correct username and password.<br><input type='submit' name='failed' value='Return to Login'></form></center>"; 
      exit(); 
     } 
    ?> 
+0

Попробуйте удалить вызов 'exit()' и посмотреть, работает ли он. – NullUserException

+0

Что происходит вместо этого? – Artefacto

+0

@NullUserException: по какой причине? – zerkms

ответ

2

заголовок функции будет работать, только если вызов не был отправлен сценарием до вызова функции. Убедитесь, что какие-либо коды, приведенные выше, что-то повторили.

Если нет, проверьте, что в указанных выше файлах нет дополнительного места или новой строки после закрытия тега «?>». В противном случае это пространство или новая строка будут отправлены в браузер перед вашим заголовком.

+0

Я даже не думал о пробеле после моего/закрытия/php-тега .... у меня был один. – Dacto

+0

Извините, если моя память не перестает меня ... если какой-либо вывод отправлен, и вы пытаетесь изменить заголовок, это вызовет php для исключения исключений ... Я думаю, что это должно быть что-то с URL-адресом, который он перенаправление на ... –

+0

Общей практикой, которую я сейчас делаю, является устранение последнего закрытия PHP «?>». скрипты все равно будут работать, и нет никакой опасности для этого дополнительного пространства. Другой способ - включить буферизацию вывода на самой верхней части файла. Это предотвратит отправку anythings в браузер до конца обработки (или, по крайней мере, до вызова ob_flush). – iWantSimpleLife

0

Вы уверены, что выходные данные не производятся нигде в сценарии (или db.php)? Даже нескольких посторонних пространств?

+0

Он/она должен получать ошибки (то есть: уже отправленные заголовки), если это так. Включить отчет об ошибках (например: 'error_reporting (E_ALL)') – NullUserException

0

Попробуйте использовать полный URL, например:

header("Location: http://www.mysite.com/index.php"); 

Некоторые браузеры (спасибо IE) не понимают код 301 редиректа с незаконченной URI.

Этот заголовок поведение расположение в PHP является хорошим инструментом, но легко быть реализованы в неправильном сценарии ... для этой цели я бы рассмотреть возможность использования require() вместо header(location)

как:

if (!imLoggedIn()){ 
    require('loginForm.php'); 
    exit; 
} 
Смежные вопросы