Erreur pdo

AlecWeab Messages postés 3 Date d'inscription   Statut Membre Dernière intervention   -  
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   -
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

jordane45 Messages postés 38486 Date d'inscription   Statut Modérateur Dernière intervention   4 752
 
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
ElementW Messages postés 4814 Date d'inscription   Statut Contributeur Dernière intervention   1 223
 
'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
Pitet Messages postés 2826 Date d'inscription   Statut Membre Dernière intervention   527
 
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