我写了一个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
语句不计算为真。有什么建议么?
非常感谢!这使我能够发现错误在我的部分中,用于“确保用户实际输入密码”。 (该脚本在到达该部分时终止。)我的后续问题是:任何想法为什么这不起作用? – andrewmc 2012-08-05 22:41:00
这行:'strlen($ pass1 <3)|| strlen($ pass2 <3)'看起来不对。这样做:'if(strlen($ pass1)<3 || strlen($ pass2)<3)' – David 2012-08-05 22:42:17
我仔细查看了这段代码,我简直不敢相信我没注意到..谢谢! – andrewmc 2012-08-05 22:45:39