Ajax - Mysql - PHP
RésoluAstolpho Messages postés 73 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je n'arrive pas à faire fonctionner l'autocomplétion depuis que j'ai déplacer la requête qui était dans /fetch/items.php:
if (isset($_POST['search'])) { $search = $_POST['search']; $query = "SELECT item as label, id_items, price, item, designation as value FROM items LEFT JOIN customers ON (items.id=customers.id) LEFT JOIN users ON (items.id = users.id) WHERE item like'%" . $search . "%' AND users.id = :user_id GROUP by item "; try { $requete = $bdd->prepare($query); $requete->bindParam(':user_id', $_SESSION['user_id'], PDO::PARAM_INT); $requete->execute(); //var_dump($requete); $response = $requete->fetchAll(); // on stocke le resultat dans un array /* foreach($response as $row){ $response[] = array("value"=>$row['id_customers'],"label"=>$row['lastname']); } */ } catch (Exception $e) { // en cas d'erreur : $response = " Erreur ! " . $e->getMessage(); } echo json_encode($response); // var_dump($response); exit; }
dans la classe :
class AutoCompleteHandler { private $db; public function __construct() { $this->db = $this->getDB(); } private function getDB() { // Utilisez la fonction getDB existante pour obtenir l'instance PDO return getDB(); } public function handleAutoComplete() { if (isset($_POST['search'])) { $search = $_POST['search']; $query = "SELECT item as label, id_items, price, item, designation as value FROM items LEFT JOIN customers ON (items.id = customers.id) LEFT JOIN users ON (items.id = users.id) WHERE item LIKE '%" . $search . "%' AND users.id = :user_id GROUP BY item"; try { $requete = $this->db->prepare($query); $requete->bindParam(':user_id', $_SESSION['user_id'], PDO::PARAM_INT); $requete->execute(); $response = $requete->fetchAll(); } catch (Exception $e) { $response = "Erreur ! " . $e->getMessage(); } echo json_encode($response); exit; } } public function generateAutoCompleteItemScript() { $this->handleAutoComplete(); ob_start(); ?> <script> $(function() { $("#autocomplete_item").autocomplete({ source: function(request, response) { $.ajax({ url: "", type: 'post', dataType: "json", data: { search: request.term }, success: function(data) { response(data); } }); }, select: function(event, ui) { $('#autocomplete_item').val(ui.item.label); $('#id_items').val(ui.item.id_items); $('#item').val(ui.item.item); $('#designation').val(ui.item.value); $('#price').val(ui.item.price); return false; } }); }); </script> <?php return ob_get_clean(); }
sur cette ligne :
url: "",
quand je met le chemin qui pointe vers le fichier ou il y à la requête ça fonctionne :
url: "../fetch/items.php",
l'appel de la méthode :
<?php // Exemple d'utilisation $autoCompleteHandler = new AutoCompleteHandler(); $autoCompleteScript = $autoCompleteHandler->generateAutoCompleteItemScript(); var_dump($autoCompleteScript ); ?> <!-- jQuery UI --> <script src='../fetch/jquery-ui/jquery-3.1.1.min.js' type='text/javascript'></script> <link href='../fetch/jquery-ui/jquery-ui.min.css' rel='stylesheet' type='text/css'> <script src='../fetch/jquery-ui/jquery-ui.min.js' type='text/javascript'></script> <?php echo $autoCompleteScript; ?>
je n'ai pas de message d'erreur, ni rien dans la console.
- Mysql error in file: /engine/classes/mysql.php at line 52
- Cheat engine - Télécharger - Outils Internet
- .Bin file - Guide
- Host file - Guide
- .Dat file - Guide
- Playback error reconnect in 3s (1/5) francais - Forum Box et Streaming vidéo
2 réponses
Bonjour,
Lorsque tu appeles la page ( l'url = "" ) .. ton code ne retourne pas seulement le résultat du echo json_encode... l'entièreté de ta page.
(il suffit d'ouvrir la console de ton navigateur (de préférence FIREFOX dès qu'on fait de l'ajax...), de bien cocher la case de debug XHR et de regarder ce qui s'affiche... )
Pour contourner ton souci, je pense qu'en modifiant le constructeur de ta class ainsi ça devrait marcher
public function __construct() { $this->db = $this->getDB(); if(!empty($_POST['search'])){ $this->handleAutoComplete(); } }
Par contre, à titre perso, je préfère largement laisser mes appels ajax (les fichiers appelés via la variable URL ) séparés du reste du code et je fais UN fichier spécifique par ajax... mais chacun ses gouts.