Requête SQL disfonctionnelle [Résolu]

nassou01 8 Messages postés dimanche 30 avril 2017Date d'inscription 11 juin 2017 Dernière intervention - 13 mai 2017 à 20:20 - Dernière réponse : nassou01 8 Messages postés dimanche 30 avril 2017Date d'inscription 11 juin 2017 Dernière intervention
- 10 juin 2017 à 21:00
Bonsoir à tous :D
J'essaye d'envoyer une requête SQL qui demande de ne sélectionner que les entrées qui correspondent à un certain critère (WHERE ***=***) et de les trier à l'aide d'un autre critère (ORDER BY ***).
Pour cela, je demande à l'utilisateur de choisir les critères (via des listes déroulantes). Je les récupère, et les insère dans ma requête. Jusque là, pas de problème, ça marche comme je le veux.
Mais un problème survient : si le critère WHERE fonctionne, ORDER BY lui ne semble pas fonctionner...
Voici ce que ça donne dans mon fichier :

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Liste des jeux</title>
</head>
<body>
<div id="main">

<form method="POST" action="index.php">
<strong>Possesseur :</strong>
<select name="possesseur">
<option value="Corentin">Corentin</option>
<option value="Florent">Florent</option>
<option value="Mathieu">Mathieu</option>
<option value="Michel">Michel</option>
<option value="Patrick">Patrick</option>
<option value="Sébastien">Sébastien</option>
</select><br />
<strong>Trier par :</strong>
<select name="ordre">
<option value="nbre_joueurs_max">Joueurs max.</option>
<option value="nom">Nom</option>
<option value="possesseur">Possesseur</option>
<option value="prix">Prix</option>
<option value="console">Support</option>
</select>
<input type="submit" name="confirm" value="Envoyer" />
</form>

<?php
$ordre = $_POST['ordre'];
$possesseur = $_POST['possesseur'];
?>

<?php
if(isset($_POST['confirm']))
{

try
{
$base = new PDO('mysql:host=localhost;dbname=MaBase','root','');
}

catch(Exception $e)
{
die('Erreur :'.$e->getMessage());
}

$result = $base->prepare('SELECT * FROM jeux_video WHERE possesseur=:possesseur ORDER BY :ordre');
$result->execute(array('possesseur'=>$possesseur, 'ordre'=>$ordre));

while($print=$result->fetch())
{
?>

<p>
<strong>Jeu :</strong> <?php echo($print['nom']); ?><br />
Support : <?php echo($print['console']); ?><br />
Possesseur : <?php echo($print['possesseur']); ?><br />
Joueur max. : <?php echo($print['nbre_joueurs_max']); ?><br />
Prix de vente : <?php echo($print['prix']); ?><br />
Commentaire de <?php echo($print['possesseur']); ?> : <em><?php echo($print['commentaires']); ?></em>
</p>

<?php
}

$result->closeCursor();
}
?>

</div>
</body>
</html>


On peut m'expliquer pourquoi ORDER BY ne veut pas fonctionner ?
Afficher la suite 
8Messages postés dimanche 30 avril 2017Date d'inscription 11 juin 2017 Dernière intervention

7 réponses

Répondre au sujet
NHenry 14002 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 13 mai 2017 à 20:29
0
Utile
1
La méthode utilisée, remplace ":ordre" par la valeur passée, mais celle-ci est considérée comme une valeur et non pas comme un nom de colonne.

Il faut pré-préparer la requête SQL directement avec le bon Order By (le WHERE peut rester en requête préparée).
nassou01 8 Messages postés dimanche 30 avril 2017Date d'inscription 11 juin 2017 Dernière intervention - 14 mai 2017 à 00:54
Donc je dois supprimer :order pour indiquer un critère qui restera fixe ?
Hum... Pas d'autres moyens en PHP ?
Commenter la réponse de NHenry
jee pee 21323 Messages postés mercredi 2 mai 2007Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - Modifié par jee pee le 13/05/2017 à 20:33
0
Utile
2
Salut,

Je n'utilise pas php, je vais donc juste faire une remarque de logique. Order by attend un nom de champ, pas une valeur comme possesseur avec des quotes.

une requête devrait avoir comme syntaxe '
SELECT * FROM jeux_video WHERE possesseur="Corentin" ORDER BY prix
' et non
'SELECT * FROM jeux_video WHERE possesseur="Corentin" ORDER BY "prix"'
Corentin et prix ne devraient pas être traités en résultat de la même façon l'un doit avoir de quotes, l'autre pas.

cdlt

        un étranger, c'est un ami qu'on n'a pas encore rencontré.
nassou01 8 Messages postés dimanche 30 avril 2017Date d'inscription 11 juin 2017 Dernière intervention - 13 mai 2017 à 21:10
Une idée de comment je peux me débarrasser des quotes ?
NHenry 14002 Messages postés vendredi 14 mars 2003Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - 13 mai 2017 à 21:18
Voir mon message, je te donne une bonne piste.
Commenter la réponse de jee pee
jordane45 19213 Messages postés mercredi 22 octobre 2003Date d'inscriptionModérateurStatut 12 décembre 2017 Dernière intervention - Modifié par jordane45 le 15/05/2017 à 01:05
0
Utile
1
Bonjour,

Déjà .. on place le code de connexion à la bdd dans un fichier à part (par exemple : cnxbdd.php ) qu'on aura qu'à inclure lorsqu'on en a besoin.
On en profite pour activer l'affichage des erreurs PDO.
<?php
//fichier cnxbdd.php

try{
$bdd =new PDO('mysql:host=localhost; dbname=MaBase; charset=utf8', 'root', '');
// Activation des erreurs PDO
 $bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
// mode de fetch par défaut : FETCH_ASSOC / FETCH_OBJ / FETCH_BOTH
 $bdd->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch(PDOException $e) {
    die('Erreur : ' . $e->getMessage());
}
?>


Ensuite,
-on essaye autant que possible de placer le maximum de son code php AVANT le HTML
(Cela le rend plus lisible.. et donc plus maintenable.)
- On récupère proprement les variable via l'écriture ternaire et les isset ou !empty
- On évite d'ouvrir/fermer les balises PHP à tout bout de champ...
- On place ses requêtes dans les blocs Try/catch
- On active l'affichage des erreurs php
- ...etc...

Voila :
<?php
//Affichage des erreurs PHP
error_reporting(E_ALL);
ini_set('display-errors','on');

//récupération PROPRE des variables AVANT de les utiliser
$ordre = !empty($_POST['ordre']) ? $_POST['ordre'] : NULL;   
$possesseur = !empty($_POST['possesseur']) ? $_POST['possesseur'] : NULL;
$confirm = isset($_POST['confirm']) ? $_POST['confirm'] : NULL;
 
 if($confirm){ 
 //préparation de la requête et des variables
 $sql = "SELECT * 
         FROM jeux_video 
         WHERE possesseur=:possesseur 
         ORDER BY $ordre";
 $datas = array(':possesseur'=>$possesseur);

  //Execution de la requete
  try{
    $requete = $bdd->prepare($sql) ;
    $requete->execute($datas) ;
  }catch(Exception $e){
    // en cas d'erreur :
     echo " Erreur ! ".$e->getMessage();
     echo " Les datas : " ;
    print_r($datas);
  }
  
  //on transorme le resultat de la requete en array
  $a_result = $requete->fetchAll();
  $requete->closeCursor();
 }
?>
<!DOCTYPE html>
<html>
 <head>
  <meta charset="UTF-8" />
  <title>Liste des jeux</title>
 </head>
 <body>
  <div id="main">
   
   <form method="POST" action="">
    <strong>Possesseur :</strong>
    <select name="possesseur">
     <option value="Corentin">Corentin</option>
     <option value="Florent">Florent</option>
     <option value="Mathieu">Mathieu</option>
     <option value="Michel">Michel</option>
     <option value="Patrick">Patrick</option>
     <option value="Sébastien">Sébastien</option>  
    </select><br />
    <strong>Trier par :</strong>
    <select name="ordre">
     <option value="nbre_joueurs_max">Joueurs max.</option>
     <option value="nom">Nom</option>
     <option value="possesseur">Possesseur</option>
     <option value="prix">Prix</option>     
     <option value="console">Support</option> 
    </select>
    <input type="submit" name="confirm" value="Envoyer" />
   </form>


   <?php
     //on parcoure l'array pour générer l'affichage.
     // on évite d'ouvrir/fermer les balises php à tout va.. on fera donc tout en php
     foreach($a_result as $print){
      echo "<p>
         <strong>Jeu :</strong> ".$print['nom']."<br />
         Support : ".$print['console']."<br />
         Possesseur : ".$print['possesseur']."<br />
         Joueur max. : ".$print['nbre_joueurs_max']."<br />
         Prix de vente : ".$print['prix']."<br />
         Commentaire de ".$print['possesseur']." :<em>".$print['commentaires']."</em>
         </p>";
     }     
   ?>
   
  </div> 
 </body>
</html>
 

Cordialement, 
Jordane                                                                 
nassou01 8 Messages postés dimanche 30 avril 2017Date d'inscription 11 juin 2017 Dernière intervention - 10 juin 2017 à 21:00
Il est un peu tard pour ce remerciement, mais tout de même : merci beaucoup !
Commenter la réponse de jordane45