0

我编写了一个运行良好的 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语句没有评估为真,语句也会被触发。有什么建议么?

4

1 回答 1

0

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

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

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

die('This error happened!');

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

最后,在脚本的底部放置类似echo "FINISHED!";的内容,这样您就可以查看脚本是否一直执行。

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

祝你好运!

于 2012-08-05T22:24:31.567 回答