Autocomplete

Mammouth du PHP | 687 Messages

14 nov. 2011, 21:37

Bonsoir à tous,
j'ai ajouté un script d'autocomplete pour mon formulaire de recherche mais celui-ci ne fonction pas sur des requêtes de tyte text... En revanche sur un champs sql de type varchar(250) par exemple il n'y a pas de probleme...
Merci par avance.
  <script>
  $(document).ready(function() {
    $("input#autocomplete").autocomplete({
    source: [<?php    		
mysql_connect("loacalhost","root","");

/* selection de la base de donnée mysql */
mysql_select_db("table");
  		$sql = mysql_query("SELECT * FROM  coordonnees"); 
  		while ($off = mysql_fetch_assoc($sql)) {
		echo '"'.$off['activite].'",';	
		} 
		mysql_close(); ?>]
});
  });
  </script>

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

14 nov. 2011, 22:53

Dans ton contexte, il n'y a pas de différence entre un champ de type texte et un varchar en dehors de la taille du champ... A tout les coups, ton champ texte contient une guillemet (qui ferme la chaine) ou des retours à la ligne (considéré par js comme une fin d'instruction) qui font planter le javascript généré...

Regarde le code source de la page que tu génères tu verras plus facilement ce qui pose problème :) En fonction, suffira de backslasher les guillemets ou de remplacer les retours à la ligne physique par des "\\\n" que javascript pourra interpréter comme les retours à la ligne "\n" et qui ne couperont pas la chaine...
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Mammouth du PHP | 687 Messages

14 nov. 2011, 23:12

Merci pour ta réponse, il y a effectivement des saut de ligne entre chaque mot :
exemple : Nettoyage,
Nettoyage industriel
Penses-tu du coup qu'avec le code que j'ai noté précédemment que je puisse faire ce que je souhaite faire?

Merci

ViPHP
AB
ViPHP | 5818 Messages

15 nov. 2011, 00:12

Ah bah pourquoi tu fais pas une requête ajax standard vers une page php qui fera la requête et renverra le résultat ?

Mammouth du PHP | 687 Messages

15 nov. 2011, 00:41

Bonsoir AB,
je n'y avais pas pensé :D tout simplement parce que je ne sais pas faire...
J'ai réussi à adapter ce code en suivant un tuto mais de la à créer tout le systeme...
En revanche peut-être qu'il existe un tuto pour faire cela?

Merci

ViPHP
AB
ViPHP | 5818 Messages

15 nov. 2011, 01:07

Un tuto je sais pas mais y'a déjà la doc

Faudra mettre l'adresse de ton fichier php dans le paramètre "source" de l'autocomplete

Code : Tout sélectionner

autocomplete({ autoFocus: true, minLength: 2, delay: 800, appendTo: "#id_result", source: "destination_fichier.php5", ...
ici je l'ai nommé "destination_fichier.php5". Et dans "destination_fichier.php5" tu pourras récupérer la variable $_GET['term'] et l'utiliser pour faire ta recherche dans ta requête. Ensuite tu fais ton tri en php et tu renvoies ce que tu veux avec un echo tout bête. Attention d'utiliser l'utf-8.

Mammouth du PHP | 687 Messages

15 nov. 2011, 01:18

Je te remercie pour cette réponse rapide...
Je vais essayer de faire comme je peux avec le peu de connaissance et tes conseils.

Merci beaucoup pour ton aide.

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

15 nov. 2011, 18:35

C'est vrai qu'avec ajax, c'est plus classe :) (y a même un p'tit tuto super sympa, ludique et tout qui explique comment fonctionne ajax dans le forum FAQ :-*)

Sinon sans utiliser ajax, il suffit simplement de ne pas faire apparaitre les retours chariot dans le code javascript généré.. en gros, au lieu de

Code : Tout sélectionner

"Nettoyage, Nettoyage industriel"
Il te faut générer le code

Code : Tout sélectionner

"Nettoyage, \nNettoyage industriel"
Et donc demander à php de remplacer les "\n" de ta chaine par "\\n" qui produiront la chaine "\n" au lieu d'un retour à la ligne dans le fichier html

Quelque chose du genre :
 echo '"'.str_replace("\n", "\\n", $off['activite]).'",';  
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

ViPHP
ViPHP | 5462 Messages

15 nov. 2011, 18:38

plutôt faire un addcslashes
echo addcslashes($str, "\0..\37\42\134");

Mammouth du PHP | 687 Messages

15 nov. 2011, 19:09

Merci pour vos réponses,
j'ai essayé avec ça : echo '"'.str_replace("\n", "\\n", $off['activite']).'",'; mais cela ne fonctionne pas...
en ce qui concerne echo addcslashes($str, "\0..\37\42\134"); je n'ai pas compris ce qu'il y a entre parenthèses... :-(

Merci beaucoup.
je viens de regarder dans la base et en exportant celle-ci les activités s'affichent comme ça :
Réalisation d''études mécaniques (plans 2D/3D),\r\nRéalisation de cahiers des charges,\r\nRéalisation de notices pour des machines spéciales de contrôle et d''assemblage,\r\nOutillages de presse,\r\nManutention,\r\nTout type de produits industriels

Mammouth du PHP | 687 Messages

16 nov. 2011, 23:44

Bonsoir,
Personne n'a d'idées pour résoudre mon problème?

Merci par avance.

Mammouth du PHP | 687 Messages

18 nov. 2011, 14:03

toujours pas d'idées?

ViPHP
AB
ViPHP | 5818 Messages

18 nov. 2011, 20:08

On t'a déjà donné des indications dans nos précédents messages. Qu'à tu essayé ?

Il faut faire la distinction entre l'autocomplete et la recherche dans ta bdd, ces sont deux choses distinctes.
Quand tu fais tes requêtes de recherche dans ta bdd, obtiens-tu les résultats souhaités (indépendamment de l'autocomplète). C'est par là qu'il faut commencer.

Mammouth du PHP | 687 Messages

18 nov. 2011, 20:14

Bonsoir,
Je sais que j'ai reçu des explications mais après les avoir appliqués cela ne fonctionne toujours pas, notamment le \\n dommage pour moi.
Concernant mon moteur de recherche, il fonctionne très bien, je voulais juste ajouter un petit plus à celui ci, un peu du style de Google...

Merci.

ViPHP
AB
ViPHP | 5818 Messages

19 nov. 2011, 04:29

Comme je le disais plus haut à mon avis c'est plus instructif et aussi plus souple de travailler sur une page php séparée pour faire la requête.

Fais ta requête qui va bien en fonction de $_GET['term'] (variable envoyée par l'autocomplète de jquery) dans une page php externe et ensuite, toujours dans cette même page php tu récupère ton tableau de résultat (ex :$tab_result) que tu retourne avec un
echo json_encode($tab_result);
pour alimenter le résultat l'autocomplète.

C'est un peu différent que ton exemple de base mais beaucoup plus souple et évolutif, et au moins tu auras compris le principe de l'ajax que tu pourras réutiliser. Cela dit la plupart du temps on renvoie du code html en retour de la page php. Mais ici, l'autocomplète de jquery demande un tableau js en retour c'est pour cela qu'on utilise json_encode (avec un encodage utf-8) sur le tableau de résultats.

Plus de détails sur le principe dans ce topic