Erreur pdo
AlecWeab
Messages postés
3
Statut
Membre
-
Pitet Messages postés 2845 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:
EDIT: Ajout de la coloration syntaxique.
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
-
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êtetry { $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
-
'lut, avertissement sympa de ma part:
si j'accède àhttp://<ton IP>/blog/testblog.php
avec comme paramètre POSTmat=0; DROP TABLE personnels;
, ta tablepersonnels
(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()); }