«

»

Autocomplétion avec jQuery et MySQL

Bonjour,

Je vais vous expliquer comment faire facilement un système d’autocomplétion avec jQuery. Les données seront stockées en base de données.

Tout d’abord, pour ne pas réinventer la roue, je vous propose d’utiliser un plugin jQuery d’autocomplétion (site web). Je le préfère à celui de jQuery UI qui lui est en revanche plus populaire.

Nous allons donc utiliser celui du premier lien. Il faut tout d’abord télécharger le JS et le CSS.

Mise en place

On n’oublie pas de charger jQuery :

<link type="text/css" rel="stylesheet" href="css/jquery.autocomplete.css" />
<script type="text/javascript" src="js/jquery.js"></script>
<script type="text/javascript" src="js/jquery.autocomplete.js"></script>

Vous créez ensuite votre input le plus simple du monde :

Tapez une lettre : <input type="text" id="langages" />

Et vous appelez le plugin dessus :

$(document).ready(function() {
	$('#langages').autocomplete('fichier.php');
});

On lui indique quel fichier appeler en Ajax, ce dernier va se charger de récupérer la valeur entrée par l’utilisateur (contenue dans $_GET['q']), de se connecter à la base de données, faire la requête SQL et d’afficher d’éventuels résultats.

Voici le PHP :

<?php
// si on reçoit une donnée
if(isset($_GET['q'])) {
	$q = htmlentities($_GET['q']); // protection

	// connexion à la base de données
	try {
		$bdd = new PDO('mysql:host=localhost;dbname=nom_bdd', 'root', '');
	} catch(Exception $e) {
		exit('Impossible de se connecter à la base de données.');
	}
	// écriture de la requête
	$requete = "SELECT nom FROM langages WHERE nom LIKE '". $q ."%' LIMIT 0, 10";
	// exécution de la requête
	$resultat = $bdd->query($requete) or die(print_r($bdd->errorInfo()));
	// affichage des résultats
	while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
		echo $donnees['nom'] ."\n";
	}
}
?>

Si vous avez des attentes particulières, regardez du côté des options du plugin.
Vous pouvez personnaliser certains choses comme par exemple :

  • remplir l’input automatiquement à chaque sélection de proposition
  • envoyer des paramètres $_GET supplémentaires au fichier PHP
  • rendre la sélection sensible à la casse
  • etc.

Démo

Voilà, ce n’est pas plus compliqué que ça, j’ai mis en ligne une démo pour vous montrer ce que ça donne. J’ai enregistré en base de données différents noms de langages de programmation, je vous laisse essayer quelques lettres. ;)

Lien Permanent pour cet article : http://chez-syl.fr/2011/12/autocompletion-jquery-mysql/

15 commentaires

  1. LostUniverse

    Excellent didacticiel, merci beaucoup ! Je cherchais depuis quelques temps un tel exemple, j’ai enfin compris comment fonctionne l’autocomplétion !

  2. cari

    bonjour,
    j’ai essayé d’executer votre code ça ne marche pas
    pour le plugine jQuery qu’on télécharge on l’enregistre ou?
    pareil pour les deux fichiers JS et CSS
    si vous pouvez m’aider SVP
    Merci

    1. Syl

      Bonjour cari,

      Je ne pratique pas le support sur le blog, ce n’est pas fait pour cela. En revanche je te recommande de décrire ton problème à cet endroit tout en étant le plus précis possible.

  3. Alex

    Effectivement, ce code fonctionne très bien.

    Toutefois, y a-t-il possibilité de détecter le moment ou on clique sur une des valeurs de l’autocomplétion?
    J’ai besoin de cela pour faire une action dès que la valeur du textbox change.

    1. Syl

      Tu donnes la réponse dans ta question. :)
      $('#langages').on('change', function() {

      });​​​

  4. Alex

    Bonjour,
    tout d’abord merci, ça marche super bien.
    toutefois, je rencontre un petit problème, pour certaines valeurs sélectionnées, la textBox se remplit et se vide très rapidement. En gros après sélection parmi les choix proposés, je n’ai rien dans la textbox, je n’arrive pas à déterminer à quoi ce bug est dû ! ce bug a tendance à être récurrent lorsque les données affichées sont grandes (en longueur de caractères) mais même après avoir augmenté la maxLenght, et la width, le problème persiste.

    Merci d’avance pour la réponse.

    1. Syl

      Alex, je te renvoie à ma réponse au commentaire de cari que tu retrouveras plus haut.

  5. herve

    Bonjour,

    Je viens de tester votre code, très très bien. Par contre, je voudrais l’utiliser dans un formulaire, et j’ai un conflit avec la connection PDO générale de la page. Sur ma 1er page j’ai une connection avec la base et une deuxième avec votre fichier Search.

    J’espère que vous comprenez mon problème.

    La persistance n’est pas assurez pour la connexion avec la base sur ma premiere page et la page Search..
    Merci pour votre réponse.

    1. Syl

      Bonjour, rien ne t’empêche de mettre le code PHP sur la même page. :)

  6. herve

    Il est inclut dans la page, mais c’est pareil …par contre, ta page contact ne marche pas sur ton site …

    1. Syl

      Comme dit dans mes précédentes réponses, mon site n’est pas une plateforme de support, utilise les forums pour cela. Mon formulaire de contact fonctionne bien je viens de l’essayer à l’instant. :)

  7. herve

    j’avais compris pas de problème … Sinon quelqu’un a–t-il déjà utilisé ce code dans un formulaire inclus avec d’autres connexions à la base de donnée ? Me concernant, il y a duplication de la connexion à la base et ça ne marche pas (principalement parce que l’include search utilise une connexion à la base de données). Merci pour vos réponse ou exemples.

    1. Syl

      Ne te connecte pas à la base de données dans l’include alors.

  8. herve

    Bonjour Syl, je viens de sortir la connexion de la base : $bdd = new PDO en dehors sur la page général et ca fonctionne pas ? Est-ce que des utilisateurs ont déjà ces problèmes sur ce script ?

    1. Syl

      Bonjour, je ne répondrai plus aux questions d’ordre technique. J’ai déjà expliqué pourquoi.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser les balises HTML suivantes : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>