2012-08-05 92 views
0

我写了一个PHP注册/登录系统,工作正常。不过,我想补充一些服务器端错误检查,以防止签约,而无需输入密码的用户,来检查密码字段匹配,等等。这里是我的代码:PHP注册脚本不工作

<?php 

session_start(); 

// retrieve data via POST 

$username = $_POST['username']; 
$pass1 = $_POST['pass1']; 
$pass2 = $_POST['pass2']; 
$userLoc = $_POST['userLoc']; // user location is a field on the submitted form 

include("config.php"); 

$username = mysqli_real_escape_string($conn, $username); // clean username input 

// ensure that the two password fields match 
if ($pass1 != $pass2) { 
    header('Location: ../'); 
    die(); 
} 

// ensure that the user didn't bypass maxlength for username 
if(strlen($username) > 30) { 
    header('Location: ../'); 
    die(); 
} 

// ensure that the user actually entered a password 
if(strlen($pass1<3) || strlen($pass2<3)) { 
    header('Location: ../'); 
    die(); 
} 

// check if username already taken 
// I'm using a session variable that causes a div to be displayed on index.php to indicate username taken 
// (I also have AJAX username check already implemented) 

$query = "SELECT 1 FROM users WHERE username='$username'"; 
$result = mysqli_query($conn,$query); 
if ($result && mysqli_num_rows($result) > 0) { 
    $_SESSION['usernameTaken'] = 1; 
    header('Location: ../'); 
} 

// create hash for password 
$hash = hash('sha256', $pass1); 

// create salt for password 
function createSalt() 
{ 
    $string = md5(uniqid(rand(), true)); 
    return substr($string, 0, 3); 
} 

$salt = createSalt(); 
$hash = hash('sha256', $salt . $hash); 

$userLoc = mysqli_real_escape_string($conn, $userLoc); 
$query = "INSERT INTO users (username, password, salt, userLoc) VALUES ('$username' , '$hash' , '$salt' , '$userLoc');"; 
mysqli_query($conn,$query); 
mysqli_close(); 

header('Location: ../'); 

?> 

这里的问题,我无法弄清楚:在那里有die();声明,如果满足任何条件(密码不匹配,用户名已存在等),脚本实际上会自行终止,它将被正确地重定向到index.php (../),并且用户名不会添加到数据库中。但是,即使没有触发错误检查逻辑(换句话说,用户名可用,密码匹配等),用户名也不会被添加到数据库中。我能够得到任何东西添加到数据库的唯一方法是通过摆脱每个die()语句,但这使得它没有错误检查工作(例如,我可以输入不匹配的密码,并且用户名将仍然被添加到数据库,以及散列pass1)。

我认为这是因为die()语句正在触发,即使给定的if语句不计算为真。有什么建议么?

回答

0

要查看您是否遇到MySQL错误,请将此代码放在您的INSERT查询之后。

printf("Errormessage: %s\n", $mysqli->error); 

如果不行,我会高度建议您把die()行内消息,因为你知道确切位置的误差都上来了。像这样做:

die('This error happened!');

如果你必须在每die()独特的信息,你可以告诉代码的一部分,以使它停止 - 如果有的话。最后,在脚本的底部加上echo "FINISHED!";之类的东西,这样你就可以看到脚本是否能够一直执行完毕。

上述错误查找方法的组合应该指出您找出问题所在的正确方向。

祝你好运!

+0

非常感谢!这使我能够发现错误在我的部分中,用于“确保用户实际输入密码”。 (该脚本在到达该部分时终止。)我的后续问题是:任何想法为什么这不起作用? – andrewmc 2012-08-05 22:41:00

+0

这行:'strlen($ pass1 <3)|| strlen($ pass2 <3)'看起来不对。这样做:'if(strlen($ pass1)<3 || strlen($ pass2)<3)' – David 2012-08-05 22:42:17

+0

我仔细查看了这段代码,我简直不敢相信我没注意到..谢谢! – andrewmc 2012-08-05 22:45:39