Optimisation de reqête mysqli en PDO [Résolu]

Signaler
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019
-
Jules_2569
Messages postés
21
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
3 janvier 2020
-
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;

7 réponses

Messages postés
27329
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 janvier 2020
2 031
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;
}


Messages postés
27329
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 janvier 2020
2 031
Bonjour
Et quel est le souci exactement ?

Il suffit de faire comme tes autres pages..
https://www.commentcamarche.net/forum/affich-36358957-php-mysql-probleme-pour-avoir-un-affichage-avec-un-tri-decroissant-dans-un-tab

.
Alcantara75
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

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.
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

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>
Messages postés
21
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
3 janvier 2020

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>


jordane45
Messages postés
27329
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 janvier 2020
2 031
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 )
Messages postés
21
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
3 janvier 2020

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
jordane45
Messages postés
27329
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 janvier 2020
2 031
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 ?
Messages postés
21
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
3 janvier 2020

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
jordane45
Messages postés
27329
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 janvier 2020
2 031
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.
jordane45
Messages postés
27329
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 janvier 2020
2 031 > jordane45
Messages postés
27329
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 janvier 2020

Messages postés
21
Date d'inscription
vendredi 13 décembre 2019
Statut
Membre
Dernière intervention
3 janvier 2020

J'ai essayé, c'est bon.
Merci