【问题标题】:Prepared statement fails when it shouldn't准备好的语句在不应该时失败
【发布时间】: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


【解决方案1】:

感谢大家的帮助,password_hash命令所在的问题,应该是password_hash($var, PASSWORD_DEFAULT);这样的。我犯的第二个错误是在mysqli_stmt_prepare 中没有包含我的$sql 语句,应该是这样的!mysqli_stmt_prepare($stmt, $sql)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-29
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-07
    • 2014-03-16
    • 2018-02-21
    相关资源
    最近更新 更多