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

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] Auto-complétion : Filtre avec WHERE LIKE

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

par nico44530 » 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();
}

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

par moogli » 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
@+

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

par Bakaarion » 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.

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

par nico44530 » 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é

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

par moogli » 09 mai 2014, 21:24

Salut,

Ajoute la condition ;)

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

@+

Auto-complétion : Filtre avec WHERE LIKE

par nico44530 » 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