PDO SQLite запрос с нулевым результатом

Я осмотрелся, но не могу найти никакой информации об этом. Я не уверен, что это проблема с моим кодом или известной проблемой с базами данных 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)); ?> 

Мне удалось решить проблему с некоторыми хакерами, но было бы неплохо не делать этого:

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

Может ли кто-нибудь помочь или указать какие-либо вопиющие ошибки, которые я, возможно, сделал?

PDOStatement :: rowCount () возвращает

… количество строк, затронутых последним оператором DELETE, INSERT или UPDATE, выполняемым соответствующим объектом PDOStatement.

Если последний оператор SQL, выполняемый связанным с ним PDOStatement, был оператором SELECT, некоторые базы данных могут возвращать количество строк, возвращаемых этим оператором . Однако это поведение не гарантируется для всех баз данных и не должно полагаться на переносные приложения.

Добро пожаловать в PDO, где работает легкий материал, и не очень легкий материал разрушает ваш день. SQLite – один из драйверов, который не имеет надежного «сколько строк в моем результирующем наборе?» функция. Из комментариев:

Начиная с SQLite 3.x, сам SQLite API изменился, и теперь все запросы реализованы с помощью «операторов». Из-за этого PDO не знает, как узнать результат rowCount результата SELECT, потому что сам SQLite API не предлагает эту возможность.

Возврат false из PDOStatement :: fetch () является гарантией того, что «ничего не вернулось», и ваш проверочный код полностью нормальный, если немного трудно читать. Вы можете рассмотреть возможность упаковки или получения PDO и PDOStatement для вашего собственного здравомыслия.

(Отказ от ответственности: я фанат PDO.)