【发布时间】:2015-02-01 11:23:06
【问题描述】:
我环顾四周,但似乎找不到任何关于此的信息。我不确定这是我的代码问题还是内存中 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));
?>
我已经设法用一些hackery解决了这个问题,但最好不必这样做:
<?php
echo (
(0 == $stmt->rowCount()) ||
(
(1 == $stmt->rowCount()) &&
(false === (($row = $stmt->fetch(PDO::FETCH_ASSOC)))) &&
('0000' == array_pop($dbh->errorInfo()))
)
) ? 'true' : 'false';
?>
谁能帮助或指出我可能犯的任何明显错误?
【问题讨论】:
-
仅仅因为你可以写一个复杂的单个表达式并不意味着你应该。
-
不确定您指的是代码的哪一部分?作为替代方案,您有什么建议?