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 :

PDO ne fonctionne pas


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut PDO ne fonctionne pas
    Bonjour.

    Voilà 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
    <?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.

  2. #2
    Invité
    Invité(e)
    Par défaut


    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

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    "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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     //...
    }

  4. #4
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    	<?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.

  5. #5
    Invité
    Invité(e)
    Par défaut
    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

  6. #6
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : 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
    	<?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.

  7. #7
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Cette syntaxe est incorrecte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q->execute(array('pseudo' => strtolower($this->pseudo)));
    Il faut préfixer les clés du tableau de remplacement avec :
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  8. #8
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut
    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 : 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
    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();
    						}
     
    	}
    }
     
    ?>

  9. #9
    Membre expérimenté

    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
    Par défaut
    Citation Envoyé par Benjamin Delespierre Voir le message
    Cette syntaxe est incorrecte:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $q->execute(array('pseudo' => strtolower($this->pseudo)));
    Il faut préfixer les clés du tableau de remplacement avec :
    Donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $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).

  10. #10
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut
    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.

  11. #11
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Qu'est ce qui se passe si tu effectue cette requête directement sur MySQL ?

  12. #12
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut
    MySQL me retourne ce que je lui ai demandé. Je ne pense pas que le problème puisse venir du SQL.

  13. #13
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Bon eh bien regarde combien de lignes tu réccupères avec $stmt->rowCount();

  14. #14
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Août 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Août 2011
    Messages : 7
    Par défaut
    Je récupère 0 ligne.

Discussions similaires

  1. [PDO] [Résolu] Requête PDO ne fonctionne pas dans un foreach
    Par Exhaeus dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/05/2014, 10h37
  2. Réponses: 6
    Dernier message: 27/01/2004, 11h14
  3. UNION qui ne fonctionne pas
    Par r-zo dans le forum Langage SQL
    Réponses: 7
    Dernier message: 21/07/2003, 10h04
  4. Un Hint sur un PopupMenu ne fonctionne pas !!??
    Par momox dans le forum C++Builder
    Réponses: 6
    Dernier message: 26/05/2003, 16h48
  5. ca ne fonctionne pas (generateur auto-incrémentant)
    Par tripper.dim dans le forum SQL
    Réponses: 7
    Dernier message: 26/11/2002, 00h10

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