2009-12-17 4 views
1

Je crée une application Ajax autocomplete et je voudrais savoir s'il y a une requête SQL que je peux utiliser à cette fin - par exemple si quelqu'un tape "p" je voudrais récupérer tous les mots commençant par "p", s'ils ajoutent "e", récupérez tous les mots commençant par "pe" - et continuez ainsi.MySql - autocomplétion

Quelqu'un a suggéré la requête ci-dessous, mais je ne pense pas que c'est ce que je cherche:

$query = "SELECT* FROM nametable WHERE names LIKE '$partialstring' "; 

Répondre

3
$query = "SELECT* FROM nametable WHERE names LIKE '$partialstring%' "; 

J'ai ajouté% seulement sur le côté droit puisque vous voulez avoir seulement les mots qui commencent avec les lettres d'entrée. Cependant, veuillez ne pas utiliser cette requête tant que vous ne l'avez pas filtrée par rapport aux injections SQL.

2

Cela devrait fonctionner:

$query = "SELECT * FROM nametable WHERE names LIKE '$partialstring%'" 

Le % est le caractère générique dans SQL.

Editer: Et oui, s'il vous plaît sanitize that input.

+0

Merci pour le conseil. –

0

En supposant que vous désinfectante cette entrée, il devrait être quelque chose comme:

$query = "SELECT* FROM nametable WHERE names LIKE '$partialstring%' "; 
0

Vous pouvez exécuter une requête comme celle que Henning et d'autres ont écrite. Et, oui, s'il vous plaît assainir l'entrée pour éviter les attaques par injection. J'ai également trouvé cette méthode plutôt lente quand il y a beaucoup d'enregistrements. Si vous souhaitez correspondre à «Bush» dans le mot «GeorgeW Bush Senior», la méthode ci-dessus ne fonctionnera pas. Dans ce cas, vous devez utiliser la requête

select name from nametable where name like '%match%'; 

Essayez de regarder la méthode mysql full text query. C'est extrêmement pratique dans certains cas.

+0

Merci mon ami pour le conseil - je veux seulement faire correspondre les premières lettres et c'est une table relativement petite avec les noms de ville - '$ partialstring%' fonctionne très bien. –

1

En dehors des caractères spéciaux réguliers, vous devez échapper à ceux qui ont une signification particulière dans LIKE clauses.

Je n'ai pas entièrement testé le code mais il devrait être quelque chose comme cela, en supposant que vous utilisez PHP et le bon vieux mysql l'extension (vous ne mentionnez pas):

$escape = '|'; 

$like = strtr(
    mysql_real_escape_string($partialstring), 
    array(
     '%' => $escape . '%', 
     '_' => $escape . '_', 
     $escape => $escape . $escape, 
    ) 
); 

$query = "SELECT names FROM nametable WHERE names LIKE '$like%' ESCAPE '$escape' ORDER BY names LIMIT 10"; 

De plus, n » t oublier de créer un index sur la colonne noms.

Questions connexes