Requête SQL disfonctionnelle

Résolu/Fermé
nassou01 Messages postés 8 Date d'inscription dimanche 30 avril 2017 Statut Membre Dernière intervention 11 juin 2017 - Modifié le 13 mai 2017 à 20:24
nassou01 Messages postés 8 Date d'inscription dimanche 30 avril 2017 Statut Membre Dernière intervention 11 juin 2017 - 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 ?

3 réponses

NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
13 mai 2017 à 20:29
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).
0
nassou01 Messages postés 8 Date d'inscription dimanche 30 avril 2017 Statut Membre Dernière intervention 11 juin 2017
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 ?
0
jee pee Messages postés 39650 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 238
Modifié le 13 mai 2017 à 20:33
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é.
0
nassou01 Messages postés 8 Date d'inscription dimanche 30 avril 2017 Statut Membre Dernière intervention 11 juin 2017
13 mai 2017 à 21:10
Une idée de comment je peux me débarrasser des quotes ?
0
NHenry Messages postés 15113 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 22 avril 2024 331
13 mai 2017 à 21:18
Voir mon message, je te donne une bonne piste.
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 15 mai 2017 à 01:05
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                                                                 
0
nassou01 Messages postés 8 Date d'inscription dimanche 30 avril 2017 Statut Membre Dernière intervention 11 juin 2017
10 juin 2017 à 21:00
Il est un peu tard pour ce remerciement, mais tout de même : merci beaucoup !
0