Erreur sur foreach(...)

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

19 juin 2007, 12:47

A ce stade, la connection à la base mescontacts.db est réussie.

Warning: PDO::query() [function.PDO-query]: SQLSTATE[HY000]: General error: 1 no such table: contacts in C:\www\dbtutor\sqlite_contacts.php on line 23

Résultat de var_dump($sth);.......bool(false)
...
Quand je lit ça, je me dit que c'est l'appel à la méthode query() qui est fausse puisque le var_dump() retourne "false" et que tu as un message d'erreur très explicite.

J'aurais envie de te demander de vraiment re-vérifier si tu te connectes bien sur la bonne base avec les bons droits :-k
Est-ce que tu arrives à passer d'autres requêtes avec cette méthode ?
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Eléphanteau du PHP | 12 Messages

19 juin 2007, 13:22

La solution ne m'a malheureusement toujours pas sauté à la figure comme un bouchon de champagne, et j'apprécierais beaucoup que quelqu'un me mette sur la voie.

Merci d'avance
A. ANDRE
------------------------------------------------------------------------
Long et caillouteux, est le chemin qui mène à la connaissance!

ViPHP
AB
ViPHP | 5818 Messages

21 juin 2007, 02:24

Quand ça bug je recommence avec le plus basique. Pour mysql, avec la méthode classique ci-dessous (en remplaçant les variables de la première ligne par tes valeurs), obtiens-tu le résultat escompté?
mysql_connect("$host", "$login", "$password");
mysql_select_db("mescontacts.db");

$sql = "SELECT * FROM contacts ORDER BY nom, prenoms"; 
$res = mysql_query($sql);

while($res_row = mysql_fetch_assoc($res))
{echo $res_row['prenoms'].'&nbsp'.$res_row['nom'].'<br />';}

Mammouth du PHP | 19672 Messages

21 juin 2007, 06:37

...De plus, j'insite sur mon var_dump() pour savoir ce que retourne cette méthode query()....
As-tu essayé ceci :
$sth = $dbh->query($sql); 
echo("<pre>\n");
var_dump($sth);
echo("</pre>\n");
:?:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 12 Messages

23 juin 2007, 08:48

Quand ça bug je recommence avec le plus basique. Pour mysql, avec la méthode classique ci-dessous (en remplaçant les variables de la première ligne par tes valeurs), obtiens-tu le résultat escompté?
Je rappelle ce que j'ai spécifié dans mon message initial: je n'utilise pas (pour le moment) MySQL mais SQLite qui s'affranchit d'avoir à spécifier l'hôte, un utilisateur et un mot de passe. On n'y spécifie que la base de données à laquelle on désire se connecter. (cf. The Definitive Guide to SQLite - Michael Owens - Apress Berkeley CA 2006 ).

Je vais essayer d'y adapter tes suggestions. Merci et à bientôt.
(je ne me borne pas à poser des questions. Quand une suggestion me permet de progresser je le mentionne

Edité le 29 juin 2007

Voici le code que j'ai suivi, scanné de PHP 5 avancé:
<?php 


// définition des variables de connexion

$user = 'cyril'; 
$pass = 'motdepasse'; 
$dsn = 'mysql :host=localhost;dbname=publication'; 
// connexion à la base de données
try { 
$dbh = new PDO($dsn, $user, $pass);
}
catch (PDOException $e) { 
die( "Erreur! : " . $e->getMessage();
} 

// insertion d'un enregistrement 

$sql = "INSERT INTO auteur (login) VALUES ('roms')";
$dbh->exec($sql); 

// lecture d'enregistrements 

$sql = "SELECT login FROM auteur";
$resultat = $dbh->query($sql);
while ($row = $resultat->fetch())
print_r($row); 

// fermeture de la connexion

$dbh = NULL; 
?> 
Voici la citation introductive du code précédent:
Dans notre exemple, nous utilisons deux méthodes pour exécuter des requêtes SQL : execO et queryO. La première sert pour les requêtes ne renvoyant pas de résultat (INSERT, UPDATE et DELETE), la seconde renvoie une instance de la classe PDOStatement contenant le jeu de résultat correspondant à la requête (utile notamment pour les requêtes SELECT).

Avec ces quelques lignes d'exemple vous serez capable de réaliser la majorité des actions, mais vous pouvez améliorer vos accès à la base de données avec les nombreuses options proposées par PDO. Consultez notamment les requêtes préparées pour protéger vos requêtes des injections SQL (cf. chapitre 27 sur la sécurité).
Les lignes en gras me paraissent indiquer clairement que le jeu de résultat est bien un tableau.

Si cet exemple est erroné, que penser du reste de l'ouvrage, et s'il est correct, pourquoi ma connection et ma requête ne fonctionnent-elles pas? Que pourraient me conseiller les auteurs, Eric DASPET et Cyril Pierre de GEYER, ainsi que Damien SEGUY s'ils lisaient ceci?

Se gausser de moi a l'air aisé, mais me guider vers une solution, autrement plus difficile.

Merci toutefois pour vos conseils, lorsqu'ils m'aident à progresser.
A. ANDRE
------------------------------------------------------------------------
Long et caillouteux, est le chemin qui mène à la connaissance!