【问题标题】:Why does $stmt->execute always return true?为什么 $stmt->execute 总是返回 true?
【发布时间】:2017-10-08 01:18:15
【问题描述】:

即使输入的id 无法识别,$stmt->execute 仍然返回 true,因此程序永远不会输出“错误的 ID 或密码!”。我做错了什么?

$id = $_POST["id"];
$pwd = $_POST["pwd"];

include("./sql/connect.php");

$stmt = $db->prepare("SELECT * FROM list WHERE id = :id AND pwd = :pwd");

$stmt->bindValue(":id", $id);
$stmt->bindValue(":pwd", $pwd);

if($stmt->execute()){
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)){
        echo $row["name"];
    }
}else{
    echo "Wrong ID or Password!";
}

【问题讨论】:

  • 为什么它应该返回true?
  • 从不存储纯文本密码。您应该改用password_hash()password_verify()。如果您使用的是 5.5 之前的 PHP 版本,请不要使用 MD5 或 SHA1 来散列密码。相反,您可以使用this compatibility pack
  • 这里没有return - 只有echo,你想检查是否没有行返回吗?
  • $stmt->execute() Returns TRUE on success or FALSE on failure.没有 anny 匹配的错误 ID 仍将正确执行...阅读php.net/manual/en/pdostatement.execute.php
  • 返回零行的查询不是错误,它只是一个空结果。

标签: php mysql database pdo


【解决方案1】:

您的查询没有失败,它返回 0 个结果,因此 $stmt->execute() 在这种情况下将返回 true。一个简单的解决方法是将结果传递给数组并检查它是否为空。 查看PDOStatement::rowCount 中的Example #2 Counting rows returned by a SELECT statement,它解释了为什么不应该将rowCount 用于SELECT,以及一种简单的方法来做同样的事情,但首先使用第二个查询来计算返回的行数。就我个人而言,我不会使用第二个查询,所以这里是编辑后的示例。

if($stmt->execute()) {
    $out = [];
    while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
        $out[] = $row["name"];
    }
    if(empty($out)) {
       echo "no matching user is found";
    } else {
       // rest of your code
    }
} else {
    return $db->errorInfo();
}

PS:我必须感谢对此投反对票的人。谢谢,答案确实需要编辑。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-29
    • 2012-04-03
    • 2021-09-11
    • 2015-05-12
    • 1970-01-01
    相关资源
    最近更新 更多