[RESOLU] Recherche avec LIKE

Eléphant du PHP | 386 Messages

06 mai 2014, 15:27

Bonjour,

J'ai un script d'autocomplétion en ajax.
Le problème se trouve en SQL, j'aimerais que la recherche se précise à chaque lettre.

Par exemple, si j'entre la lettre A, tous les prénom qui ont la première lettre A vont s'afficher.
Maintenant si j'écris An, j'aimerais que les résultats changent, et affichent les prénom avec les 2 premières lettres An

Voici ma requête :
if(isset($_POST['queryString'])){
	$queryString = $_POST['queryString'];
	if(strlen($_POST['queryString']) > 0){
		$resultat = Bdd::connect() -> prepare("SELECT prenom, nom FROM users WHERE CONCAT(prenom,' ',nom) LIKE :q OR CONCAT(nom,' ',prenom) LIKE :q ORDER BY prenom LIMIT 10");
		$resultat->execute(array('q' => $queryString.'%'));
		if($resultat){
			while($result = $resultat -> fetch(PDO::FETCH_ASSOC)){
				if($result['prenom'] == infoMembre($id,'prenom')){
					return false;
				} else {
					echo '<li onClick="fill(\''.$result['prenom'].'\');">'.$result['prenom'].' '.$result['nom'].'</li>';
				}
			}
		} else {
			echo 'Erreur';
                        exit();
		}
	} 
} else {
	header('location:index.php');
        exit();
}
Les deux CONCAT, servent à rechercher les membres à la fois par leur nom ou leur prénom.

Merci d'avance

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

07 mai 2014, 01:28

Salut,

C'est ce que ton code semble faire.
As tu testé cette requête dans un client sql ?

Pourquoi utiliser la concaténation alors que tu peux très simplement tester chaque colonne (where prénom like '' or nom like ''

As tu penser a rendre ce code non sensible a la casse (lower ou upper sur la recherche afin d'éviter les problèmes.

Il faut que tu détails plus ton problème ce n'est pas clair du tout.

Tu ne devrais pas aussi sélectionner la clef primaire afin d'identifier correctement un membre (homonymie ?)

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 386 Messages

07 mai 2014, 19:02

En fait, ça fonctionne très bien comme ça.
J'ai oublié de faire des tests :wink:

J'aimerais juste filtrer les résultats avec WHERE pour ne pas rechercher son propre prénom et nom.
J'utilise une fonction qui cherche les infos du membre connecté :

infoMembre($_SESSION['id'],'prenom');
infoMembre($_SESSION['id'],'nom');

À partir de la requête comment filtrer les résultats pour que la recherche affiche "Aucun résultat" quand on cherche son propre prénom ou nom.
Le problème c'est que plusieurs membres peuvent avoir le même nom ou le même prénom.

Voici la requête :
$resultat = Bdd::connect() -> prepare("SELECT id, prenom, nom, pseudo FROM users WHERE CONCAT(prenom,' ',nom) LIKE :q OR CONCAT(nom,' ',prenom) LIKE :q ORDER BY prenom LIMIT 10");