Page 1 sur 1

Auto-complétion : Filtre avec WHERE LIKE

Posté : 09 mai 2014, 20:46
par nico44530
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

Re: Auto-complétion : Filtre avec WHERE LIKE

Posté : 09 mai 2014, 21:24
par moogli
Salut,

Ajoute la condition ;)

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

@+

Re: Auto-complétion : Filtre avec WHERE LIKE

Posté : 09 mai 2014, 21:30
par nico44530
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é

Re: Auto-complétion : Filtre avec WHERE LIKE

Posté : 09 mai 2014, 22:17
par Bakaarion
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.

Re: Auto-complétion : Filtre avec WHERE LIKE

Posté : 10 mai 2014, 00:36
par moogli
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
@+

Re: Auto-complétion : Filtre avec WHERE LIKE

Posté : 10 mai 2014, 13:00
par nico44530
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();
}