我环顾四周,但似乎找不到任何有关此的信息。我不确定这是我的代码的问题还是内存 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';
?>
任何人都可以帮助或指出我可能犯的任何明显错误吗?
PDO语句::rowCount() returns
...受最后一个影响的行数删除、插入或更新由相应的 PDOStatement 对象执行的语句。
如果关联的 PDOStatement 执行的最后一个 SQL 语句是 SELECT 语句,某些数据库可能会返回该语句返回的行数。然而,无法保证此行为适用于所有数据库,不应依赖于便携式应用程序。
欢迎来到 PDO,在这里,简单的事情有效,不那么简单的事情会毁掉你的一天。 SQLite 是没有可靠的“我的结果集中有多少行?”的驱动程序之一。功能。来自评论:
从 SQLite 3.x 开始,SQLite API 本身发生了变化,现在所有查询都使用“语句”来实现。因此,PDO 无法知道 SELECT 结果的 rowCount,因为 SQLite API 本身不提供此功能。
返回false
from PDO语句::fetch()是“没有返回”的保证,并且您的检查代码完全正常,尽管有点难以阅读。为了您自己的理智,您可能希望考虑包装或派生 PDO 和 PDOStatement。
(免责声明:我是 PDO 粉丝。)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)