为什么在查询数据库时此语句返回true

时间:2012-11-03 13:21:35

标签: php mysql pdo

我知道我应该使用prepare语句并清理数据,我只是检查PDO驱动程序

我只是想知道为什么如果我只传递随机数据,查询返回true?

注意这个PDO :: query - 执行一条SQL语句,将结果集作为PDOStatement对象返回

    $dbuser = 'root';
$dbpass = 'root';
$formpost = false;
try
{
    $dbh = new PDO('mysql:host=127.0.0.1;dbname=loginexample', $dbuser, $dbpass);
} catch (PDOException $e) {
    print "Error!: " . $e->getMessage() . "<br/>";
    die();
}
if(!empty($_POST['username']) && !empty($_POST['password']))
{
    $formpost = true;
    $username = $_POST['username'];
    $password = $_POST['password'];
}

if($dbh && $formpost)
{
    $sql= "SELECT username, password FROM user WHERE username='$username' AND password='$password'";
    if($dbh->query($sql))
    {
        echo 'true';
    }
}

4 个答案:

答案 0 :(得分:3)

除非查询导致错误,否则

PDO::query始终返回PDOStatement个对象。 (返回没有行不是错误。)在PHP中,任何对象都将计算为布尔true,因此if条件将通过。

答案 1 :(得分:3)

因为PDO::query()返回 PDOStatement 对象来表示结果集。即使没有返回任何结果,查询仍然成功(即它不包含语法错误,表存在等)。

要检查空虚,可以使用fetchAll()并在其上运行count()功能。

答案 2 :(得分:1)

这一行:if($dbh->query($sql))可能不会返回包含任何已找到记录的对象,但它仍返回一个对象。例如,一个可能告诉您找到的行数等于零的对象。

根据找到的记录数量尝试返回true或false ....

答案 3 :(得分:0)

  

PDO :: query()返回PDOStatement对象,或者失败时返回FALSE。

我的猜测是查询成功获得匹配的所有零行