Optimisation de reqête mysqli en PDO

Résolu/Fermé
Alcantara75 Messages postés 16 Date d'inscription mercredi 11 décembre 2019 Statut Membre Dernière intervention 17 décembre 2019 - 17 déc. 2019 à 12:58
Jules_2569 Messages postés 52 Date d'inscription vendredi 13 décembre 2019 Statut Membre Dernière intervention 28 juillet 2020 - 27 déc. 2019 à 15:28
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


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

7 réponses

jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
17 déc. 2019 à 17:28
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
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;
}


1
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
17 déc. 2019 à 13:22
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

.
0
Alcantara75 Messages postés 16 Date d'inscription mercredi 11 décembre 2019 Statut Membre Dernière intervention 17 décembre 2019
17 déc. 2019 à 15:51
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.
0
Alcantara75 Messages postés 16 Date d'inscription mercredi 11 décembre 2019 Statut Membre Dernière intervention 17 décembre 2019
Modifié le 17 déc. 2019 à 15:05
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 :



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>
0
Jules_2569 Messages postés 52 Date d'inscription vendredi 13 décembre 2019 Statut Membre Dernière intervention 28 juillet 2020
Modifié le 17 déc. 2019 à 20:05
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

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


0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 20 déc. 2019 à 13:56
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 :
$.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 )
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Jules_2569 Messages postés 52 Date d'inscription vendredi 13 décembre 2019 Statut Membre Dernière intervention 28 juillet 2020
Modifié le 26 déc. 2019 à 15:15
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.


   
[{"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
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
26 déc. 2019 à 21:08
il te retourne ce que tu ta requête donnes ...
As tu testé la même requête en base de données directement pour voir ce que ça te donnait comme résultat ?
0
Jules_2569 Messages postés 52 Date d'inscription vendredi 13 décembre 2019 Statut Membre Dernière intervention 28 juillet 2020
27 déc. 2019 à 14:05
J'ai trouver la solution, j'ai ajouter cette ligne, ça fonctionne correctement.
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
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
27 déc. 2019 à 14:29
Y'a plus simple je pense..
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.
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650 > jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024
27 déc. 2019 à 14:30
0
Jules_2569 Messages postés 52 Date d'inscription vendredi 13 décembre 2019 Statut Membre Dernière intervention 28 juillet 2020
27 déc. 2019 à 15:28
J'ai essayé, c'est bon.
Merci
0