Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 11/08/2011, 11h32   #1
Invité de passage
 
Femme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 7
Points : 0
Points : 0
Par défaut PDO ne fonctionne pas

Bonjour.

Voilà mon code

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
<?php
 
$connexion = new PDO('mysql:host='.HOST_MYSQL.';dbname='.BDD_MYSQL, USER_MYSQL, MDP_MYSQL);
		$q=$connexion->prepare('SELECT * FROM mp WHERE lower(pseudo_dest) = ?');
		$q->execute(array(strtolower($_SESSION['pseudo'])));
 
		var_dump($q->fetch(PDO::FETCH_OBJ));
 
		while($result=$q->fetch(PDO::FETCH_OBJ));
 
			{
	?>	
 
			<tr id="border">
				<td class="expediteur"><?php echo $result->pseudo_exp ;?> <span class="new"></span></td>
				<td class="sujet"><a href="index.php?page=mp&idm=<?php echo $result->id ; ?>"><?php echo $result->sujet ;?></a> </td>
				<td class="date">le <?php echo date('d/m/Y', $result->date_envoi);?> à <?php echo date('H:i', $result->date_envoi) ;?> </td>
				<td class="delete"><form action="index.php?page=voir_mp" method="post"><input class="button" type="submit" value="Supprimmer"/> <input class="button" type="hidden" value="<?php echo $result->id ; ?>" name="id"/></form></td>				
			</tr>
 
		</tbody>
		<?php
 
 
			}
			$result->closeCursor();
		}
 
		?>
Là où il y a $result->id $result->pseudo_exp etc ... eh bien rien ne s'affiche alors qu'il devrait y avoir quelque chose ! Je ne comprends plus rien !

Merci d'avance.
MsPampa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 12h10   #2
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149


Tu fetches 2 fois ton résultat de requête, alors que tu ne renvoies probablement qu'une seule ligne. Commence donc par enlever ce var_dump

Si ça persiste, dis-nous ce que te dit le log PHP.

Conseil : PDO permet de fonctionner avec des exceptions, mets ça en place, c'est très pratique pour détecter les erreurs d'exécution sans bloquer le script
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/08/2011, 12h23   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
"PDO ne fonctionne pas", quel titre accrocheur.

Pour ton souci: considère les résultats de requêtes (obtenus sous forme d'instance de PDOStatement) comme une pile. Chaque fois que tu fais un fetch, tu dépiles une ligne de résultats, la méthode fetch renverra false si il n'y a plus de lignes donc les syntaxes suivantes sont équivalentes:
Code :
1
2
3
4
5
6
7
8
9
10
11
$stmt = $pdo->query('SELECT machin FROM truc');
 
// cas #1
while ($row = $stmt->fetch()) {
 //...
}
 
// cas #2
foreach ($stmt as $row) { // eh oui, PDOStatement est Traversable
 //...
}
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 12h28   #4
Invité de passage
 
Femme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 7
Points : 0
Points : 0
En effet ça marche une fois le var_dump retiré ! Merci !

Mais j'ai un autre problème. Quand j'ai crée une méthode pouvant faire ça.

Code :
1
2
3
4
5
6
7
8
	public function liste_mp()
	{
		$connexion = new PDO('mysql:host='.HOST_MYSQL.';dbname='.BDD_MYSQL, USER_MYSQL, MDP_MYSQL);
		$q=$connexion->prepare('SELECT * FROM mp WHERE lower(pseudo_dest) =:pseudo');
		$res =$q->execute(array('pseudo' => strtolower($this->pseudo)));
		return $res ;
 
	}
Donc mon code ressemble à ça maintenant :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
	<?php
	else {
 
		$q= $mp->liste_mp() ;
 
		while($result=$q->fetch(PDO::FETCH_OBJ)) {
	?>	
 
			<tr id="border">
				<td class="expediteur"><?php echo $result->pseudo_exp ;?> <span class="new"></span></td>
				<td class="sujet"><a href="index.php?page=mp&idm=<?php echo $result->id ; ?>"><?php echo $result->sujet ;?></a> </td>
				<td class="date">le <?php echo date('d/m/Y', $result->date_envoi);?> à <?php echo date('H:i', $result->date_envoi) ;?> </td>
				<td class="delete"><form action="index.php?page=voir_mp" method="post"><input class="button" type="submit" value="Supprimmer"/> <input class="button" type="hidden" value="<?php echo $result->id ; ?>" name="id"/></form></td>				
			</tr>
 
		</tbody>
		<?php
 
 
			}
		}
 
		?>
Mais j'obtiens une erreur me disant que j'utilise fetch sur un non objet.

N'y a-t-il pas un moyen pour retourner un objet depuis ma méthode ?


@Benjamin Delespierre : Désolé pour le titre.
J'ai essayé avec foreach (merci je savais pas qu'on pouvait faire aussi ainsi) mais ça ne fonctionne toujours pas.
MsPampa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 12h38   #5
Membre Expert
 
Avatar de David Guillot
 
Homme David Guillot
Chef de projet en SSII
Inscription : mars 2004
Messages : 879
Détails du profil
Informations personnelles :
Nom : Homme David Guillot
Âge : 28
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Chef de projet en SSII
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mars 2004
Messages : 879
Points : 1 149
Points : 1 149
C'est là qu'interviennent les exceptions. Place ton execute dans un try{} catch{}, tu verras ce qui se passe.

Conseil : pour assurer un meilleur découpage des responsabilités de chaque morceau de code, place plutôt tes fetch dans ta méthode liste_mp(), et fais en sorte que cette méthode renvoie un tableau. De cette manière tu pourras parcourir le tableau avec un simple foreach
__________________
Avant de poser une question ici :

Après résolution de votre question : un clic sur , un et un vote pour les personnes qui vous ont aidé
David Guillot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 12h50   #6
Invité de passage
 
Femme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 7
Points : 0
Points : 0
Citation:
Envoyé par torvalds17 Voir le message
C'est là qu'interviennent les exceptions. Place ton execute dans un try{} catch{}, tu verras ce qui se passe.

Conseil : pour assurer un meilleur découpage des responsabilités de chaque morceau de code, place plutôt tes fetch dans ta méthode liste_mp(), et fais en sorte que cette méthode renvoie un tableau. De cette manière tu pourras parcourir le tableau avec un simple foreach
C'est ce que je voulais faire depuis le début en fait. Mais il semble impossible de transmettre quoi que se soit par la méthode, objet ou tableau !
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php	public function liste_mp()
	{
		 try { $connexion = new PDO('mysql:host='.HOST_MYSQL.';dbname='.BDD_MYSQL, USER_MYSQL, MDP_MYSQL);
		$q=$connexion->prepare('SELECT * FROM mp WHERE lower(pseudo_dest) =:pseudo');
		$q->execute(array('pseudo' => strtolower($this->pseudo)));
		return $q->fetch(PDO::FETCH_ASSOC) ; 
		}
 
		catch(Exception $e)
						{
							echo 'Erreur : '.$e->getMessage().'<br />';
							echo 'N° : '.$e->getCode();
						}
 
	}?>
Jusque là tout va bien, aucune erreur. Mais c'est sur le foreach que ça se corse.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
	<?php
	else {
 
		$array= $mp->liste_mp();
 
		foreach($array as $result) {
	?>	
 
			<tr id="border">
				<td class="expediteur"><?php echo $result['pseudo_exp'] ;?> <span class="new"></span></td>
 
			</tr>
 
		</tbody>
		<?php
			}
 
		}
Warning: Invalid argument supplied for foreach()

J'en conclut que $array n'est pas un tableau.

EDIT : Quand je fais var_dump sur $array j'obtiens un false ... je ne comprends plus rien.
MsPampa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 13h11   #7
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Cette syntaxe est incorrecte:
Code :
$q->execute(array('pseudo' => strtolower($this->pseudo)));
Il faut préfixer les clés du tableau de remplacement avec :
Donc
Code :
$q->execute(array(':pseudo' => strtolower($this->pseudo)));
Normalement tu as dû ramasser une erreur.

Voici comment préparer et exécuter des requêtes sereinement avec PDO:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
 
function get_message (PDO $pdo, $pseudo, $fetch_mode = PDO::FETCH_ASSOC, $silent = false) {
  $query = "SELECT * FROM `mp` WHERE LOWER(`pseudo`)=:pseudo";
  $statement = $pdo->prepare($query);
  if ($statement->execute(array(':pseudo' => $pseudo)) {
    return $statement->fetchAll($fetch_mode);
  }
  if (!$silent) {
    $err = $pdo->errorInfo();
    trigger_error("Error With [{$query}] : [{$err[2]}]");
  }
  return false;
}
Vu que c'est une méthode, je voudrais bien voir ta classe histoire de te donner quelques conseils.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 14h04   #8
Invité de passage
 
Femme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 7
Points : 0
Points : 0
Merci pour la technique, mais ça ne change rien au problème. Il me semble impossible de retourner un objet ou un tableau depuis ma méthode.

Voilà ma classe si ça peux aider :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<?php
 
class Voir_mp
{
 
	private $pseudo ;
 
	public function __construct($pseudo) 
	{
		$this->$pseudo = $pseudo;
	}
 
	public function check_new_mp()
	{
		$connexion = new PDO('mysql:host='.HOST_MYSQL.';dbname='.BDD_MYSQL, USER_MYSQL, MDP_MYSQL);
		$q=$connexion->prepare('SELECT * FROM mp WHERE lower(pseudo_dest) =:pseudo');
		$q->execute(array('pseudo' => strtolower($this->pseudo)));
 
		if ($q->rowCount())
			return true ;
		else 
			return false ;
 
	}
 
	public function liste_mp()
	{
		 try { $connexion = new PDO('mysql:host='.HOST_MYSQL.';dbname='.BDD_MYSQL, USER_MYSQL, MDP_MYSQL);
		 $connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
		$q=$connexion->prepare('SELECT * FROM mp WHERE lower(pseudo_dest) =:pseudo');
		$q->execute(array(':pseudo' => strtolower($this->pseudo)));
		$array = $q->fetch(PDO::FETCH_ASSOC) ;
		return $array ;
		$q->closeCursor();
		}
 
		catch(PDOException $e)
						{
							echo 'Erreur : '.$e->getMessage().'<br />';
							echo 'N° : '.$e->getCode();
						}
 
	}
}
 
?>
MsPampa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/08/2011, 15h15   #9
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par Benjamin Delespierre Voir le message
Cette syntaxe est incorrecte:
Code :
$q->execute(array('pseudo' => strtolower($this->pseudo)));
Il faut préfixer les clés du tableau de remplacement avec :
Donc
Code :
$q->execute(array(':pseudo' => strtolower($this->pseudo)));
Normalement tu as dû ramasser une erreur.
Les deux points ont toujours été facultatifs (PHP les rajoute sinon) : ça a été ajouté il y a plus de 5 ans par la révision 1.116, bien avant l'intégration de PDO au core.

Citation:
Envoyé par MsPampa Voir le message
Il me semble impossible de retourner un objet ou un tableau depuis ma méthode.
C'est parfaitement possible (tableau d'objets compris).

Si votre fetch (plus haut) renvoie FALSE et en admettant que le reste ne "plante" pas avant : n'y aurait-il pas tout simplement aucun résultat ?

Mais, bon, difficile de s'y retrouver, le code n'est jamais le même, aucun débogage (var_dump à des moments clés), parfois il n'y a aucune gestion d'erreur, etc. Ce serait à revoir (complètement).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 07h46   #10
Invité de passage
 
Femme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 7
Points : 0
Points : 0
Citation:
Envoyé par julp Voir le message
Si votre fetch (plus haut) renvoie FALSE et en admettant que le reste ne "plante" pas avant : n'y aurait-il pas tout simplement aucun résultat ?
C'est-à-dire ?

Le code semble bon. Quand je le met directement dans mon fichier index.php, sans passer par une classe, il fonctionne.
MsPampa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 11h09   #11
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Qu'est ce qui se passe si tu effectue cette requête directement sur MySQL ?
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 12h40   #12
Invité de passage
 
Femme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 7
Points : 0
Points : 0
MySQL me retourne ce que je lui ai demandé. Je ne pense pas que le problème puisse venir du SQL.
MsPampa est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 12h56   #13
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 011
Points : 5 011
Bon eh bien regarde combien de lignes tu réccupères avec $stmt->rowCount();
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 13h05   #14
Invité de passage
 
Femme
Inscription : août 2011
Messages : 7
Détails du profil
Informations personnelles :
Sexe : Femme

Informations forums :
Inscription : août 2011
Messages : 7
Points : 0
Points : 0
Je récupère 0 ligne.
MsPampa est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h54.


 
 
 
 
Partenaires

Hébergement Web