2012-06-25 5 views
0

Можно создать дубликат:
Headers already sent by PHPPHP Header() неисправно

В коде ниже как-то ни один из заголовков не перенаправляют к указанным locations..i не знаю, почему. ..i не посылать и не отдавать эхо любого результата перед вызовом заголовка. также нет случайных «белых пространств», которые также могут привести к неисправности заголовка(). Я также пытался использовать ob_start(), но это было напрасно. также все мои файлы находятся в одной папке, то есть в папке «www» WAMP ..... может кто-нибудь сказать мне, что защелка?

этот код обрабатывает форму, используемую для регистрации нового пользователя ..... метод POST используется

$user= "root" ; 
$host= "localhost" ; 
$password= "" ; 

$database= "online_examination" ; 
$fn=$_POST['fn'] ; // firstname 
$ln=$_POST['ln'] ; // lastname 
$un=$_POST['un'] ; // username 
$pass=$_POST['pw'] ; // password 

$connection= mysql_connect($host,$user,$password) ; 
$db= mysql_select_db($database,$connection); 
$query=" SELECT username FROM user_info " ; 
$result=mysql_query ($query,$connection) ; 

for ($i=0 ; $i<mysql_num_rows($result) ; $i++) 
{ 
    $uname=mysql_result($result,$i,"username") ; 

    if ($un==$uname) 
     { 
      header ("Location : /username_exists.php") ; 
      exit; 
     } 
} 

$query=" SELECT password FROM user_info " ; 
$result=mysql_query ($query,$connection) ; 

for ($i=0 ; $i<mysql_num_rows($result) ; $i++) 
{ 
    $pword=mysql_result($result,$i,"password") ; 
    if ($pass==$pword) 
     { 
      header ("Location : /password_exists.php") ; 
      exit; 
     } 
} 

$query=" INSERT INTO user_info (firstname,lastname,username,password) VALUES 
('$fn','$ln','$un','$pass') " ; 

mysql_query ($query,$connection) 

header ("Location : /successfully_registered.php") ; 
+0

Как это работает? Какие ошибки вы получаете? – j08691

+0

Я предполагаю, что вы включили отчет об ошибках? Также не могли бы вы попытаться отформатировать ваши предложения? – PeeHaa

+0

Также, как устранить эти уязвимости [SQL injection] (http://en.wikipedia.org/wiki/SQL_injection)? – PeeHaa

ответ

-1

Кроме того, убедитесь, что у вас нет пробелов за пределами ваших <?php тегов, так как это приводит текст отправляться в браузер и, если у вас нет буферизации вывода, приведет к ошибке с сообщением «уже отправленные заголовки». Кроме того, у вас очень небезопасная обработка SQL. Любая из ваших переменных может быть использована для успешной инъекции SQL.

+0

нет у меня нет каких-либо пробелов вне тега php – Halo

-1
$connection= mysql_connect($host,$user,$password); 
$db= mysql_select_db($database,$connection); 

Возможно, это связано с ошибкой php. Вам не хватало точек с запятой.

Попробуйте error_reporting (E_ALL); наверху, чтобы дважды проверить наличие ошибок;

+0

извините, но я забыл добавить точки с запятой здесь .... они присутствуют в моем действительном коде – Halo

+0

Включая ту, что на mysql_query ($ query, $ connection)? –

+0

Кроме того, только что протестировав ваш код, расположение заголовка НЕ ​​работает, если оно не выполняется непосредственно двоеточием. Он должен быть заголовком («Местоположение: /successfully_registered.php»); НЕ заголовок («Местоположение: /successfully_registered.php»); –

0

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

$user = 'root'; 
$host = 'localhost'; 
$password = ''; 
$database = 'online_examination'; 

// Attempt to connect to MySQL 
if(!($connection = mysql_connect($host , $user , $password))){ 
    die('Failed to connect to server'); 
}elseif(!($db = mysql_select_db($database , $connection))){ 
    die('Failed to connect to database'); 
} 

// Default values for Form Submitted Fields 
$fn = $ln = $un = $pass = false; 
// Check if Form Submitted 
if($_POST){ 
    // For each value, perform some basic validation before trusting them 
    if(isset($_POST['fn']) && $_POST['fn']!='') 
    $fn = $_POST['fn'] ; // firstname 
    if(isset($_POST['ln']) && $_POST['ln']!='') 
    $ln = $_POST['ln'] ; // lastname 
    if(isset($_POST['un']) && $_POST['un']!='') 
    $un = $_POST['un'] ; // username 
    if(isset($_POST['pw']) && $_POST['pw']!='') 
    $pass = $_POST['pw'] ; // password 
} 

// If a Username was submitted 
if(!$fn || !$ln || !$un || !$pw){ 

    // One or more of the fields were empty or not submitted. 
    // Show the form again (maybe with an error message) 

}else{ 

    // Perform a Query looking for any instances where the same username is already in use 
    $query = 'SELECT COUNT(*) AS matches FROM user_info WHERE username="'.mysql_real_escape_string($un).'"'; 
    $result = @mysql_query($query , $connection) ; 
    if(!$result){ 
    die('Query for Usernames Failed'); 
    } 
    $row = mysql_fetch_array($result) 
    if($row['matches']!=0){ 
    // The Username is already in use 
    if(!headers_sent()){ 
     header('Location: /username_exists.php'); 
    }else{ 
     echo 'Username already in use - <a href="/username_exists.php">Click here</a>'; 
    } 
    die(); 
    } 

    // If we have gotten to this point, the username is OK to use 
    $sqlTpl = 'INSERT INTO user_info (firstname , lastname , username , password) VALUES ("%s" , "%s" , "%s" , "%s")'; 
    $sqlStr = sprintf($sqlTpl , 
    mysql_real_escape_string($fn) , 
    mysql_real_escape_string($ln) , 
    mysql_real_escape_string($un) , 
    mysql_real_escape_string($pw)); 
    $result = mysql_query($sqlStr , $connection); 
    if($result){ 
    if(!headers_sent()){ 
     header('Location: /successfully_registered.php'); 
    }else{ 
     echo 'Successfully registered - <a href="/successfully_registered.php">Click here</a>'; 
    } 
    die(); 
    }else{ 
    // Something went wrong 
    } 
} 

Несколько пунктов из бедра:

  • Looping через все возвращаемые строки и соответствующие их по отдельности является тупым способом проверить, если значение существует. SQL намного лучше справляется с этим - читайте на нем.
  • Выполнение проверки, не используется ли пароль, бессмысленно. Я бы поспорил, что один или два человека в StackOverflow имеют одинаковые пароли, но им не было предложено сообщение «Кто-то уже имеет« abc123 »в качестве пароля. Выберите другой». Во всяком случае, такое сообщение представляет собой угрозу безопасности, а не меру безопасности.
  • Не доверяйте вводам. Предполагая, что будет сообщение POST, это рецепт катастрофы.
  • Так что не проверяйте, какой ввод вы получаете.
  • И тем более не избегать его для использования в запросе базы данных. Google для «Маленьких таблиц Бобби».
  • Если вы собираетесь хранить пароли, вы НИКОГДА НЕ ХОТИТЕ ИХ В ТЕЛЕФОНЕ. Они должны быть хэшированы и соленые. (Опять же, Google - ваш друг.)
  • Предполагая, что вы можете изменять заголовки, нужно делать с осторожностью. Проверка с помощью headers_sent() является хорошей практикой.
  • Всегда проверяйте ошибки, когда идете. Небольшая ошибка в начале, которая может быть обнаружена и прервана любыми последующими действиями, лучше, чем разрешить небольшую ошибку снежком.

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

+0

thnks много Lucanos – Halo