Autocomplétion PHP Javasript et Mysql

Fermé
Achille32 Messages postés 37 Date d'inscription mardi 21 avril 2015 Statut Membre Dernière intervention 21 mai 2016 - Modifié par jordane45 le 21/05/2016 à 17:09
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 - 21 mai 2016 à 20:15
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:

<!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:

2 réponses

ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
Modifié par gravgun le 21/05/2016 à 16:50
'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.
$requete = "SELECT * FROM produits WHERE nom_produit LIKE '".$q."%' LIMIT 0, 10" ; 

Ici tu insères
$q
directement dans ta requête, or un
htmlentities
n'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 die
est une mauvaise méthode de gestion d'erreur. Utilise les exceptions à la place.
from human import idiocy
del idiocy
0
jordane45 Messages postés 38138 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 17 avril 2024 4 649
21 mai 2016 à 17:10
0
Achille32 Messages postés 37 Date d'inscription mardi 21 avril 2015 Statut Membre Dernière intervention 21 mai 2016
21 mai 2016 à 19:36
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>
0
Achille32 Messages postés 37 Date d'inscription mardi 21 avril 2015 Statut Membre Dernière intervention 21 mai 2016
21 mai 2016 à 19:37
J'ai toujours pas de résultat
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225
21 mai 2016 à 19:37
Le plus important: est-ce que ça marche?
0
Achille32 Messages postés 37 Date d'inscription mardi 21 avril 2015 Statut Membre Dernière intervention 21 mai 2016
21 mai 2016 à 20:09
Bah... si vous pouvez etre un peu plus explicite dans vos explications..
0
ElementW Messages postés 4816 Date d'inscription dimanche 12 juin 2011 Statut Contributeur Dernière intervention 5 octobre 2021 1 225 > Achille32 Messages postés 37 Date d'inscription mardi 21 avril 2015 Statut Membre Dernière intervention 21 mai 2016
Modifié par gravgun le 21/05/2016 à 20:15
Pourtant je prend soin de rendre mes messages explicites... Que dit l'onglet "réseau" des outils développeur (accessibles via Ctrl+Shift+I sur Firefox/Chrome) quand on rentre du texte dans le champ ?
0