Autocomplétion PHP Javasript et Mysql

Achille32 Messages postés 39 Statut Membre -  
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:

<!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 5690 Statut Contributeur 1 224
 
'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 40050 Date d'inscription   Statut Modérateur Dernière intervention   4 758
 
0
Achille32 Messages postés 39 Statut Membre
 
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 39 Statut Membre
 
J'ai toujours pas de résultat
0
ElementW Messages postés 5690 Statut Contributeur 1 224
 
Le plus important: est-ce que ça marche?
0
Achille32 Messages postés 39 Statut Membre
 
Bah... si vous pouvez etre un peu plus explicite dans vos explications..
0
ElementW Messages postés 5690 Statut Contributeur 1 224 > Achille32 Messages postés 39 Statut Membre
 
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