IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

PHP PDO erreur lors de l'appel de fonction [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    $this->connection->errorInfo() renvoie un tableau, pas une chaîne (cf doc) d'où le "Array" :
    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)

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    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

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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)

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Je viens de mettre en place une gestion d'erreur comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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

  7. #7
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 );
    		}

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    Voilà j'ai retiré le "die".

    Je vous remets mon code en entier pour plus de clarté.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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");

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    et donc ?

  11. #11
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    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.

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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()

  13. #13
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    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.

  14. #14
    Expert éminent sénior

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Points : 17 777
    Points
    17 777
    Par défaut
    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.

    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

  15. #15
    Membre à l'essai
    Inscrit en
    Avril 2009
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 23
    Points : 17
    Points
    17
    Par défaut
    D'accord je comprend mieux, merci pour cette explication.

    Sujet résolu.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [JNA] Erreur lors de l'appel de fonction venant d'une librairie
    Par lac981 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 31/05/2011, 11h02
  2. Erreur lors de l'appel à une fonction
    Par wadja_86 dans le forum GTK+ avec C & C++
    Réponses: 8
    Dernier message: 09/12/2010, 12h18
  3. [SQL] Erreur lors d'un appel de fonction
    Par xavier.valentin dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 13/11/2006, 22h56
  4. Erreur lors de l'appel d'un page ASP
    Par poirier dans le forum ASP
    Réponses: 2
    Dernier message: 27/08/2004, 15h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo