Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PDO
PDO Forum d'entraide sur PDO (PHP Data Objects) : pilote générique de bases de données avec PHP. Avant de poster -> FAQ PDO et Cours PDO
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/11/2010, 15h05   #1
HwRZxLc4
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Par défaut Requete prepare dynamique

Bonjour,

Je me pose la question sur comment on peux réaliser des requêtes PDO dynamique pour le tri, exemple :

Requête de base
Code :
1
2
3
$sql = $DB->prepare(SELECT * ma_table ORDER BY id ASC);
$sql->execute();
....

Requête de tri sur le nom croissant
Code :
1
2
$sql = $DB->prepare(SELECT * ma_table ORDER BY nom ASC);
$sql->execute();

Requête de tri sur le nom décroissant
Code :
1
2
$sql = $DB->prepare(SELECT * ma_table ORDER BY nom DESC);
$sql->execute();
Etc pour le prenom, ville, ...

Pour simplifier et rendre le code biens plus léger, quelle méthode utiliser/existe t-il ?

Merci d'avance pour vos lumières.
  Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 08h51   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 167
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 167
Points : 6 451
Points : 6 451
ceci ne fonctionne pas ?
Code :
1
2
3
 
$sql = $DB->prepare('SELECT * ma_table ORDER BY ? DESC');
$sql->execute(array('nom'));
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 25/11/2010, 13h59   #3
HwRZxLc4
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Bonjour et merci pour la réponse,

Il manque la possibilité de changer ASC en DESC

ce-si peux t-il fonctionner ?

Code :
1
2
3
 
$sql = $DB->prepare('SELECT * ma_table ORDER BY ? ?');
$sql->execute(array('nom','ASC'));
  Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 14h07   #4
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 167
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 167
Points : 6 451
Points : 6 451
Le mieux est de faire un test
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 14h16   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Seules des valeurs peuvent faire l'objet de paramètres. Les noms SQL (colonnes, tables, bases, etc) ou mot-clés (asc/desc) en sont exclus. D'autant qu'ils se verraient ajoutés des quotes et on s'éloigne quelque peu de leur principe ...

Donc, non, impossible de dynamiser ces parties de requêtes avec une requête préparée (il faut le faire avant la préparation ou avec une requête non préparée). (à se demander si des requêtes préparées sont ici utiles par ailleurs)
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 14h20   #6
HwRZxLc4
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Merci julp, c'est bien ce qu'il me semblais :s

Pas gagner d'avoir un code légé et lisible avec un tri multi colonne ....
  Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 14h21   #7
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 167
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 167
Points : 6 451
Points : 6 451
Alors dans ce cas il faut préparer la requête dynamiquement.


Code :
1
2
3
4
5
 
$nom = 'nom'
$req = 'SELECT * ma_table ORDER BY '.$nom;
$sql = $DB->prepare($sql);
$sql->execute();
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/11/2010, 14h32   #8
HwRZxLc4
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Donc ce genre de truc va être fonctionnel ? avec la sécu qui va avec ?

Code :
1
2
3
4
5
$nom = 'nom';
$tri = 'ASC';
$req = 'SELECT * ma_table ORDER BY '.$nom.' '.$tri;
$sql = $DB->prepare($sql);
$sql->execute();
  Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 04h42   #9
Membre expérimenté
 
Avatar de FMaz
 
Inscription : mars 2005
Messages : 648
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 648
Points : 527
Points : 527
Oui tout à fait !

Et comme tu la dit, il sera primodial que tu t'assure de la sécurité des paramètres que tu met en dur dans ta requête (soit le nom du champ et l'ordre de tri)

Et si un second son de cloche peut te rassurer:
Je confirme que seul les valeurs peuvent être "bindé". Aucun nom de table ou de champs ni mot clé.

Donc ta solution est bel et bien la bonne.
FMaz est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/11/2010, 09h27   #10
HwRZxLc4
Invité(e)
 
Messages : n/a
Détails du profil
Informations forums :
Messages : n/a
Points : 0
Merci à vous
  Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Enlever Résolu
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 16h15.


 
 
 
 
Partenaires

Hébergement Web