PDO SQLite查询零结果问题

Nev*_*kes 4 php sqlite pdo

我已经环顾四周,但似乎无法找到任何相关信息.我不确定这是我的代码的问题,还是内存中SQLite数据库和PDO的已知问题.

基本上,在将单行插入到内存中的SQLite数据库表之后,我希望查询与插入的项不匹配以返回零行.但是,以下代码给出了单行(false)但没有实际的PDO错误代码.

<?php

    // Create the DB
    $dbh = new PDO('sqlite::memory:');
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // Data we'll be using
    $name = 'Entry';

    // Create DB table
    $dbh->query('
        CREATE TABLE
            Test
            (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                name VARCHAR(50) NOT NULL
            )
    ');

    // Insert data
    $stmt = $dbh->prepare('
        INSERT INTO
            Test
            (
                name
            )
        VALUES
            (
                :name
            )
    ');

    $stmt->bindParam(':name', $name, PDO::PARAM_STR, 50);
    $stmt->execute();

    // Check data has actually been inserted
    $entries = $dbh->query('
        SELECT
            *
        FROM
            Test
    ')->fetchAll(PDO::FETCH_ASSOC);

    var_dump($entries);

    // Query DB for non-existent items
    $stmt = $dbh->prepare('
        SELECT
            *
        FROM
            Test
        WHERE
            name != :name
    ');

    $stmt->bindParam(':name', $name, PDO::PARAM_STR);
    $stmt->execute();

    // How many rows returned
    echo $stmt->rowCount();

    // Actual data returned
    var_dump($stmt->fetch(PDO::FETCH_ASSOC));
?>
Run Code Online (Sandbox Code Playgroud)

我设法用一些hackery来解决这个问题,但不必这样做很好:

<?php

    echo (
        (0 == $stmt->rowCount()) || 
        (
            (1 == $stmt->rowCount()) && 
            (false === (($row = $stmt->fetch(PDO::FETCH_ASSOC)))) && 
            ('0000' == array_pop($dbh->errorInfo()))
        )
    ) ? 'true' : 'false';

?>
Run Code Online (Sandbox Code Playgroud)

任何人都可以帮助或指出我可能犯过的任何明显错误吗?

Cha*_*les 13

PDOStatement :: rowCount()返回

...受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数.

如果关联的PDOStatement执行的最后一个SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数.但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序.

欢迎来到PDO,这里有简单易用的东西,不那么容易的东西会让你感到烦恼.SQLite是没有可靠"我的结果集中有多少行?"的驱动程序之一.功能.来自评论:

从SQLite 3.x开始,SQLite API本身发生了变化,现在所有查询都是使用"语句"实现的.因此,PDO无法知道SELECT结果的rowCount,因为SQLite API本身不提供此功能.

的回报率falsePDOStatement对象:: fetch()方法是保证"没有回来,"和你的检查代码是完全理智的,如果有点难以阅读.您可能希望考虑包装或衍生自PDO和PDOStatement以获得您自己的理智.

(免责声明:我是PDO粉丝.)