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 -
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:
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.
A voir également:
- Erreur pdo
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- J'aime par erreur facebook notification - Forum Facebook
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
- Java code erreur 1603 ✓ - Forum Windows
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 :
Pour le lancement de ta requête
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....
Fais un ECHO de ta requete
Puis lance la en direct dans ta base....
https://codes-sources.commentcamarche.net/faq/10778-heidisql-tester-ses-requetes-sql
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
'lut, avertissement sympa de ma part:
si j'accède à
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):
si j'accède à
http://<ton IP>/blog/testblog.phpavec 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()); }