Problème moteur de recherche PDO

a marqué ce sujet comme résolu.

Je crée ce nouveau sujet concernant un problème en PDO au niveau du moteur de recherche. J'ai un gros problème, ça affiche une erreur :'(((((

 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
<?php
if(isset($_POST['requete']) && $_POST['requete'] != NULL){
    try{
        $bdd = new PDO('mysql:host=localhost;dbname=root', 'root', 'root');
    }
    catch (Exception $e){
              die('Erreur : ' . $e->getMessage());
    }
 
    $requete = htmlspecialchars($_POST['requete']);
    $req = $bdd->prepare("SELECT * FROM users WHERE description LIKE :requete ORDER by ID DESC"); 
    $req->execute(array('requete' => $requete . '%'));
 
     
    $nb_resultats = $req->rowCount(); 
    if($nb_resultats != 0){ 
 
    ?>
    <h3>Résultats de votre recherche.</h3>
    <p>Nous avons trouvé <?php echo $nb_resultats;
    if($nb_resultats > 1) { echo 'résultats'; } else { echo 'résultat'; }
    ?>
    dans notre base de données. Voici les fonctions que nous avons trouvées :<br/>
    <br/>
    <?
    while($donnees = $req->fetch()) 
    {
    ?>
    <a href="profile.php?id=<? echo $donnees['id']; ?>"><? echo $donnees['nom']; ?></a><br/>
    <?
    }
    ?><br/>
    <br/>
    <a href="rechercher.php">Faire une nouvelle recherche</a></p>
    <?
    } 
    else
    {
    ?>
    <h3>Pas de résultats</h3>
    <p>Nous n'avons trouvé aucun résultat pour votre requête "<? echo $_POST['requete']; ?>". <a href="rechercher.php">Réessayez</a> avec autre chose.</p>
    <?
    }
    $req->closeCursor(); 
    }
else
{ 
?>
<p>Rechercher :</p>
 <form action="search.php" method="Post">
<input type="text" name="requete" size="10">
<input type="submit" value="Ok">
</form>
<?
}

?>
 
<?
}
?>
+0 -0

Normalement, l'erreur est assez claire : à la ligne 5 de search_box.php, tu as une erreur de syntaxe !

Généralement, quand PHP indique l'erreur à une ligne, il faut regarder une ou deux lignes avant pour trouver la cause de l'erreur : parenthèses non fermées, point-virgule oublié, etc.

Est-ce que le code que tu as copié est celui-ci de search_box.php ? Dans son intégralité ?

EDIT : J'ai repéré plusieurs erreurs dans ton code.

  • Tu délimites ton code PHP avec <? (pas conseillé) et <?php (recommandé). Il faut t'en tenir à une seule méthode. Remplace donc tous tes <? par des <?php.
  • La dernière accolade est en trop. Si tu indentais mieux tu t'en serais rendu compte. Enlève-là et tu n'auras plus aucune erreur.
+0 -0

J'ai pas encore testé ;)

mais y a t-il encore une erreur ?

 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
<?php
if(isset($_POST['requete']) && $_POST['requete'] != NULL){
    try{
        $bdd = new PDO('mysql:host=localhost;dbname=root', 'root', 'root');
    }
    catch (Exception $e){
              die('Erreur : ' . $e->getMessage());
    }

    $requete = htmlspecialchars($_POST['requete']);
    $req = $bdd->prepare("SELECT * FROM users WHERE description LIKE :requete ORDER by ID DESC"); 
    $req->execute(array('requete' => $requete . '%'));


    $nb_resultats = $req->rowCount(); 
    if($nb_resultats != 0){ 

    ?>
    <h3>Résultats de votre recherche.</h3>
    <p>Nous avons trouvé <?php echo $nb_resultats;
    if($nb_resultats > 1) { echo 'résultats'; } else { echo 'résultat'; }
    ?>
    dans notre base de données. Voici les fonctions que nous avons trouvées :<br/>
    <br/>
    <?php
    while($donnees = $req->fetch()) 
    {
    ?>
    <a href="profile.php?id=<? echo $donnees['id']; ?>"><?php echo $donnees['nom']; ?></a><br/>
    <?php
    }
    ?><br/>
    <br/>
    <a href="search.php">Faire une nouvelle recherche</a></p>
    <?php
    } 
    else
    {
    ?>
    <h3>Pas de résultats</h3>
    <p>Nous n'avons trouvé aucun résultat pour votre requête "<?php echo $_POST['requete']; ?>". <a href="search.php">Réessayez</a> avec autre chose.</p>
    <?php
    }
    $req->closeCursor(); 
    }
else
{ 
?>
<p>Rechercher :</p>
 <form action="search.php" method="Post">
<input type="text" name="requete" size="10">
<input type="submit" value="Ok">
</form>
<?php
}

?>

Edit :

Je viens de l'ajouter là, mais je sais pas je tape un mot clé je trouve rien. Et y a plus d'erreur sur mon script pourtant !? :/

+0 -0

Si tu ne trouves rien, deux possibilités :

  • Ta requête SQL n'est pas bien formée, ou ne correspond pas à ce que tu cherches
  • Il n'y a aucun résultat.

Serais-tu capable d'expliquer exactement ce que fait ta requête ?

PS :

J'ai pas encore testé ;) mais y a t-il encore une erreur ?

On ne va pas tester à ta place. Et globalement évite les double-post.

  • && $_POST['requete'] != NULL est redondant (= inutile) avec le isset qui précède
  • code illisible : indentation non respectée
  • $requete = htmlspecialchars($_POST['requete']); : pourquoi htmlspecialchars ? Les XSS c'est à l'affichage … (sans compter que pour PHP >= 5.4.0 si ce n'est pas de l'UTF-8, ça te renvoie juste une chaîne vide)
  • pas de gestion d'erreur
  • $nb_resultats = $req->rowCount(); : pas portable, PDOStatement::rowCount n'est officiellement pas censé fournir le nombre de lignes renvoyées par une requête SELECT mais affectées par un UPDATE/DELETE/INSERT (à la rigueur, si t'es sûr de rester sur MySQL, tu peux l'ignorer mais c'est quand même prendre une mauvaise habitude)
+0 -0

Si tu pouvais commencer par faire des phrases complètes avant tout …

Dans un premier temps, réécris tes premières lignes ainsi :

1
2
3
4
5
<?php
if(isset($_POST['requete'])){
    $bdd = new PDO('mysql:host=localhost;dbname=root', 'root', 'root', array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
    $req = $bdd->prepare('SELECT * FROM users WHERE description LIKE :requete ORDER by ID DESC');
    $req->execute(array('requete' => $_POST['requete'] . '%'));

En t'assurant que dans ton php.ini, display_errors soit bien à on.

Totalement en dehors de ton problème, je ne te conseille pas d'utiliser LIKE pour faire un moteur de recherche. Le problème avec LIKE est que tu dois avoir le contenu complet dans tes données pour que ça fonctionne. Je te conseille plutôt d'utiliser la fonctionnalité de recherche fulltext de MySQL, qui gère beaucoup mieux ce genre de problèmes. Pour plus d'infos, je te conseille de lire cet article (en anglais) : Using MySQL Full-text Searching.

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