2012-09-19 36 views
2

我想比較兩個密碼,以確保它們匹配並重定向,如果不使用PHP。我編寫了這些代碼,但即使密碼不匹配,if語句中的代碼也不會執行。PHP如果語句不執行,即使真正

<?php 
include 'includes/dbcnx.php'; 
$username = $_POST['username']; 
$password = $_POST['password']; 
$pass2 = $_POST['pass2']; 
$email = $_POST['email']; 

if($password != $pass2) 
    header('Location: register_form.php'); 
if(strlen($username)>30) 
    header('Location: register_form.php?error=1&usrlen=1'); 

$username = mysql_real_escape_string($username); 
$email = mysql_real_escape_string($email); 
$salt = createSalt(); 
$hash = hash('sha256',$salt.$hash); 
mysql_select_db("sealion"); 
$query = "INSERT INTO users (username, password, salt, email) 
     VALUES ('$username','$hash','$salt','$email');"; 
mysql_query($query); 
header('Location: index.php'); 
?> 
+1

你是如何確認它沒有執行該行的? – martincho

回答

0

代碼執行,但header()不會停止它自己正在執行的代碼的其餘部分:

if($password != $pass2) 
{ 
    header('Location: register_form.php'); 
    exit; 
} 

關於這一點,你的代碼可能會更容易,如果你把閱讀條件語句中的整套操作。

if($password != $pass2) 
{ 
    header('Location: register_form.php'); 
} 
else if(strlen($username)>30) 
{ 
    header('Location: register_form.php?error=1&usrlen=1'); 
} 
else 
{ 
    // Do your updates here... 
} 

這將使您的代碼更易於在下一章閱讀(或者,如果你回來,在半年的時間) - 也將使它不可能多個動作發生。

+0

是的,我可以看到,這將是一個更優雅的做法,歡呼。 – dinners

0

您在腳本結束時再次改變Location頭:

if(strlen($username)>30) 
    header('Location: register_form.php?error=1&usrlen=1'); 
/* ... */ 
header('Location: index.php'); 

我的猜測是if塊被正確執行,但在調用header()功能的第二時間更改標題。嘗試使用if-else代替:

if(strlen($username)>30) { 
    header('Location: register_form.php?error=1&usrlen=1'); 
} 
else { 
    $username = mysql_real_escape_string($username); 
    $email = mysql_real_escape_string($email); 
    $salt = createSalt(); 
    $hash = hash('sha256',$salt.$hash); 
    mysql_select_db("sealion"); 
    $query = "INSERT INTO users (username, password, salt, email) 
      VALUES ('$username','$hash','$salt','$email');"; 
    mysql_query($query); 
    header('Location: index.php'); 
} 
1

header重定向命令後,您需要exit;否則代碼只是繼續運行,從而重複頭命令 - 您發送的最後一個是作用的一個。

+0

啊,太棒了,那整理它!我一直認爲header命令退出了代碼本身...... doh!謝謝! – dinners