[RESOLU] Auto-complétion : Filtre avec WHERE LIKE

Eléphant du PHP | 386 Messages

09 mai 2014, 20:46

Bonjour,

J'ai un script auto-complétion avec jQuery et Mysql.
Il permet de rechercher tous les membres du site par leur nom et prénom, et j'aimerais filtrer la recherche en ignorant le nom et prénom du membre connecté.
Les résultats de la recherche permettent de visiter leur profil.

Sinon à part ça, tout fonctionne :wink:

Voici le code de la requête :
$resultat = Bdd::connect() -> prepare("SELECT id, prenom, nom, pseudo, sexe FROM users WHERE CONCAT(prenom,' ',nom) LIKE :q OR CONCAT(nom,' ',prenom) LIKE :q ORDER BY prenom LIMIT 10");
Et le code entier :
if(isset($_POST['queryString'])){
	$queryString = $_POST['queryString'];
	if(strlen($_POST['queryString']) > 0){
		$resultat = Bdd::connect() -> prepare("SELECT id, prenom, nom, pseudo, sexe FROM users WHERE CONCAT(prenom,' ',nom) LIKE :q OR CONCAT(nom,' ',prenom) LIKE :q ORDER BY prenom LIMIT 10");
		$resultat->execute(array('q' => $queryString.'%'));
		$countResult = $resultat -> rowCount();
		if($resultat){
			if($countResult > 0){
				echo '<div id="sidebarList"><span class="sidebarTitle">Recherche ('.$countResult.')</span><div class="sidebarBorder"></div></div>';
				while($result = $resultat -> fetch(PDO::FETCH_ASSOC)){
					$avatar = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.$result['id'].'-mini.jpg';
					$avatarDefault = $result['sexe'] == 'homme' ? 'homme.jpg' : 'femme.jpg';
					echo '<li>';
					echo '<a href="'.$result['pseudo'].'" data-reactid="'.$result['id'].'" class="sidebarLink">';
					if(file_exists($avatar)){
					echo '<div class="sidebarImg"><img src="users/upload/avatars/'.$result['id'].'-mini.jpg" class="friendsAvatar" height="24" width="24" alt="" /></div>';
					} else {
					echo '<div class="sidebarImg"><img src="users/upload/avatars/'.$avatarDefault.'" class="friendsAvatar" height="24" width="24" alt="" /></div>';
					}
					echo '<div class="sidebarName">'.majuscule($result['prenom']).' '.majuscule($result['nom']).'</div>';
					echo '</a>';
					echo '</li>';
				}
				echo '<script type="text/javascript">$(\'a[rel="ignore"]\').hover(function(){$(this).removeAttr(\'href\');},function(){$(this).attr(\'href\',\'#\');});</script>';
			} else {
				echo '<div id="sidebarList"><span class="sidebarTitle">Recherche (0)</span><div class="sidebarBorder"></div></div>';
				echo '<div id="noSearch">Aucun résultat pour votre recherche</div>';
			}
		} else {
			echo 'Il y a un problème avec la requête sql.';
		}
	} 
} else {
	echo 'Il ne devrait pas avoir un accès direct à ce script !!!';
}
Merci d'avance

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

09 mai 2014, 21:24

Salut,

Ajoute la condition ;)

Select .... from users where ( like or like ) and id != '$_SESSION['userid']'

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

Eléphant du PHP | 386 Messages

09 mai 2014, 21:30

J'ai un message d'erreur :

Warning: PDOStatement::execute(): SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE OR LIKE ) AND id != '1' ORDER BY prenom LIMIT 10' at line 1 in /public_html/users/ajax/searchfriends.php on line 9

Et je comprend pas, il faut bien mettre 'q' => $queryString.'%' sinon dès qu'on commence à écrire, le résultat ne s'affichera pas

J'ai fais ça :
$resultat = Bdd::connect() -> prepare("SELECT id, prenom, nom, pseudo, sexe FROM users WHERE  prenom LIKE '' :q OR nom LIKE '' :q AND id != :id ORDER BY prenom LIMIT 10");
$resultat->execute(array('q' => $queryString.'%','id' => $_SESSION['id']));
Ça affiche bien les membres comme avec la concaténation, mais mon prénom et mon nom n'est pas filtré

Eléphanteau du PHP | 12 Messages

09 mai 2014, 22:17

SELECT id, prenom, nom, pseudo, sexe FROM users WHERE CONCAT(prenom, ' ', nom) LIKE ':q%' OR ':q%' AND id != :marqueurIdUtilisateur
Je n'ai pas vérifié mais ça doit être un truc dans le genre. Je pense que la requête préparée doit savoir se démerder avec les quotes alors dans le doute....
Si tu tiens à faire un requête préparée (surement pour éviter les injections ?) utilise plutôt ('q' => $querystring) avec la requête du dessus, et laisse la requête faire le reste.

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

10 mai 2014, 00:36

ta requête est foireuse va pas plus loin corrige l'originale:)

il faut toujours tester les requêtes avec un client SQL.

pour info la différence en sql c'est <>

Voici un exemple de requête fonctionnelle
SELECT id, prenom, nom, pseudo, sexe
FROM users
WHERE (CONCAT(prenom,' ',nom) LIKE '%toto%' OR CONCAT(nom,' ',prenom) LIKE '%toto%') and id <> 12
ORDER BY prenom
LIMIT 10
@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 386 Messages

10 mai 2014, 13:00

Problème résolu, merci :)
if(isset($_POST['queryString'])){
	$queryString = $_POST['queryString'];
	if(strlen($_POST['queryString']) > 0){
		$resultat = Bdd::connect() -> prepare("SELECT id, prenom, nom, pseudo, sexe FROM users WHERE prenom LIKE '' :q OR nom LIKE '' :q AND id <> :id ORDER BY prenom LIMIT 10");
		$resultat->execute(array('q' => $queryString.'%','id' => $_SESSION['id']));
		$countResult = $resultat -> rowCount();
		if($resultat){
			if($countResult > 0){
				echo '<div id="sidebarList"><span class="sidebarTitle">Recherche</span><div class="sidebarBorder"></div></div>';
				while($result = $resultat -> fetch(PDO::FETCH_ASSOC)){
					if($result['id'] != $_SESSION['id']){
						$avatar = $_SERVER['DOCUMENT_ROOT'].'/users/upload/avatars/'.$result['id'].'-mini.jpg';
						$avatarDefault = $result['sexe'] == 'homme' ? 'homme.jpg' : 'femme.jpg';
						echo '<li>';
						echo '<a href="'.$result['pseudo'].'" data-reactid="'.$result['id'].'" class="sidebarLink">';
						if(file_exists($avatar)){
						echo '<div class="sidebarImg"><img src="users/upload/avatars/'.$result['id'].'-mini.jpg" class="friendsAvatar" height="24" width="24" alt="" /></div>';
						} else {
						echo '<div class="sidebarImg"><img src="users/upload/avatars/'.$avatarDefault.'" class="friendsAvatar" height="24" width="24" alt="" /></div>';
						}
						echo '<div class="sidebarName">'.majuscule($result['prenom']).' '.majuscule($result['nom']).'</div>';
						echo '</a>';
						echo '</li>';
					} else {
						echo '<div id="noSearch">Aucun résultat</div>';
					}
				}
				echo '<script type="text/javascript">$(\'a[rel="ignore"]\').hover(function(){$(this).removeAttr(\'href\');},function(){$(this).attr(\'href\',\'#\');});</script>';
			} else {
				echo '<div id="sidebarList"><span class="sidebarTitle">Recherche</span><div class="sidebarBorder"></div></div>';
				echo '<div id="noSearch">Aucun résultat</div>';
			}
		} else {
			echo 'Erreur SQL';
		}
	} 
} else {
	header('location: ../../home');
	exit();
}