PHP Mysli et PDO : problème pour convertir une requê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
-
Messages postés
12721
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
-
Bonjour a tous,

Je souhaiterais de l'aide pour optimiser une requête que mon patron m'a demandé de faire sur une application qui gère notre clientèles. C’est une page qui gère la recherche de clients et les affiches dans un tableau.

le problème est que je n'y connais pas grand chose, je sais même pas par ou commencer. ça a pas l'air très complexe, c'est quand même du chinois. Si une bonne âme pouvez m'aider a le faire ou au moins m'expliquer a quoi servent les fonctions. La seule choses que j'ai comprise c'est qu'il fallait convertir
mysqli_real_escape_string vers pdo, plus je me renseigne plus je m'y perds.

Mon code plus bas:

Le fichier de connexion:

<?php
session_start();
/* DATABASE CONFIGURATION */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'melanquiere');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'resto');


function getDB()
{
$dbhost=DB_SERVER;
$dbuser=DB_USERNAME;
$dbpass=DB_PASSWORD;
$dbname=DB_DATABASE;
try {
$bdd = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$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();
}
}
?>


Ci dessous le code de la page :


<?php
$connect = mysqli_connect("localhost", "melanquiere", "", "resto");
$output = '';
if(isset($_POST["query"]))
{
$search = mysqli_real_escape_string($connect, $_POST["query"]);
$query = "
SELECT * FROM clients
WHERE prenom LIKE '%".$search."%'
OR nom LIKE '%".$search."%'
OR adresse LIKE '%".$search."%'
OR ville LIKE '%".$search."%'
OR cp LIKE '%".$search."%'
OR email LIKE '%".$search."%'
OR id_clients LIKE '%".$search."%'
";
}
else
{
$query = "
SELECT * FROM clients ";
}
$result = mysqli_query($connect, $query);
if(mysqli_num_rows($result) > 0)
{
$output .= '
</br>
<table >
<thead>
<tr>
<th>ID</th>
<th>Client</th>
<th>Email</th>
<th>Tel</th>
</thead>
<tbody>
</tr>
';

while($row = mysqli_fetch_array($result))
{
$output .= '
<tr>
<td width="10%"> '.$row["id_clients"].'</td>
<td width="20%">'.$row["prenom"].' '.$row["nom"].'</td>
<td width="20%">'.$row["email"].'</td>
<td width="20%">'.$row["tel"].'</td>
<td width="2%">
<a
data-toggle="modal"
data-target="#exampleModal"
data-whatever="'.$row['id_clients'].' "><i class="fa fa-plus "></i></a>
</td>

<td width="2%"><a href="../form/profilClients.php?id_clients='.$row["id_clients"].'"><i class="fa fa-pencil"></i></td>
<td width="10%"></td>
</tr>
';
}
echo ' </tbody></table>';
}
else
{
echo 'Données non trouvées';
}
echo $output;

?>
</body>
</html>

En gros nous voudrions utiliser la fonction PDO créer a cet effet
merci

6 réponses

Messages postés
29803
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
2 867
petite correction
<?php


//on inclus le fichier de connexion à la bdd dont le nom est ????
require_once "chemin/vers/ton/fichier/de/connexion/a/la/bdd.php";

//connexion à la bdd
$bdd = getDB();

// on récupère PROPREMENT les variables AVANT de les utiliser
$query = !empty($_POST["query"]) ? $_POST["query"]: NULL;

//on prépare la requête SQL
$sql = "SELECT * FROM clients ";

//début du traitement :
if($query){
  $search = $bdd->quote($query);
  
  //si il y a une recherche on ajoute le WHERE à la requete :
  $sql .= " WHERE  prenom LIKE '%".$search."%'
                  OR nom LIKE '%".$search."%'
                  OR adresse LIKE '%".$search."%'
                  OR ville LIKE '%".$search."%'
                  OR cp LIKE '%".$search."%'
                  OR email LIKE '%".$search."%'
                  OR id_clients LIKE '%".$search."%' ";
}

//Execution de la requete
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();
}

?>

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

ça fonctionne merci d'avoir été aussi rapide

j'ai juste un dernier message, quand je tape un mot sur la barre de recherche, j'ai le message ci-dessous. aperemment c'est un problème de syntaxe.

Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de '9'%' OR nom LIKE '%'9'%' OR adresse LIKE '%''
Messages postés
29803
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
2 867 >
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

Retire l'instruction $bdd->quote
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

Le message d'erreur se trouve au niveau de SELECT * FROM clients
 Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de 'SELECT * FROM clients '%' OR nom LIKE '%' SELECT * FROM clien' à la ligne 1 Données non trouvées 



ci-dessous l'affichage que j'obtiens après un var_dump($sql);

C:\wamp\www\O2G\fetch\clients.php:39:string ' SELECT * FROM clients   WHERE  prenom LIKE '%' SELECT * FROM clients  '%'
                  OR nom LIKE '%' SELECT * FROM clients  '%'
                  OR adresse LIKE '%' SELECT * FROM clients  '%'
                  OR ville LIKE '%' SELECT * FROM clients  '%'
                  OR cp LIKE '%' SELECT * FROM clients  '%'
                  OR email LIKE '%' SELECT * FROM clients  '%'
                  OR id_clients LIKE '%' SELECT * FROM clients  '%'
                   ' (length=474)

Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de 'SELECT * FROM clients '%' OR nom LIKE '%' SELECT * FROM clien' à la ligne 1 Données non trouvées 
Messages postés
29803
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
2 867 >
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

Tu as bien retiré que ce que je t'ai donné sans enlever le reste de la ligne hein ??
donc
 $search = $bdd->quote($query);

a remplacer par
 $search = $query;
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

Bonjour jordane45 oui je l'ai fait et ça fonctionne, je n'ai plus de message d'erreur.
Merci de ton efficacité et de ta patience.
Messages postés
12721
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
bonjour, merci d'utiliser les balises de code pour partager du code:
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code
Messages postés
29803
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
2 867
Le fichier de connexion: (dont on ne connait pas le nom... )
<?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;
  }
}
?>



Code à placer au TOUT début de ton fichier
<?php


//on inclus le fichier de connexion à la bdd dont le nom est ????
require_once "chemin/vers/ton/fichier/de/connexion/a/la/bdd.php";

//connexion à la bdd
$bdd = getDB();

// on récupère PROPREMENT les variables AVANT de les utiliser
$query = !empty($_POST["query"]) ? $_POST["query"]: NULL;

//on prépare la requête SQL
$sql = "SELECT * FROM clients ";

//début du traitement :
if($query){
  $search = $bdd->quote($query);
  
  //si il y a une recherche on ajoute le WHERE à la requete :
  $sql .= " WHERE  prenom LIKE '%".$search."%'
                  OR nom LIKE '%".$search."%'
                  OR adresse LIKE '%".$search."%'
                  OR ville LIKE '%".$search."%'
                  OR cp LIKE '%".$search."%'
                  OR email LIKE '%".$search."%'
                  OR id_clients LIKE '%".$search."%' ";
}

//Execution de la requete
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();
}

?>


Puis le reste de ton code html
<html>
  <head>
    <meta charset="utf-8">
    ....le reste de ton head.
  </head>
  <body>
    <?php
    $output = '';

    if(!empty($result)) {
    $output .= '</br>
                <table >
                  <thead>
                    <tr>
                      <th>ID</th>
                      <th>Client</th>
                      <th>Email</th>
                      <th>Tel</th>
                    </tr>
                  </thead>
                  <tbody>';

      foreach($result as $row){
        $output .= '
            <tr>
              <td width="10%"> '.$row["id_clients"].'</td>
              <td width="20%">'.$row["prenom"].' '.$row["nom"].'</td>
              <td width="20%">'.$row["email"].'</td>
              <td width="20%">'.$row["tel"].'</td>
              <td width="2%">
                <a data-toggle="modal" data-target="#exampleModal" data-whatever="'.$row['id_clients'].' "><i class="fa fa-plus "></i></a>
              </td>
              <td width="2%"><a href="../form/profilClients.php?id_clients='.$row["id_clients"].'"><i class="fa fa-pencil"></i></td>
              <td width="10%"></td>
            </tr>
            ';
      }
      echo '</tbody>
          </table>';
    } else {
      echo 'Données non trouvées';
    }
    echo $output;
    ?>
  </body>
</html>



Au passage, je t'invite à lire et à appliquer le contenu de ces liens :
https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code

Et pour poster ton code correctement sur ce forum :
https://codes-sources.commentcamarche.net/faq/11288-les-balises-de-code

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

Jespère que je ne me suis pas trompé



<?php
/* DATABASE CONFIGURATION */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'melanquiere');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'resto');


function getDB()
{
$dbhost=DB_SERVER;
$dbuser=DB_USERNAME;
$dbpass=DB_PASSWORD;
$dbname=DB_DATABASE;
try {
$bdd = new PDO("mysql:host=$dbhost;dbname=$dbname", $dbuser, $dbpass);
$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();
}
}
?>



Ci dessous le code de la page :


<?php
$connect = mysqli_connect("localhost", "melanquiere", "", "resto");
$output = '';
if(isset($_POST["query"]))
{
$search = mysqli_real_escape_string($connect, $_POST["query"]);
$query = "
SELECT * FROM clients
WHERE prenom LIKE '%".$search."%'
OR nom LIKE '%".$search."%'
OR adresse LIKE '%".$search."%'
OR ville LIKE '%".$search."%'
OR cp LIKE '%".$search."%'
OR email LIKE '%".$search."%'
OR id_clients LIKE '%".$search."%'
";
}
else
{
$query = "
SELECT * FROM clients ";
}
$result = mysqli_query($connect, $query);
if(mysqli_num_rows($result) > 0)
{
$output .= '
</br>
<table >
<thead>
<tr>
<th>ID</th>
<th>Client</th>
<th>Email</th>
<th>Tel</th>
</thead>
<tbody>
</tr>
';

while($row = mysqli_fetch_array($result))
{
$output .= '
<tr>
<td width="10%"> '.$row["id_clients"].'</td>
<td width="20%">'.$row["prenom"].' '.$row["nom"].'</td>
<td width="20%">'.$row["email"].'</td>
<td width="20%">'.$row["tel"].'</td>
<td width="2%">
<a
data-toggle="modal"
data-target="#exampleModal"
data-whatever="'.$row['id_clients'].' "><i class="fa fa-plus "></i></a>
</td>

<td width="2%"><a href="../form/profilClients.php?id_clients='.$row["id_clients"].'"><i class="fa fa-pencil"></i></td>
<td width="10%"></td>
</tr>
';
}
echo ' </tbody></table>';
}
else
{
echo 'Données non trouvées';
}
echo $output;

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

C'est bon je viens de comprendre pourquoi il faut entourer avec des balises merci
Messages postés
29803
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
22 octobre 2020
2 867 >
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

sachant que les informtionts de connexion qui se trouvaient dans le code que tu nous as montré sont
/* DATABASE CONFIGURATION */
define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'melanquiere');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'resto');

je ne vois pas comment tu peux te retrouver avec un user "test123456"
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

Merci pour ton aide en tout cas, maintenant 'ai les 2 messages suivants:
Notice: Undefined variable: bdd in C:\wamp\www\O2G\fetch\clients.php on line 34


 Fatal error: Uncaught Error: Call to a member function prepare() on null in C:\wamp\www\O2G\fetch\clients.php on line 34


ça concerne cette ligne

  $requete = $bdd -> prepare($sql) ;

Messages postés
12721
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707 >
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

je pense qu'il faut sur cette ligne remplacer $bdd par $connect.
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019
>
Messages postés
12721
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020

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

le champ de la barre de recherche ci-dessous
     <div class="box-body">
        
         <input type="text" name="search_text" id="search_text" placeholder="Search by Customer Details" class="form-control" /> 
         <div id="result"></div>		
         <div style="clear:both"></div>
       </div>
Messages postés
16
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
17 décembre 2019

Pour avoir les derniers clients rentrés qui s'affichent dans le tableau, j'ai ajouté

order by id_clients desc à la requete "SELECT * FROM clients"


ça affiche le mesage ci_dessous :

 Erreur ! SQLSTATE[42000]: Syntax error or access violation: 1064 Erreur de syntaxe près de 'WHERE prenom LIKE '%232%' OR nom LIKE '%232%' ' à la ligne 1 Données non trouvées 


après un var_dump de la requête j'ai l'affichage ci-dessous :

C:\wamp\www\O2G\fetch\clients.php:38:string ' SELECT * FROM clients order by id_clients DESC  WHERE  prenom LIKE '%232%'
                  OR nom LIKE '%232%'
                  OR adresse LIKE '%232%'
                  OR ville LIKE '%232%'
                  OR cp LIKE '%232%'
                  OR email LIKE '%232%'
                  OR id_clients LIKE '%232%'
                   ' (length=337)


le filtre order by id_clients se met avant le where. j'ai essayé de le mettre après le dernier like pour qu'il s'affiche a la fin.
Il me les affiche bien dans l'ordre du dernier clientes rentrés, mais il le fait que lors de la recherche.
Messages postés
12721
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
22 octobre 2020
707
je suppose que tu as ajouté le order by à l'intérieur du if. difficile d'être plus précis si tu ne montres pas ce que tu as fait.