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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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