Erreur pdo

AlecWeab Messages postés 3 Statut Membre -  
Pitet Messages postés 2845 Statut Membre -
Bonjour,
lorsque je charge ma page dans mon navigateur j'ai cette erreur:
Fatal error: Call to a member function fetch() on a non-object in C:\wamp\www\blog\testblog.php on line 30
j'ai bo chercher, je ne vois pas à quoi c'est du.
Voici le code qui pose problème:
<?php
      
      if (isset($_POST['ok']))
      {
       $mat=$_POST['mat'];
       $req1="SELECT * FROM personnels WHERE matricule_perso=$mat";
       $resultat = $bdd->query($req1) or die(print_r($bdd->erroInfo())); ;
       while ($res1=$resultat->fetch())
       {
        $nom_p=$res1['nom_perso'];
        $prenom_p=$res1['prenom_p'];
        echo ' <tr>
           <td>Nom : $nom_p </td> 
          </tr>
          <tr>
           <td>Prenom : $prenom_p </td>
          </tr>' ;
       }
      }
      
     ?>


EDIT: Ajout de la coloration syntaxique.

2 réponses

  1. jordane45 Messages postés 30427 Date d'inscription   Statut Modérateur Dernière intervention   4 832
     
    Bonjour,

    En PDO on n'utilise pas le OR DIE.
    Il est préférable d'utiliser des bloc TRY / CATCH.

    Pour ton fichier de connexion à ta BDD :
    try {
        $bdd= new PDO('mysql:host=localhost;dbname=test;charset=utf8', 'localonly', 'localonly');
        $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
        $bdd->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
    }
    catch(Exception $e) {
        echo 'Exception -> ';
        var_dump($e->getMessage());
    }
    


    Pour le lancement de ta requête
    try {
      $req1="SELECT * FROM personnels WHERE matricule_perso=$mat";
      $resultat = $bdd->query($req1) ;
    }
    catch(Exception $e) {
        echo 'Erreur Requete-> ';
        var_dump($e->getMessage());
    }
    
    


    Par contre, pour ce qui concerne ton message d'erreur, il semblerait que la requête n'est retournée aucun résultat ou plutôt qu'elle est rencontré une erreur.....

    - As tu testé ta requête en direct dans ta BDD ?
    - Ton champ matricule_perso est de quel type ? (Numérique ? )
    Sinon.. il vaut mieux l'entourer de quotes....
     matricule_perso='$mat' ";
    


    Fais un ECHO de ta requete
     $req1="SELECT * FROM personnels WHERE matricule_perso=$mat";
    echo "requête : <br>".$req1;
    


    Puis lance la en direct dans ta base....
    https://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql

    0
  2. ElementW Messages postés 5690 Statut Contributeur 1 293
     
    'lut, avertissement sympa de ma part:
    si j'accède à
    http://<ton IP>/blog/testblog.php
    avec comme paramètre POST
    mat=0; DROP TABLE personnels;
    , ta table
    personnels
    (en plus d'avoir un nom mal orthographié) est fichue pour de bon.

    Les conseils de jordane45 sont de bonne foi mais pas suffisants: mettre un string entre guillemets ne suffit pas à contrer une injection SQL.
    PDO possède les requêtes préparées, il faut donc s'en servir, en définissant un paramètre (anonyme ou nommé, comme il n'y en a qu'un un anonyme est plus rapide a coder):
    try {
        $req1 = $bdd->prepare("SELECT * FROM personnels WHERE matricule_perso=?");
        $resultat = $req1->execute(array($mat));
    } catch(Exception $e) {
        echo 'Erreur Requete-> ';
        var_dump($e->getMessage());
    }
    0
    1. Pitet Messages postés 2845 Statut Membre 530
       
      En complément, la même réponse en utilisant la méthode PDO::quote() :
      $req1="SELECT * FROM personnels WHERE matricule_perso=" . $bdd->quote($mat);
      $resultat = $bdd->query($req1)
      
      0