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