2015-12-30 2 views
1

Я весь день срывал свои волосы. Я вижу такое же поведение как для Windows, так и для Linux.Есть ли разница между подготовленными запросами в PDO и SQLite3?

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

Я уверен, что это что-то очевидно, но если это так, что это слишком очевидно для меня :-)

ответ

2

библиотек (SQLite против PDO) семантически почти то же самое, но под капотом есть некоторые различия ,

Например, с PDO execute() метод PDOStatement returns either false or true, а не набор результатов. Так что, когда вы делаете:

$result->fetchArray(); 

Вы в основном делают:

true->fetchArray(); 

Который, конечно, не является допустимым методом (так верно не имеет каких-либо методов, будучи булево). Вы можете получить результаты из выполненной инструкции PDO с помощью метода fetchAll() в самой заявке:

$stmt->fetchAll(); 
+0

Спасибо. Это, безусловно, работает, хотя я никогда не использовал fetchAll() раньше и всегда подключался к базе данных с PDO. Единственное различие между этим, которое я часто использовал: $ qq = $ db-> prepare ($ sql); $ qq-> execute (array()) или die (print_r ($ db-> errorInfo(), true)); foreach ($ qq as $ row) {.....} и который отлично работает, является bindValue() между командой prepare() и execute(). Я потрачу больше времени на то, чтобы проверить доступ к PDO. –

+0

Теперь я понимаю, что я сделал не так. Я подключился к PDO, но затем искал помощь с запросами, сосредоточенными на SQLite, а не PDO. –

Смежные вопросы