为什么$ stmt->执行总是返回true?

时间:2017-05-09 16:03:17

标签: php mysql database pdo

即使无法识别输入的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!";
}

1 个答案:

答案 0 :(得分:0)

您的查询未失败,返回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:我要感谢这位选民。谢谢,答案真的需要编辑。