Bonjour,
Je cherche actuellement à m’entraîner sur un système de barre de recherche avec auto-complétion mais je bloque au moment d'adapter mon php d'entrainement à mon php sur mon site final. Car effectivement mon site fonctionne quand j'utilise un tableau linéarisé mais cela est peu pratique, donc j'aimerais le même fonctionnement mais en etant directement connecté à ma base de données mais problème ca ne fonctionne pas et je ne vois pas pourquoi... Je pense que cela viens de ma variable $tableau_empiretau mais j'ai beau retourné le problème je ne comprend pas et n'arrive pas à avancé... J'espère que quelqu'un pourra me venir en aide je met tout ici avec le plus d'info possible pour simplifier la compréhension.
et mon code d'entrainement qui fonctionne avec des villes mais avec un tableau linéarisé:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27<?php $pdo= new PDO('mysql:host=localhost;dbname=******', '*****', '*****'); function list_empiretau($pdo_fonction){ $requete = $pdo_fonction->prepare('SELECT nom, cout, prix, dispo, url, s FROM empire_tau'); $requete -> execute(); $tableau_empiretau = $requete -> fetchAll(); return $tableau_empiretau; $dataLen = count($tableau_empiretau); sort($tableau_empiretau); $results = array(); for ($i = 0 ; $i < $dataLen && count($results) < 10 ; $i++) { if(stripos($tableau_empiretau[$i], $_GET["s"]) === 0) { array_push($results, $tableau_empiretau[$i]); } } echo implode('|', $results); } ?>
Et ici la fonction js:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21<?php $data = unserialize(file_get_contents('towns.txt')); // Récupération de la liste complète des villes $dataLen = count($data); sort($data); // On trie les villes dans l'ordre alphabétique $results = array(); // Le tableau où seront stockés les résultats de la recherche for ($i = 0 ; $i < $dataLen && count($results) < 5 ; $i++) { if(stripos($data[$i], $_GET["s"]) === 0) { // Si la valeur commence par les mêmes caractères que la recherche array_push($results, $data[$i]); // On ajoute alors le résultat à la liste à retourner } } echo implode('|', $results); // Et on affiche les résultats séparés par une barre verticale | ?>
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117 (function() { var searchElement = document.getElementById('search'), results = document.getElementById('results'), selectedResult = -1, // Permet de savoir quel résultat est sélectionné : -1 signifie "aucune sélection" previousRequest, // On stocke notre précédente requête dans cette variable previousValue = searchElement.value; // On fait de même avec la précédente valeur function getResults(keywords) { // Effectue une requête et récupère les résultats var xhr = new XMLHttpRequest(); xhr.open('GET', './search.php?s='+ encodeURIComponent(keywords)); xhr.addEventListener('readystatechange', function() { if (xhr.readyState == XMLHttpRequest.DONE && xhr.status == 200) { displayResults(xhr.responseText); } }); xhr.send(null); return xhr; } function displayResults(response) { // Affiche les résultats d'une requête results.style.display = response.length ? 'block' : 'none'; // On cache le conteneur si on n'a pas de résultats if (response.length) { // On ne modifie les résultats que si on en a obtenu response = response.split('|'); var responseLen = response.length; results.innerHTML = ''; // On vide les résultats for (var i = 0, div ; i < responseLen ; i++) { div = results.appendChild(document.createElement('div')); div.innerHTML = response[i]; div.addEventListener('click', function(e) { chooseResult(e.target); }); } } } function chooseResult(result) { // Choisi un des résultats d'une requête et gère tout ce qui y est attaché searchElement.value = previousValue = result.innerHTML; // On change le contenu du champ de recherche et on enregistre en tant que précédente valeur results.style.display = 'none'; // On cache les résultats result.className = ''; // On supprime l'effet de focus selectedResult = -1; // On remet la sélection à "zéro" searchElement.focus(); // Si le résultat a été choisi par le biais d'un clique alors le focus est perdu, donc on le réattribue } searchElement.addEventListener('keyup', function(e) { var divs = results.getElementsByTagName('div'); if (e.keyCode == 38 && selectedResult > -1) { // Si la touche pressée est la flèche "haut" divs[selectedResult--].className = ''; if (selectedResult > -1) { // Cette condition évite une modification de childNodes[-1], qui n'existe pas, bien entendu divs[selectedResult].className = 'result_focus'; } } else if (e.keyCode == 40 && selectedResult < divs.length - 1) { // Si la touche pressée est la flèche "bas" results.style.display = 'block'; // On affiche les résultats if (selectedResult > -1) { // Cette condition évite une modification de childNodes[-1], qui n'existe pas, bien entendu divs[selectedResult].className = ''; } divs[++selectedResult].className = 'result_focus'; } else if (e.keyCode == 13 && selectedResult > -1) { // Si la touche pressée est "Entrée" chooseResult(divs[selectedResult]); } else if (searchElement.value != previousValue) { // Si le contenu du champ de recherche a changé previousValue = searchElement.value; if (previousRequest && previousRequest.readyState < XMLHttpRequest.DONE) { previousRequest.abort(); // Si on a toujours une requête en cours, on l'arrête } previousRequest = getResults(previousValue); // On stocke la nouvelle requête selectedResult = -1; // On remet la sélection à "zéro" à chaque caractère écrit } }); })();







Répondre avec citation


Partager