Erreur pdo

Fermé
AlecWeab Messages postés 3 Date d'inscription jeudi 5 février 2015 Statut Membre Dernière intervention 13 février 2015 - Modifié par Whismeril le 8/02/2015 à 12:00
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 - 10 févr. 2015 à 15:58
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 38243 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 3 octobre 2024 4 689
8 févr. 2015 à 12:38
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 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 228
8 févr. 2015 à 20:06
'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 lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 524
10 févr. 2015 à 15:58
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