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

Ce retour:Que devrait imprimer print_r avec une instruction PDO dans PHP return?

PDOStatement Object ([queryString] => SELECT * FROM clients)

mais si je fais:

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

je reçois les données. Pourquoi print_r ne montre-t-il pas les résultats de la base de données? Quelle chose spéciale se passe dans le foreach? Je pensais que print_r m'avait montré le tableau et que c'était ce que je faisais dans ma foreach.

Merci.

Répondre

4

Si vous effectuez une itération sur la requête, les données seront automatiquement récupérées. C'est une bonne chose, car l'adaptateur chargera les données paresseux dès qu'il sera réellement nécessaire.

Si vous voulez forcer l'adaptateur PDO pour récupérer les données à l'avance, vous pouvez exécuter la méthode fetchAll comme ceci:

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

A PDOStatement est une interface itérables à une ressource stockée en dehors de votre « normale » Code PHP. Le resultset n'est pas implémenté au niveau PHP, et selon les paramètres, il est même question de savoir si ce resultset existe dans la mémoire du processus PHP ou dans la mémoire du serveur de base de données. Un foreach sur lui appellera effectivement plusieurs extractions sur la ressource, et le fait que vous ne sachiez pas (ou que vous ne deviez pas vous en soucier) là où ce jeu de résultats est en mémoire est une bonne chose.

Si vous avez besoin d'une représentation pour le débogage, vous pouvez appeler un var_dump($stmt->fetchALL());

0

La requête retourne un tableau/objet et print_r() affiche les résultats, en ajoutant les <pre> balises et passer fidèle à print_r() sera plus facile à lire lors de l'affichage sur une page HTML

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