Requête SQL disfonctionnelle
Résolu
nassou01
Messages postés
8
Date d'inscription
Statut
Membre
Dernière intervention
-
nassou01 Messages postés 8 Date d'inscription Statut Membre Dernière intervention -
nassou01 Messages postés 8 Date d'inscription Statut Membre Dernière intervention -
A voir également:
- Requête SQL disfonctionnelle
- Logiciel sql - Télécharger - Bases de données
- Sql lister les tables ✓ - Forum Programmation
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Jointure sql ✓ - Forum MySQL
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
3 réponses
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).
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).
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 '
cdlt
un étranger, c'est un ami qu'on n'a pas encore rencontré.
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é.
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.
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 :
Cordialement,
Jordane
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
Hum... Pas d'autres moyens en PHP ?