Я весь день рвал на себе волосы этим. Я вижу одинаковое поведение как в Windows, так и в Linux.
Простые примеры на этом и других сайтах прекрасно работают, демонстрируя, как параметризованные запросы работают с SQLite (с использованием класса SQLite3). Однако те же примеры не работают при использовании класса PDO — они возвращают ноль строк. Я не могу найти причину для этого.
Вот мой тестовый PHP-скрипт, который дважды выполняет одно и то же: сначала через SQLite3, а затем через PDO. Первая возвращает вставленную строку, вторая — нет, хотя вставленная строка существует в базе данных. Что я делаю не так?
<?php
echo "connecting via SQLite3<BR>";
unlink('mysqlitedb.db');
$db = new SQLite3('mysqlitedb.db');
$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'This is a test')");
$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);
$result = $stmt->execute();
var_dump($result->fetchArray());
echo "<P>Connecting via PDO<BR>";
unlink('mysqlitepdo.db');
$db = new PDO('sqlite:mysqlitepdo.db');
$db->exec('CREATE TABLE foo (id INTEGER, bar STRING)');
$db->exec("INSERT INTO foo (id, bar) VALUES (1, 'This is a test')");
$stmt = $db->prepare('SELECT bar FROM foo WHERE id=:id');
$stmt->bindValue(':id', 1, SQLITE3_INTEGER);
$result = $stmt->execute();
var_dump($result->fetchArray());
?>
Когда этот скрипт выполняется, он возвращает:
connecting via SQLite3
array(2) { [0]=> string(14) "This is a test" ["bar"]=> string(14) "This is a test" }
Connecting via PDO
Fatal error: Call to a member function fetchArray() on a non-object in D:\docs\LRRSA\LRRSA_site\MCC\foobar.php on line 28
Я предполагаю, что фатальная ошибка вызвана тем, что для varDump строки не возвращаются.
Я уверен, что это что-то очевидное, но если это так, то это слишком очевидно для меня 🙂
Библиотеки (SQLite vs PDO) семантически практически одинаковы, но под капотом есть некоторые различия.
Например, с PDO execute()
метод PDOStatement либо возвращает false
или же true
а не результат. Итак, когда вы делаете:
$result->fetchArray();
Вы в основном делаете:
true->fetchArray();
Что, конечно, не является допустимым методом (так как true не имеет методов, будучи логическим). Вы можете получить результаты из выполненного оператора PDO с помощью fetchAll () Метод на самом утверждении:
$stmt->fetchAll();
Других решений пока нет …