php : J'ai 2 erreurs que je n'arrive pas a resoudre

a marqué ce sujet comme résolu.

J’ai 2 erreurs que je n’arrive pas a resoudre

Fatal error: Uncaught Error: Call to a member function fetch() on boolean in /Applications/MAMP/htdocs/Amal/index.php:201 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/Amal/index.php on line 201

Fatal error: Uncaught Error: Call to a member function rowCount() on boolean in /Applications/MAMP/htdocs/Amal/index.php:199 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/Amal/index.php on line 199

voici mon code :

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
<?php

if(isset($_POST['envoyer']) && $_POST['envoyer'] != NULL)
 // on vérifie d'abord l'existence du POST et aussi si la requete n'est pas vide.
       {

if(isset($_POST['mot']) && $_POST['mot'] != NULL)
 // on vérifie d'abord l'existence du POST et aussi si la requete n'est pas vide.
       {

        if(isset($_POST['conditions']) && $_POST['conditions'] != NULL)


{


try
{
$bdd = new PDO('mysql:host=localhost;dbname=amal_base;charset=utf8', 'root', 'root');
} catch (Exception $e ) {

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


$mot = htmlspecialchars($_POST['mot']);
$mot_clef= explode("," , $mot);



$sql = "SELECT * FROM maladie WHERE Symptome REGEXP AND '";
$len = count($mot_clef);
foreach ($mot_clef as $value)
{
   $i = 0;
   foreach ($mot_clef as $mot)
   {
      if ($mot != $value && $i != ($len - 1)) {
         $sql .= ' (colonne LIKE "%'.$value.'%" AND colonne LIKE "%'.$mot.'%") OR ';
      }
      if ($mot != $value && $i == ($len - 1)) {
         $sql .= ' (colonne LIKE "%'.$value.'%" AND colonne LIKE "%'.$mot.'%")';
      }
      $i++;
   }
}
$sql .= ' ORDER BY id ASC';

$nb_resultats = $bdd -> query($sql) -> rowCount();
if ($nb_resultats > 0)
 {
echo (" $nb_resultats resultat(s)" ) ;
 }

else
  {?>
    <br/><strong><?echo ("Desoler nous n'avons pas trouver , Veuillez verifier votre saisi."); ?> <br/> <? echo (" Cela n'exclu pas l'importane de consulter un specialiste  ");
  }?> </strong>

    <?


$resx = $bdd -> query($sql);
while ($donnees = $resx -> fetch())
    {

?>
<p>

<strong> <? echo $donnees['id']; ?> </strong><?php echo $donnees['titre']; ?> <br/>

 <form method="post" action="<?php echo $donnees['titre']?>.php">

  <input type="submit" name="ouvrir" value=" Voir  " >
  </form>
   <br/>
<?php


     }


$bdd -> query($sql)->closeCursor();

         }else {

echo " Veuillez accepter les conditions  ";

}


    } else {

echo " Veuillez remplir le champs texte ";

}


}

?>

`

Ce serait pas mal de faire preuve d’un minimum de courtoisie quand tu demandes de l’aide : dire bonjour, un peu d’infos sur ton code, tout ça…


Sinon, pour ton erreur, renseigne-toi sur la gestion des exceptions (un indice : ça se joue avec du try/catch) et tu en sauras plus sur l’origine du problème. ;)


Ensuite ton code mériterait d’être indenté de façon plus claire pour que l’on s’y retrouve.

Enfin, et là c’est très important pour toi : lignes 31 à 47, tu t’exposes à de belles failles de sécurité en injectant des variables dans ta requête sans les échapper.


À noter au passage que echo ne prend pas de parenthèses (c’est une instruction, pas une fonction).

desolé j’y ai pas penser , ma ligne 31 a 47 ???

Numerix13

Ce que veux dire Viki, c’est que ton code est vulnérable à une faille connue sous le nom d’injection SQL. Le plus simple pour t’en prémunir est de préparer tes requêtes. Regarde du côté de la méthode prepare() de PDO. ;)

+0 -0

Hey, tu dois corriger ces problèmes d’injection dans tous les cas avant de mettre ton application en production parce qu’il y a des tas de petits malins qui s’amusent à exploiter les failles évidentes comme ça. Dans certains cas, en injectant du SQL, un attaquant peut avoir un contrôle total sur ta base de données (il peut récupérer des choses secrètes, tout supprimer, …). Tes erreurs sont un tout autre problème (et à mon avis, tes erreurs sont un problème bien moins grave).

sa stopera les erreurs en n’etes vous sure ??

Numerix13

L’histoire de faille ne corrigera pas ton problème initial, non, mais comme indiqué par motet-a, il te faudra à un moment ou à un autre les résoudre.

Fatal error: Uncaught Error: Call to a member function fetch() on boolean in /Applications/MAMP/htdocs/Amal/index.php:201 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/Amal/index.php on line 201

Fatal error: Uncaught Error: Call to a member function rowCount() on boolean in /Applications/MAMP/htdocs/Amal/index.php:199 Stack trace: #0 {main} thrown in /Applications/MAMP/htdocs/Amal/index.php on line 199

Comme indiquent les erreur, les méthodes fetch() et rowCount() ont retourné un booléen au lieu d’un tableau. La documentation de PHP nous informent à ce propos :

Valeurs de retour

La valeur retournée par cette fonction en cas de succès dépend du type récupéré. Dans tous les cas, FALSE est retourné si une erreur survient.

Tu as donc une erreur dans ta requête SQL, que tu peux obtenir en rattrapant l’erreur à l’aide de try/catch comme indiqué par viki53 plus haut :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
try {
    $req = "SELECT * FROM......";
    $q = $bdd->prepare($req);
    $q->execute([
        // les paramètres de ta requête
    ]);

    while($r = $q->fetch()) {
        // ...
    }
}
catch(PDOException $e) {
    die("Erreur SQL : " . $e->getMessage());
}

PS : code écrit à l’arrache sans tester, uniquement écrit pour te donner une idée de la façon dont tu peux :

  1. corriger la faille susdite ;
  2. obtenir l’erreur dans ta requête SQL.
+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte