8797 sujets

Développement web côté serveur, CMS

Bonjour,

J'ai fait un petit programme qui va interroger une table, ca fonctionne bien mais j'ai un petit problème.

- Si je tape un mauvais code, ça m'envoi un message
- Si le code est bon, ça m'affiche la bonne valeur sur la table

Là, ou sa coince c'est si je valide le formulaire en laissant le champ vide !!!!

Message à l'écran :

Fatal error: Call to a member function fetch() on a non-object in /homez.318/dupontph/www/Panier/Paiement+.php on line 17

Ligne 17 :
while ($donnees = $reponse->fetch())

A part ça le code fonctionne nickel Smiley fache

Il y a t'il un moyen de ne plus avoir ce foutu message !!!! Qu'il me ressorte le message du mauvais code par exemple !!!

Merci de vos lumières.

Smiley decu
Modifié par CVS (31 Oct 2011 - 10:20)
Salut,

tu peux nous montrer quelque ligne au dessus?

je ne connais pas pdo mais vu que ta requête doit être fausse il ne doit y a avoir que false ou null dans ta variable $reponse


avant de l'utiliser tu devrais donc tester cette variable

if ($reponse)
while ($donnees = $reponse->fetch()) {
.....

Apparemment il est possible que pdo envoi une exception selon la configuration. et il doit y avoir un moyen d'afficher les erreurs je l'imagine bien. mais ça ne vas pas apparaitre tout seul je pense.

j'imagine qu'un 
try {
// ton code d"execution de la requete
} catch (exception $e) {
 echo $e->getMessage();
}

if ($reponse)
while ($donnees = $reponse->fetch())  {
....


s'approcherais de ce que tu recherche. quoique faire apparaitre l'erreur sql a l'utilisateur ne sembles pas souhaitable.

plus surement tu devrais tester la/les variables qui te serve a faire la requete. verifier qu'elles sont sécurisées.
et ne lancer l'execution de la requete que si cela convient.

pascal
Modifié par CPascal (30 Oct 2011 - 18:50)
Merci pour tes conseils, un copain informaticien m'a filé un coup de main pour le code, il a rien vue d'étrange niveau sécurité.

Voilà mon code :

<?php

try
{

$bdd = new PDO('mysql:host=xxxx.xxx;dbname=xxxx', 'xxxx', 'xxx');

$reponse = $bdd->query("SELECT Pays, Capitale FROM test WHERE Pays ".$_POST['requete']."");

while ($donnees = $reponse->fetch())

echo $donnees['Capitale'];

{

}
$reponse->closeCursor();

echo '<a href="javascript:history.go(-1)">Erreur</a>';

}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}

?>
Modifié par CVS (30 Oct 2011 - 18:39)
Le message d'erreur que tu demandais :

Fatal error: Call to a member function fetch() on a non-object in /homez.318/dupontph/www/Panier/Paiement+.php on line 19
et bien moi je testerais la variable POST en premier

if (!empty($_POST['requete'])) {
 // là faire un traitement pour verifier la variable. si c'est un entier cast en int, si c'est une 
// chaine de caractere escape tes champs. apparement en pdo il y a la fonction pdo::quote
 $pays = traitement_qui_securise($_POST['requete']);

 try
 ... ton code
     avec le test tout de même sur $reponse vu dans le post précédent.
}

Modifié par CPascal (30 Oct 2011 - 18:53)
J'ai mis comme tu m'as indiqué :

if (!empty($_POST['requete']) {

try
{

$bdd = new PDO('mysql:host=xxxx.business;dbname=xxxx', 'xxx', 'xxx');

$reponse = $bdd->query("SELECT Pays, Capital FROM test WHERE $Pays=".$_POST['requete']."");

while ($donnees = $reponse->fetch())

{

Je pense comme toi que c'est la variable doit poser problème si nul.

Ca doit pas être grand chose.

Merci encore pour ton aide.
Je viens de mettre en haut du code ça :

if(!empty($_POST)){
if(empty($_POST['Pays']) ){
echo 'Veuillez au moins remplir un champ de recherche<br /><br />
<a href="javascript:history.go(-1);">Retour au formulaire</a>';
}
}

J'ai ça à l'écran :

Veuillez au moins remplir un champ de recherche

Retour au formulaire
Fatal error: Call to a member function fetch() on a non-object in XXXXX on line 24

Ton idée était bonne, reste que ça coince toujours Smiley bawling
Re,

1/ normal le résultat de ton code.

mon idée c’était si les données sont bonnes ( note le !empty) executer la requête.

là tu as écris si j'ai soumis le formulaire et si les données ne sont pas bonnes afficher un message d'erreur. et puis on continue ( et là paf le message d'erreur )

tu aurais pu mettre:

if(!empty($_POST)){
  if(empty($_POST['Pays']) ){ 
    echo 'Veuillez au moins remplir un champ de recherche<br /><br />
    <a href="javascript:history.go(-1);">Retour au formulaire</a>';
  } else {
      try {
      //  ton code
     }
  }
}


2/ de même je t avais conseillé de tester que $reponse ne soit pas non vide juste avant le while.

si ta requete est vide mais que tu n'as aucun pays de trouvé? que contiendra $reponse?
je suis pas sur du resultat avec pdo mais il me semble qu'un test (bien ecris) n'a jamais fait de mal.
il faut rendre son code robuste!

3/ Ensuite je te voie employer du javascript ça m'inspire un autre conseil:
il me paraîtrait normal qu'en plus ( et pas à la place attention!!) de ta verification coté PHP tu valides déjà avec js que les champs ne sont pas vides.
ça éviterait que l'utilisateur se voit changer de page et qu'il ait un lien retour arrière a cliquer (retour arriere qui de toute façon s'appuie sur le js).


Pascal
Modifié par CPascal (30 Oct 2011 - 20:06)
Merci Pascal le problème vient de :

"si ta requete est vide mais que tu n'as aucun pays de trouvé? que contiendra $reponse?
je suis pas sur du resultat avec pdo mais il me semble qu'un test (bien ecris) n'a jamais fait de mal.
il faut rendre son code robuste!"

Il faut que je trouve un moyen d'empêcher l'envoi de requête vide, genre Pays non rempli, ça bloque le traitement de la requête.

J'avais pensé à un système de vérification de champ, mais avec l'envoi de la requête je me casse les dents !!!!! J'ai réussit à installer un JS, qui vérifie bien comme il faut, une fois le champ Pays rempli il n'envoi pas la requête Smiley bawling

Mon idée était toute simple à première vue, mais la réalisation s'avère plus compliqué que prévu.

La vérification de champs je sais faire mais couplé avec l'envoi d'une requête si champ complet là je sais pas faire Smiley confus

Grace à toi, j'ai bien avancé dans l'étude de mon projet.

Reste la partie réalisation, et là c'est une autre histoire !!!!

Merci encore.

Dominique Smiley decu

Ps : Je suis parti sur du Pdo grace à Mr Meto du site du Zéro. J'ai fait un programmen pdo qui marche du feu de dieu.
fetch() retourn FALSE quand il y a une erreur ou aucun résultat, donc ça te balance ton erreur. Pour cela il faut tester ta variable $reponse avant ton while


if($reponse){
   while ($donnees = $reponse->fetch())
  { 
    ton code
  }
}



par ailleurs, ta requête n'est pas protégée contre les injections SQL. Pour les contrer, utilise plutôt une requête préparée comme ceci, et avant ça tu checkes su ta variable en POST est vide ou non


if (!empty($_POST['Pays'])) {
    $reponse = $bdd->prepare("SELECT Pays, Capital FROM test WHERE Pays=:lepays");
    $bdd->execute(array("lepays" => $_POST['requete']));

    if ($reponse) {
        while ($donnees = $reponse->fetch()) {
            //ton code ici
        }
    }
    else{
        $error = "aucun résultat trouvé";
    }
}
else {
    $error = "le champ pays doit être rempli";
}

Modifié par xirt (04 Nov 2011 - 18:04)