Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
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 01/07/2011, 16h33   #1
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
Par défaut PHP PDO erreur lors de l'appel de fonction

Bonjour,

J'essaie de faire un site web en PHP POO, et j'utilise la PDO pour accéder ma basse de données or j'ai quelques soucis lorsque je tente d'exécuter une requête.

Voici 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
30
 
	class InterfaceBD {
 
		private $hote = '127.0.0.1';
		private $port = '';
		private $nom_bd = 'Test';
		private $user = 'root';
		private $pass = '';
 
		private $connection;
 
		public function __construct() {
			$this->connection = new PDO('mysql:host='.$this->hote.';port='.$this->port.';dbname='.$this->nom_bd, $this->user, $this->pass) 
				or die ("erreur de connection.");
		}
 
		public function update($requete) {
			echo $requete.'<br/>';
			$this->connection->exec($requete) or die ($this->connection->errorInfo());
		}
 
		public function query($requete) {
			$res = $this->connection->query($requete) or die ("erreur de requete ! ".$this->connection->errorInfo());
			$res->setFetchMode(PDO::FETCH_ASSOC);
			return $res;
		}
	}
 
	$bd = new InterfaceBD;
	$bd->update("UPDATE `perso` SET `Force`=2");
Et lorsque j'exécute ce "script" j'obtiens Array et je ne comprend pas pourquoi, alors que si j'exécute la même commande sans passé par la POO ça marche.

Pouvez m'expliquer ce que je fais de travers, merci par avance.

Cordialement P.
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 16h40   #2
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
$this->connection->errorInfo() renvoie un tableau, pas une chaîne (cf doc) d'où le "Array" :
Citation:
Les tableaux sont toujours convertis en la chaîne "Array" ; ainsi, echo() et print() ne peuvent être utilisés pour afficher le contenu d'un tableau.
Ce qui voudrait dire qu'il y a erreur.

(PS : force est un mot-clé réservé, sans backticks, ce sera erreur de syntaxe)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 16h47   #3
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
Merci pour cette réponse rapide. En effet, le "array" vient bien de là.
Par contre pourquoi la requête échoue t-elle, alors qu'elle est bien exprimée et fonctionne si on l'exécute en dehors de la classe (par exemple dans la console ou en php directement sans passé par la poo).

edit : J'ai bien mis le backticks pour l'attribut "force" et pourtant j'ai une erreur
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/07/2011, 16h54   #4
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
Vous le saurez quand vous mettrez en place une gestion d'erreur fonctionnelle (or die (print_r($this->connection->errorInfo()), TRUE);) ... Une erreur ? Quelle erreur ?

(Le "or die" sur l'instanciation de l'objet PDO ne sert pas à grand chose puisqu'une exception est levée s'il échoue)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 10h29   #5
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
Je viens de mettre en place une gestion d'erreur comme suit :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
		public function update($requete) {
			echo $requete.'<br/>';
			try {
				$this->connection->exec($requete);
			}
			catch(PDOException $e)
			{
					echo $e->getMessage();
					echo $e->getCode();
			}
		}
Je n'ai aucun message d'erreur sur les raisons de l’échec de ma requête. Je suis tout nouveau dans ce monde de la programmation orientée Objet et je ne maitrise pas tous ces aspects.

Merci par avance et désolé si je ne percute pas assez vite.
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 10h34   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
si tu gères pas la gestion des erreurs avec PDO, tu ne risques pas d'en avoir, PDO par défaut ne lève aucune erreur/exception sauf a la connexion
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 10h54   #7
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
Citation:
Envoyé par stealth35 Voir le message
si tu gères pas la gestion des erreurs avec PDO, tu ne risques pas d'en avoir, PDO par défaut ne lève aucune erreur/exception sauf a la connexion
J'ai bien pensé a ajouter cette ligne dans le code, et j'ai oublié de le préciser dans le message précédent.

Code :
1
2
3
4
5
6
 
public function __construct() {
			$this->connection = new PDO('mysql:host='.$this->hote.';port='.$this->port.';dbname='.$this->nom_bd, $this->user, $this->pass) 
				or die ("erreur de connection.");
			$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
		}
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 10h58   #8
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
mais enlève les or die au dela que deja c'etait pas le bonne méthode pour l'extension mysql, c'est complètement inutile pour PDO, et en plus die c'est un alias, donc enlève tout ça
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h11   #9
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
Voilà j'ai retiré le "die".

Je vous remets mon code en entier pour plus de clarté.
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
 
class InterfaceBD {
 
		private $hote = '127.0.0.1';
		private $port = '';
		private $nom_bd = 'Test';
		private $user = 'root';
		private $pass = '';
 
		private $connection;
 
		public function __construct() {
			try {
				$this->connection = new PDO('mysql:host='.$this->hote.';port='.$this->port.';dbname='.$this->nom_bd, $this->user, $this->pass); 
			} catch (Exception $e) {
				echo "erreur de connection";
			}
			$this->connection->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
		}
 
		public function update($requete) {
			echo $requete.'<br/>';
			try {
				if ($this->connection->exec($requete) == FALSE) {
					echo print_r($this->connection->errorInfo());
				}
			}
			catch(PDOException $e)
			{
					echo $e->getMessage();
					echo $e->getCode();
			}
		}
 
		public function query($requete) {
			$res = $this->connection->query($requete);
			$res->setFetchMode(PDO::FETCH_ASSOC);
			return $res;
		}
	}
 
	$bd = new InterfaceBD;
	$bd->update("UPDATE `perso` SET `Force`=2");
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h16   #10
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
et donc ?
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h20   #11
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
Autant pour moi ça marche bien, je ne l'avais pas remarqué.
Merci de votre aide

Par contre pouvez vous m'expliquer quel a été le problème parce que je n'ai toujours pas compris pour quoi ça remarche.
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h24   #12
Modérateur
 
Inscription : septembre 2010
Messages : 7 103
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 103
Points : 8 456
Points : 8 456
Citation:
Envoyé par devocx Voir le message
Autant pour moi ça marche bien, je ne l'avais pas remarqué.
Merci de votre aide

Par contre pouvez vous m'expliquer quel a été le problème parce que je n'ai toujours pas compris pour quoi ça remarche.
errorInfo renvoie un array, seul print_t ou var_dump l'affiche, si tu fait un die dessus ça reviens a faire echo array()
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h35   #13
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
Oui cela m'explique pour quoi je n'arrivais pas a avoir de message, mais moi ce que j'aimerais comprendre c'est pourquoi ma requête initiale n’aboutissait pas alors maintenant cela marche sans qu'on est eu à modifier la requête.
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h53   #14
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:
PDO::exec() retourne le nombre de lignes qui ont été modifiées ou effacées pour la requête SQL qui vous exécutez. Si aucune ligne n'est affectée, la fonction PDO::exec() retournera 0.

Citation:
Avertissement

Cette fonction peut retourner FALSE, mais elle peut aussi retourner une valeur équivalent à FALSE comme 0 ou "". Veuillez lire la section sur les booléens pour plus d'informations. Utilisez l'opérateur === pour tester la valeur de retour exacte de cette fonction.
L'exemple suivant se fonde inexactement sur la valeur retournée par PDO::exec(), où une requête qui n'affecte aucune lignes revient à appeler die() :
Code :
1
2
3
4
5
<?php
$res = $db->exec(...) or die(print_r($db->errorInfo(), true));
// correct
//$res = $db->exec(...) !== FALSE or die(print_r($db->errorInfo(), true));
?>
En l'occurrence votre code est faux : il ne fait pas la distinction entre une erreur et une requête correcte qui n'affecte aucune ligne (0 lignes updatées).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/07/2011, 11h57   #15
Invité régulier
 
Jean Philipe
Inscription : avril 2009
Messages : 23
Détails du profil
Informations personnelles :
Nom : Jean Philipe

Informations forums :
Inscription : avril 2009
Messages : 23
Points : 7
Points : 7
D'accord je comprend mieux, merci pour cette explication.

Sujet résolu.
devocx est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h06.


 
 
 
 
Partenaires

Hébergement Web