PHP注册脚本不起作用


PHP Registration Script Not Working

我已经编写了一个运行良好的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仍将添加到数据库中)。

我认为发生这种情况是因为即使给定的if语句的计算结果不为true,die()语句也会被触发。有什么建议吗?

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

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

如果这不起作用,我强烈建议将消息放在die()行中,因为这样您就可以准确地知道错误出现的位置。这样做:

die('This error happened!');

如果在每个die()处都有唯一的消息,则可以判断代码的哪一部分导致它停止(如果有的话)。

最后,把echo "FINISHED!";之类的东西放在脚本的底部,这样你就可以看到脚本是否一直在执行。

以上错误查找方法的组合应该为您指明正确的方向来找出问题所在

祝你好运!