-3

我知道我应该使用准备语句并清理数据我只是检查 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

4 回答 4

3

PDO::query始终返回一个PDOStatement对象,除非查询导致错误。(不返回任何行不是错误。)在 PHP 中,任何对象的计算结果都会为 boolean true,因此if条件会通过。

于 2012-11-03T13:25:51.440 回答
3

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

要检查是否为空,您可以使用fetchAll()并在其上运行一个count()函数。

于 2012-11-03T13:26:09.593 回答
1

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

尝试根据找到的记录数返回真或假......

于 2012-11-03T13:26:17.867 回答
0

PDO::query() 返回一个 PDOStatement 对象,如果失败则返回 FALSE。

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

于 2012-11-03T13:25:32.090 回答