Bonjour, je réalise un système de recherche qui fonctionne à moitier, je m'explique si je cherche un utilisateur qui s'appel Pierre Marvin, je vais écrire Pierre il me trouve le membre, je vais écrire Marvin il me trouve le membre mais j'écrit Pierre Marvin il me trouve pas le membre. Pourquoi ? J'ai ajouté un OR avec un AND mais là je sais pas d'ou sa peut venir. Car il me dit aucun résultat.

<?php
                if(isset($_POST['btnrecherche']))
                {
                    $recherche = htmlspecialchars($_POST['recherche']);

                    if($recherche == true)
                    {   
                        $req = preg_replace("#[^a-zA-Z ?0-9]#i", "", $recherche);

                        $recherche1 = "SELECT * FROM membre WHERE prenom LIKE ? OR nom LIKE ? XOR (prenom LIKE ? AND nom LIKE ?) ";

                        $req1 = $bdd->prepare($recherche1);
                        $req1->execute(array('%'.$req.'%', '%'.$req.'%', '%'.$req.'%', '%'.$req.'%'));

                        $count = $req1->rowCount();

                        if($count >= 1){
                        echo $count. " resultat(s) trouvé(s)<hr/>";
                        while ($donnees = $req1->fetch(PDO::FETCH_ASSOC)){
                        ?>
                        <div class="recherchermembre">
                            <table>
                               <tr>
                                   <td>
                                    <div class="nom">
                                       <?php echo $donnees['prenom'];?> <?php echo $donnees['nom'];?> 
                                    </div>
                                    <div class="image" style="background-image:url(afforiginal/<?php echo $donnees['affiche'];?>)"> 
                                        <img src="afforiginal/<?php echo $donnees['affiche'];?>" alt="image recherche">
                                    </div>
                                   </td>
                                    <td>
                                   <a class="btnturcplus" href="profil.php?id=<?php echo $donnees['idmembre'];?>">Voir le profil</a>
                                   </td>
                               </tr>
                            </table>    
                        </div>
                        <hr>
                        <?php
                        }
                        }else{
                        echo "0 résultats trouvés pour votre recherche...";
                        }

                        $req1->closeCursor();
                    }
                }

6 réponses


Carouge10
Réponse acceptée

quand tu fais un concat, il assemble les deux éléments sans espace.
donc mysql fais "PierreMarvin" ce qui est différent de ce que tu cherches.
Pour cela on ajoute un espace dans le concat pour que mysql nous ressorte bien le nom et le prénom sans les coller

Salut Serge77
Essai ceci =>

$recherche1 = "SELECT * FROM membre WHERE prenom LIKE :query OR nom LIKE :query OR concat(prenom, nom) LIKE :query OR concat(nom, prenom) LIKE :query";      
$req1 = $bdd->prepare($recherche1);
$req1->execute(array('query' => "%$req%"));  
Serg77
Auteur

Salut, ça fonctionne pour "Nom" ou "Prenom" mais pas les deux Nom + Prenom

Il faut ajouter un espace entre le nom et le prénom sinon CONCAT assemble les deux:
CONCAT(prenom, ' ', nom)

Serg77
Auteur

Carouge10, je vois pas ce que tu veux dire.

Serg77
Auteur
                        $recherche1 = "SELECT * FROM membre WHERE prenom LIKE :query OR nom LIKE :query 
                        OR CONCAT(prenom, ' ', nom) LIKE :query OR CONCAT(prenom, ' ', nom) LIKE :query";      
                        $req1 = $bdd->prepare($recherche1);
                        $req1->execute(array('query' => "%$req%"));  
Comme ça ?