Autocomplétion PHP Javasript et Mysql
Achille32
Messages postés
39
Statut
Membre
-
ElementW Messages postés 5690 Statut Contributeur -
ElementW Messages postés 5690 Statut Contributeur -
Bonjour la communauté,
J'ai un souci à résoudre et qui m'a fait faire beaucoup de recherches sur les forums et je suis tombé sur plusieurs
proposition, mais je n'arrive toujours pas à adapter ces solutions à mon contexte:
En fait je voudrais faire une reccherche avec autocomplétion dans les enregistrements de ma base de données:
J'ai une table PRODUITS avec deux champs ( id_produit et nom_produit).
Le code que j'ai pu écrire est le suivant:
Jusqu'ici je n'ai aucun résultat lorsque je tape une lettre dans le textbox.
Si quelqu'un peut me sortir de là j'en serais très reconnaissant.
Cordialement
J'ai un souci à résoudre et qui m'a fait faire beaucoup de recherches sur les forums et je suis tombé sur plusieurs
proposition, mais je n'arrive toujours pas à adapter ces solutions à mon contexte:
En fait je voudrais faire une reccherche avec autocomplétion dans les enregistrements de ma base de données:
J'ai une table PRODUITS avec deux champs ( id_produit et nom_produit).
Le code que j'ai pu écrire est le suivant:
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Demo</title>
<script type="text/javascript" src="jquery.min.js"></script>
<script type="text/javascript" src="jquery.autocomplete.min.js"></script>
<script type="text/javascript" src="css.css"></script>
<script>
$(document).ready(function() {
$('#langages').autocomplete({
serviceUrl:'index.php',
dataType: 'json'
});
});
</script>
</head>
<body>
<?php
if(isset($_GET['query'])) {
// Mot tapé par l'utilisateur
$q = htmlentities($_GET['query']);
// Connexion à la base de données
try {
$bdd = new PDO('mysql:host=localhost;dbname=ma_base', 'root', '');
} catch(Exception $e) {
exit('Impossible de se connecter à la base de données.');
}
// Requête SQL
$requete = "SELECT * FROM produits WHERE nom_produit LIKE '".$q."%' LIMIT 0, 10" ;
// Exécution de la requête SQL
$resultat = $bdd->query($requete) or die(print_r($bdd->errorInfo()));
// On parcourt les résultats de la requête SQL
while($donnees = $resultat->fetch(PDO::FETCH_ASSOC)) {
// On ajoute les données dans un tableau
$suggestions['suggestions'][] = $donnees['nom_produit'];
}
// On renvoie le données au format JSON pour le plugin
echo json_encode($suggestions);
}
?>
</body>
</html>
Jusqu'ici je n'ai aucun résultat lorsque je tape une lettre dans le textbox.
Si quelqu'un peut me sortir de là j'en serais très reconnaissant.
Cordialement
| EDIT : Ajout des balises de code (la coloration syntaxique).
Explications disponibles ici :ICI Merci d'y penser dans tes prochains messages. |
A voir également:
- Autocompletion php
- Easy php - Télécharger - Divers Web & Internet
- Expert php pinterest - Télécharger - Langages
- Retour à la ligne php ✓ - Forum PHP
- Alert php - Forum PHP
- Retour a la ligne php ✓ - Forum PHP
2 réponses
'lut,
si la page "index.php" est celle que tu nous montres, c'est car ton code PHP, lorsqu'il est appelé par l'auto-complétion, va certes renvoyer ta liste en format JSON... emballé dans le reste du code HTML de ta page, vu que tu ne le "supprimes" pas (ou plutôt, vu que tu l'envoies inconditionnellement); ce qui a pour conséquence de faire échouer l'interprétation des résultats.
La solution simple, et de toute façon la seule qui fait sens, c'est de déplacer le code PHP renvoyant la liste en dehors de ton index.php, et de le mettre dans un fichier adéquatement nommé (en mettant le dit nom dans ton script d'autocomplete).
Au passage, PDO c'est cool et ça empêche de se faire détruire sa base SQL via des injections... si on s'en sert bien.
Ici tu insères
Utilise plutôt les requêtes preparées comme ceci:
Aussi,
from human import idiocy
del idiocy
si la page "index.php" est celle que tu nous montres, c'est car ton code PHP, lorsqu'il est appelé par l'auto-complétion, va certes renvoyer ta liste en format JSON... emballé dans le reste du code HTML de ta page, vu que tu ne le "supprimes" pas (ou plutôt, vu que tu l'envoies inconditionnellement); ce qui a pour conséquence de faire échouer l'interprétation des résultats.
La solution simple, et de toute façon la seule qui fait sens, c'est de déplacer le code PHP renvoyant la liste en dehors de ton index.php, et de le mettre dans un fichier adéquatement nommé (en mettant le dit nom dans ton script d'autocomplete).
Au passage, PDO c'est cool et ça empêche de se faire détruire sa base SQL via des injections... si on s'en sert bien.
$requete = "SELECT * FROM produits WHERE nom_produit LIKE '".$q."%' LIMIT 0, 10" ;
Ici tu insères
$qdirectement dans ta requête, or un
htmlentitiesn'est pas suffisant pour protéger des injections ou attaques DoS.
Utilise plutôt les requêtes preparées comme ceci:
$requete = $bdd->prepare("SELECT * FROM produits WHERE nom_produit LIKE :nomprod% LIMIT 0, 10");
$resultat = $requete->execute(array(':nomprod' => $_GET['query']));Pas besoin de fonctions de transformation, PDO gère l'insertion de ton paramètre tout seul.
Aussi,
or dieest une mauvaise méthode de gestion d'erreur. Utilise les exceptions à la place.
from human import idiocy
del idiocy
salut gravgun , ceci est bien ma page index et je vien de déplacer mon code php dans un autre fichier nommé page.php. puis j'ai remplacé dans javasript comme ceci:
<script>
$(document).ready(function() {
$('#langages').autocomplete({
serviceUrl:'page.php',
dataType: 'json'
});
});
</script>
En complément, voici un exemple COMPLET d'ajax
https://forums.commentcamarche.net/forum/affich-33258760-remplir-un-formulaire-dynamiquement-en-fonction-d-une-combobox#2