【发布时间】:2019-06-15 02:50:57
【问题描述】:
我的网站上有一个注册表单,每当有新用户注册时,都会运行以下代码:
$sql = "SELECT * FROM users WHERE uidUsers=?;";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt)) {
header("Location: ../signup.php?error=sqlerror");
exit();
}
else {
mysqli_stmt_bind_param($stmt, "s", $username);
mysqli_stmt_execute($stmt);
$resultCheck = mysqli_stmt_num_rows($stmt);
if ($resultCheck > 0) {
header("Location: ../signup.php?error=usertaken");
exit();
}
else {
$hashedPwd = password_hash(PASSWORD_DEFAULT, $password);
$sql = "INSERT INTO users (`uidUsers`, `pwdUsers`, `phraseUsers`) VALUES(?,
?, ?)";
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt)) {
header("Location: ../signup.php?error=sqlerror");
exit();
}
else {
mysqli_stmt_bind_param($stmt, "sss", $username, $hashedPwd,
$securityphrase);
mysqli_stmt_execute($stmt);
header("Location: ../login.php?signup=success");
exit();
}
!mysqli_stmt_prepare 错误处理程序在不应该给出数据库环境以及正确的INSERT 语句时被触发。因此我不明白为什么会触发它,我在问为什么?
Stack Overflow 上也有类似的问题
【问题讨论】:
-
将
$sql添加到通话中,否则它不知道您要准备什么。mysqli_stmt_prepare($stmt, $sql) -
请阅读有关您正在使用的功能的文档。除了上述之外,你还有
password_hash中的args顺序错误... -
如果没有可访问的绑定,您将无法准备。您需要将所有用于准备、绑定和执行的调用放在一个条件中,有条件地拆分它会失败。
-
这也很难阅读。您应该使用一致的缩进方法。
-
尝试检查mysqli errors 找出为什么它失败了。
标签: php mysql mysqli prepared-statement