Signaler

Requête SQL disfonctionnelle [Résolu]

Posez votre question nassou01 8Messages postés dimanche 30 avril 2017Date d'inscription 11 juin 2017 Dernière intervention - Dernière réponse le 10 juin 2017 à 21:00 par nassou01
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 
Utile
+0
plus moins
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 8Messages 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 ?
Répondre
Donnez votre avis
Utile
+0
plus moins
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

nassou01 8Messages 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 ?
Répondre
NHenry 13813Messages postés vendredi 14 mars 2003Date d'inscription ModérateurStatut 24 juin 2017 Dernière intervention - 13 mai 2017 à 21:18
Voir mon message, je te donne une bonne piste.
Répondre
Donnez votre avis
Utile
+0
plus moins
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 8Messages 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 !
Répondre
Donnez votre avis

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !