2010-09-30 2 views
3
$dbh = new PDO ("sqlite:/Library/WebServer/Documents/nwind2009.db3"); 
$sql = "SELECT * FROM Customers";  
print_r($dbh->query($sql)); 

Это возвращает:Что должно делать print_r с инструкцией PDO в PHP?

PDOStatement Object ([QueryString] => SELECT * FROM Клиенты)

, но если я делаю:

foreach ($dbh->query($sql) as $row) { 
    echo $row['CompanyName']; 
} 

я получаю данные.

Почему print_r не показывает результаты базы данных? Какая особенность происходит в foreach? Я думал, что print_r показал мне массив, и это то, что я делал в своем foreach.

Спасибо.

ответ

4

Если вы выполняете итерацию по запросу, он автоматически извлекает данные. Это хорошо, потому что адаптер будет ленить загружать данные в тот момент, когда это действительно необходимо.

Если вы хотите, чтобы заставить адаптер PDO для выборки данных заранее, вы можете запустить метод fetchAll следующим образом:

$dbh = new PDO ("sqlite:/Library/WebServer/Documents/nwind2009.db3"); 
$sql = "SELECT * FROM Customers";  
print_r($dbh->query($sql)->fetchAll()); 
3

PDOStatement является итератор интерфейс ресурса хранится за пределами вашей «нормальный» PHP-код. Набор результатов не реализуется на уровне PHP, и в зависимости от настроек даже вопрос о том, существует ли этот набор результатов в памяти процесса PHP или в памяти сервера базы данных. A foreach над ней фактически вызовет несколько наборов на ресурсе, а тот факт, что вы не знаете (или должен заботиться), где этот набор результатов находится в памяти, - это хорошая вещь.

Если требуется представление для отладки, вы можете вызвать var_dump($stmt->fetchALL());

0

Запрос возвращает массив/объект и print_r() отображает результаты, добавляя <pre> теги и передавая верным print_r() будет легче читать при отображении этого на странице HTML

echo "<pre>".print_r($dbh->query($sql)->fetchAll(),true)."</pre><br />";