Bonjour à tous,

Voila sur un site j'ai mis en place une sorte de "moteur" de recherche avec auto complétion, lorsque l'utilisateur tape une lettre dans le champ de recherche, je cherche dans ma base les mots commencent par cet lettres etc etc..

Mon système marche nickel, sauf que je viens de m’apercevoir, que ça ne marche pas pour les mots stockés dans ma base contenant un &.

Mes requêtes sont bonnes, car les mots ne contenant pas se caractère sont bien affichés dans ma liste déroulante de résultats ainsi que leurs définition.
Mais lorsque je sélectionne un mot avec un &, ça définition ne s'affiche pas.

Pour affiché la définition d'un mot, lors du clic sur le LI je passe par un GET pour récupérer le mot et ensuite avec une requête je récupère se GET que je stock dans une variable:

if (!empty($_GET'terme'])) {
$terme = strip_tags($_GET'terme']);

Et après ça je fait une requête préparé pour sélectionné la définition en testant cet variable..
Et ça marche pour tout sauf avec ce fameux &.

Voili voilou mon petit soucie, si quelqu'un peut m'aider merci d'avance et bonne journée :).

8 réponses


le problème est que & signifie un autre paramètre

avant d'appeler la page qui fait la recherche tu change le caractère & dans le terme par un autre par exemple par @@@ et après le strip_tags tu remplace @@@ par &

iluzzion
Auteur

Le & est interprété dans ma requête comme un AND c'est sa ?

Oui c'est sa

Tu peux essayer un truc comme :

<?php $content = str_replace('&', '&', $content); ?>
iluzzion
Auteur

J'ai essayé $content = str_replace('&', '&', $content); et aussi strtr mais c'est toujours pareil

ton code complet stp

iluzzion
Auteur

Voila mon code

<div class="Def">
                <?php
                if (!empty($_GET'terme'])) {
                    $terme = strip_tags($_GET'terme']);

                    ?>

                    <?php

                    if ($_SESSION'langue'] == "fr_FR") {
                        $req = $bdd->prepare('SELECT * FROM glossaire WHERE mot_Fr=:terme');
                        $req->execute(array(':terme' => $terme));
                    } else if ($_SESSION'langue'] == "en_US") {

                        $req = $bdd->prepare('SELECT * FROM glossaire WHERE mot_En=:terme');
                        $req->execute(array(':terme' => $terme));
                    }
                    while ($data = $req->fetch(PDO::FETCH_OBJ)):
                        ?>
                        <h2 id="glossaireD"> 
                    <?php
                if ($_SESSION'langue'] == "fr_FR") {
                    echo $data->mot_Fr;
                } else if ($_SESSION'langue'] == "en_US") {
                    echo $data->mot_En;
                }
                        ?></h2>
                        <p><?php
                    if ($_SESSION'langue'] == "fr_FR") {
                        echo $data->def_Fr;
                    } else if ($_SESSION'langue'] == "en_US") {
                        echo $data->def_En;
                    }
                        ?>
                           </p>
                        <?php
                    endwhile;
                    $req->closeCursor();
                    ?>
                    <?php
                } else {

                }
                ?>

            </div>

Après derrière ça j'ai de l'ajax.

Sinon tu peux toujours :
Supprimer les "&" dans ta base(mettre @@@ a la place par exemple)
Remplacer & par @@@ dans ton $content

<?php $content = str_replace('&', '@@@', $content); ?>