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.
A voir également:
- Erreur pdo
- Erreur 4101 france tv - Forum Lecteurs et supports vidéo
- Erreur 0x80070643 - Accueil - Windows
- Erreur 0x80070643 Windows 10 : comment résoudre le problème de la mise à jour KB5001716 - Accueil - Windows
- Erreur upes 1025 - Forum Téléviseurs
- Code erreur f3500-31 ✓ - Forum Bbox Bouygues
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());
}