Optimisation de reqête mysqli en PDO
Résolu
Alcantara75
Messages postés
16
Date d'inscription
Statut
Membre
Dernière intervention
-
Jules_2569 Messages postés 52 Date d'inscription Statut Membre Dernière intervention -
Jules_2569 Messages postés 52 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
J'aurais besoin d'aide pour optimiser une requête Mysqli en PDO qui fait une recherche de "nom"
dans une table, et ça me récupère son id que je met dans un champs caché pour pouvoir l'utiliser une fois récupérer. En l'état actuel ça fonctionne, mais ça me fait deux fichiers de connexion.
ci-dessous mon code :
le fichier de connexion utilisé actuellement
La page de connexion que je voudrais utiliser
le fichier javascript
Le fichiers Clients.php
J'aurais besoin d'aide pour optimiser une requête Mysqli en PDO qui fait une recherche de "nom"
dans une table, et ça me récupère son id que je met dans un champs caché pour pouvoir l'utiliser une fois récupérer. En l'état actuel ça fonctionne, mais ça me fait deux fichiers de connexion.
ci-dessous mon code :
le fichier de connexion utilisé actuellement
<?php // paramètres de connexion $hostname_dbprotect = "localhost"; $database_dbprotect = "resto"; // $username_dbprotect = "melanquiere"; $password_dbprotect = ""; $dbprotect = mysql_pconnect($hostname_dbprotect, $username_dbprotect, $password_dbprotect) or trigger_error(mysql_error(),E_USER_ERROR); ?>
La page de connexion que je voudrais utiliser
<?php session_start(); //On commence par activer l'affichage des erreurs PHP error_reporting(E_ALL); ini_set('display_errors', TRUE); ini_set('display_startup_errors', TRUE); /* DATABASE CONFIGURATION */ define('DB_SERVER', 'localhost'); define('DB_USERNAME', 'melanquiere'); define('DB_PASSWORD', ''); define('DB_DATABASE', 'resto'); function getDB() { try { $bdd = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_DATABASE.";charset=utf8'", DB_USERNAME, DB_PASSWORD); $bdd->exec("set names utf8"); $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ); return $bdd; } catch (PDOException $e) { echo 'Connection failed: ' . $e->getMessage(); exit; } } ?>
le fichier javascript
<script > $( function() { $( "#autocomplete" ).autocomplete({ source: function( request, response ) { $.ajax({ url: "fetch/Clients.php", type: 'post', dataType: "json", data: { search: request.term }, success: function( data ) { response( data ); } }); }, select: function (event, ui) { $('#autocomplete').val(ui.item.label); // display the selected text $('#selectuser_id').val(ui.item.value); // save selected id to input return false; } }); }); function split( val ) { return val.split( /,\s*/ ); } function extractLast( term ) { return split( term ).pop(); } </script>
Le fichiers Clients.php
include "../../inc/conn.php"; if(isset($_POST['search'])){ $search = $_POST['search']; $query = "SELECT * FROM clients WHERE prenom like'%".$search."%'"; $result = mysqli_query($mysqli,$query); while($row = mysqli_fetch_array($result) ){ $response[] = array("value"=>$row['id_clients'],"label"=>$row['prenom']); } echo json_encode($response); } exit;
A voir également:
- Optimisation de reqête mysqli en PDO
- Optimisation pc - Accueil - Utilitaires
- Optimisation découpe panneau gratuit - Télécharger - Outils professionnels
- Optimisation de livraison - Forum Windows 10
- Démarrage d'android en cours optimisation de l'application ✓ - Forum Téléphones & tablettes Android
- Optimisation windows 10 - Guide
7 réponses
Il faut s'inspirer du code de tes autres pages.... pas les copier/coller bêtement...
La requête de ton fichier initiale n'est pas celle que tu as cherché à utilisé.
De plus, le fichier doit certainement être utilisé dans un ajax puisque tu faisais un json_encode du résultat...
Là.. tu as remis du html dedans...
Toi.. tu dois juste remplacer le code
par :
La requête de ton fichier initiale n'est pas celle que tu as cherché à utilisé.
De plus, le fichier doit certainement être utilisé dans un ajax puisque tu faisais un json_encode du résultat...
Là.. tu as remis du html dedans...
Toi.. tu dois juste remplacer le code
if(isset($_POST['search'])){ $search = $_POST['search']; $query = "SELECT * FROM clients WHERE prenom like'%".$search."%'"; $result = mysqli_query($mysqli,$query); while($row = mysqli_fetch_array($result) ){ $response[] = array("value"=>$row['id_clients'],"label"=>$row['prenom']); } echo json_encode($response); }
par :
//on inclus le fichier de connexion à la bdd dont le nom est ???? require_once "../inc/connexion.php"; //connexion à la bdd $bdd = getDB(); if(isset($_POST['search'])){ $search = $_POST['search' $query = "SELECT * FROM clients WHERE prenom like'%".$search."%'"; try{ $requete = $bdd -> prepare($sql) ; $requete->execute() ; $response= $requete->fetchAll(); // on stocke le resultat dans un array }catch(Exception $e){ // en cas d'erreur : $response = " Erreur ! ".$e->getMessage(); } echo json_encode($response); exit; }
Bonjour
Et quel est le souci exactement ?
Il suffit de faire comme tes autres pages..
https://forums.commentcamarche.net/forum/affich-36358957-php-mysql-probleme-pour-avoir-un-affichage-avec-un-tri-decroissant-dans-un-tab
.
Et quel est le souci exactement ?
Il suffit de faire comme tes autres pages..
https://forums.commentcamarche.net/forum/affich-36358957-php-mysql-probleme-pour-avoir-un-affichage-avec-un-tri-decroissant-dans-un-tab
.
Le souci c'est que pour cette fonctionnalités, j'ai besoin de l'autocomplétion. J'ai une fenêtre modal avec un seul champ input correspondant au nom, dans ce champ input je tape les premières lettres et il me sort les noms correspondant aux premières lettres. En cliquant sur le nom ça me sélectionne son id dans un champs caché.. L'autre fonction de recherche quand je tape un nom ça m'affiche tout les noms correspondant sous forme de tableau, je n'ai pas l'autocompletion pour choisir le nom que je veux.
Le problème que je rencontre, c'est que pour cette fonctionnalités, j'ai adapté le code de l'autre jour, je l'ai modifié comme je n'ai pas besoin d'afficher un tableau. j'ai juste besoin d'une valeur qui s'affiche dans un input (la fonction qui recherche et m'affiche le résultat fonctionne). en retirant l'affichage du tableau (le SELECT *) je me retrouve avec cette erreur :
La page clients PHP
NULL Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1065 Query was empty Donées non trouvées
La page clients PHP
<?php //on inclus le fichier de connexion à la bdd dont le nom est ???? require_once "../inc/connexion.php"; //connexion à la bdd $bdd = getDB(); // on récupère PROPREMENT les variables AVANT de les utiliser $query = !empty($_POST["query"]) ? $_POST["query"]: NULL; var_dump($query); //on prépare la requête SQL $sql = " "; //début du traitement : if($query){ $search = $query; // var_dump($search); //si il y a une recherche on ajoute le WHERE à la requete : $sql .= " SELECT * FROM clients LEFT JOIN utilisateurs ON (clients.user_id=utilisateurs.id_user) WHERE ".$_SESSION['id_user']." =user_id AND ( lastname LIKE '%".$search."%' OR id_clients LIKE '%".$search."%' ) ORDER BY id_clients DESC "; // var_dump($sql); } try{ $requete = $bdd -> prepare($sql) ; $requete->execute() ; $result = $requete->fetchAll(); // on stocke le resultat dans un array }catch(Exception $e){ // en cas d'erreur : echo " Erreur ! ".$e->getMessage(); } ?> <html> <head> <meta charset="utf-8"> </head> <body> <?php $output = ''; if(!empty($result)) { $output .= '</br> <div class="box-body table-responsive no-padding" id="tableData"> <table class="table table-striped "> <thead> <tr> <th>ID</th> </tr> </thead> <tbody>'; foreach($result as $row){ $output .= ' <tr> <td width="5%"> <input type="text" class="control-form" name="id_clients" value="'.$row["id_clients"].'" ></td> <td width="5%"> <input type="text" class="control-form" name="id_clients" value="'.$row["lastname"].'" ></td> </tr> '; } echo '</tbody> </table></div>'; } else { echo 'Données non trouvées'; } echo $output; ?> </body> </html>
Je sais pas ce que je fais car je n'ai aucune erreur qui s'affiche.
j'ai juste une fenêtre modal, quand ça ne fonctionne, il n'y a aucune erreur.
Voici l'Ajax
La fenêtre modal
j'ai juste une fenêtre modal, quand ça ne fonctionne, il n'y a aucune erreur.
Voici l'Ajax
<script > $( function() { $( "#autocomplete" ).autocomplete({ source: function( request, response ) { $.ajax({ url: "fetch/Clients.php", type: 'post', dataType: "json", data: { search: request.term }, success: function( data ) { response( data ); } }); }, select: function (event, ui) { $('#autocomplete').val(ui.item.label); // display the selected text $('#selectuser_id').val(ui.item.value); // save selected id to input return false; } }); }); function split( val ) { return val.split( /,\s*/ ); } function extractLast( term ) { return split( term ).pop(); } </script>
La fenêtre modal
<div class="modal fade" id="updateClients" > <form action="../process/updateClients.php" method="GET"> <div class="modal-dialog" role="document" > <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span> </button> <h4 ></h4> </div> <div class="modal-body"> <div class="form-group"> <label>Nom:</label> <input type="text" class="form-control" id='autocomplete' name="prenom" value=""> <input type="hidden" class="form-control" id="selectuser_id" name="id_clients" value=""> </div> </div> <div class="modal-footer"> <div align="left"> <button type="submit" class="btn btn-space btn-primary">Valider</button> </form> </div>
Bonjour,
Là... tu fais de l'ajax.
C'est à dire que tu fais appel à des scripts php depuis du JAVASCRIPT.
Il te faut donc regarder dans la console de ton navigateur les éventuels messages qui pourraient s'afficher au niveau du javascript.
NB: Pour débuguer de l'ajax, je te recommande vivement d'utiliser le navigateur FireFox ( bien plus facile à utiliser pour ça )
NB² : Dans ton code ajax, pour l'instant tu n'as pas géré les éventuelles erreurs.
Modifie donc comme ceci :
edit: alert et non almert (erreur de copier/coller )
Là... tu fais de l'ajax.
C'est à dire que tu fais appel à des scripts php depuis du JAVASCRIPT.
Il te faut donc regarder dans la console de ton navigateur les éventuels messages qui pourraient s'afficher au niveau du javascript.
NB: Pour débuguer de l'ajax, je te recommande vivement d'utiliser le navigateur FireFox ( bien plus facile à utiliser pour ça )
NB² : Dans ton code ajax, pour l'instant tu n'as pas géré les éventuelles erreurs.
Modifie donc comme ceci :
$.ajax({ url: "fetch/Clients.php", type: 'post', dataType: "json", data: { search: request.term }, success: function( data ) { console.log("Resultat Ajax",data); response( data ); }, error:function(xhr){ console.log("Erreur AJAX",xhr); alert("Erreur AJax, regarder la console pour plus de détails !"); } });
edit: alert et non almert (erreur de copier/coller )
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Bonjour,
Quand je regarde dans la console, dans la partie "POST" j'ai les premières lettres que je tape au niveau du champs de recherche.
Dans la partie "Réponse" j'ai le tableau ci-dessous, c'est toutes les informations concernant le client quand je tape les premières lettres de son nom. J'ai pas mis le tableau en entier.
Il y a des fichiers jQuery qui vont avec aussi.
Actuellement la config est comme ci-dessous:
Le modal
clients.php
autocomplete.php
sur cette ligne:
On ne peut pas stocker juste les valeurs que j'ai besoin, on dirait qu'il récupère tout, il n'y a pas de filtre
Quand je regarde dans la console, dans la partie "POST" j'ai les premières lettres que je tape au niveau du champs de recherche.
Dans la partie "Réponse" j'ai le tableau ci-dessous, c'est toutes les informations concernant le client quand je tape les premières lettres de son nom. J'ai pas mis le tableau en entier.
Il y a des fichiers jQuery qui vont avec aussi.
[{"id_clients":"266","0":"266","showin":"","1":"","firstname":"******","2":"V*******","lastname":"Pi***","3":"Picha","address":"Adresse","4":"Adresse","zipcode":"00000","5":"00000","city":"VILLE","6":"VILLE"}]
Actuellement la config est comme ci-dessous:
Le modal
<div class="modal-dialog" role="document" > <div class="modal-content"> <div class="modal-header"> <button type="button" class="close" data-dismiss="modal"><span aria-hidden="true">×</span> </button> <h4 class="modal-title" id="myModalLabel">Nom </h4> </div> <div class="modal-body"> <div class="form-group"> <label>Nom:</label> <input type="text" class="form-control" id='autocomplete' name="nom" value=""><br> <input type="hidden" class="form-control" id="selectuser_id" name="id_clients" value=""> </div> </div> <div class="modal-footer"> <div align="left"> <button type="submit" class="btn btn-space btn-primary">Valider</button> </form> </div> </div> </div> </div>
clients.php
require "../../inc/connexion.php"; //connexion à la bdd $bdd = getDB(); if(isset($_POST['search'])){ $search = $_POST['search']; $query = "SELECT * FROM clients WHERE nom like '%".$search."%' " ; try{ $requete = $bdd -> prepare($query) ; $requete->execute() ; //var_dump($requete); $response= $requete->fetchAll(); // on stocke le resultat dans un array }catch(Exception $e){ // en cas d'erreur : $response = " Erreur ! ".$e->getMessage(); } echo json_encode($response); // var_dump($response); exit; }
autocomplete.php
<script > $( function() { $( "#autocomplete" ).autocomplete({ source: function( request, response ) { $.ajax({ url: "fetch/Clients.php", type: 'post', dataType: "json", data: { search: request.term }, success: function( data ) { response( data ); }, error:function(xhr){ console.log("Erreur AJAX",xhr); alert("Erreur AJax, regarder la console pour plus de détails !"); } }); }, select: function (event, ui) { $('#autocomplete').val(ui.item.label); // display the selected text $('#selectuser_id').val(ui.item.value); // save selected id to input return false; } }); }); function split( val ) { return val.split( /,\s*/ ); } function extractLast( term ) { return split( term ).pop(); } </script>
sur cette ligne:
$response= $requete->fetchAll(); // on stocke le resultat dans un array
On ne peut pas stocker juste les valeurs que j'ai besoin, on dirait qu'il récupère tout, il n'y a pas de filtre
J'ai trouver la solution, j'ai ajouter cette ligne, ça fonctionne correctement.
Merci en tout cas.
en dessous de celle-ci :
Merci en tout cas.
foreach($response as $row){ $response[] = array("value"=>$row['id_clients'],"label"=>$row['nom']); }
en dessous de celle-ci :
$response= $requete->fetchAll(); // on stocke le resultat dans un array
Y'a plus simple je pense..
Dans ta requête..
Remplce
par
et avec ça.. plus besoin de faire une boucle en php pour reconstruire le format de sorti attendu.
Dans ta requête..
Remplce
$query = "SELECT * FROM clients WHERE prenom like'%".$search."%'";
par
$query = "SELECT id_clients as value, nom as label FROM clients WHERE prenom like'%".$search."%'";
et avec ça.. plus besoin de faire une boucle en php pour reconstruire le format de sorti attendu.
et n'oublie pas de mettre le sujet en résolu :
https://www.commentcamarche.net/infos/25917-marquer-un-fil-de-discussion-comme-etant-resolu/
https://www.commentcamarche.net/infos/25917-marquer-un-fil-de-discussion-comme-etant-resolu/