Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
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 12/12/2007, 17h54   #1
Invité de passage
 
Inscription : janvier 2004
Messages : 17
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 17
Points : 3
Points : 3
Par défaut [SQL] Découpage d'une requête SQL

Bonjour à tous,

Je suis en train de créer une expression régulière permettant de me découper une requête de sélection simple (pas de requêtes imbriquées). J'ai fait quelques recherches (tuto, forum) et je reste bloqué...

Le but est couper la requête en plusieurs morceaux :
  • SELECT et les champs sélectionnée
  • FROM et les tables sélectionnées
  • ORDER BY et les champs
Voici le code utilisé
Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
//Requête à traiter
$sql = "SELECT user_id, user_name 
FROM user
ORDER BY ";
 
$tab =preg_match('/^.*(SELECT){1,1}(.*)(\nFROM| FROM){0,1}(.*)(\nORDER BY| ORDER BY){0,1}(.*)/i',$sql,$resultat); 
// /^.* Sélection des caractères avant le select (permet de supprimer les blancs)
//(SELECT){1,1}(.*) Récupération du SELECT et des champs sélectionés
//(\nFROM| FROM){1,1}(.*) Sélection du FROM et des tables appelées (le FROM peut être séparé soit par un espace soit par un retour chariot)
//(\nORDER BY| ORDER BY){0,1}(.*) Sélection du ORDER BY et des champs d'ordre (le ORDER BY peut ne pas être présent et peut être séparé soit par un espace soit par un retour chariot)
// /i (la casse n'est pas importante)
Le souci c'est la gestion du "ORDER BY" qui peut ne pas être présent dans la requête. Si jamais il y a un "ORDER BY" celui-ci n'est pas écrit dans le tableau dans des champs différents (présent dans le même champ que le FROM). Si le ORDER BY n'est pas présent, l'expression régulière n'est pas bonne... Je ne sais donc pas trop quoi faire.

N'hésitez pas à me faire par de vos remarques quant à l'expression régulière en elle-même.

Merci d'avance
pendragon509 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 18h05   #2
Membre régulier
 
Inscription : mai 2007
Messages : 180
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 180
Points : 82
Points : 82
J'utiliserais la barre verticale pour faire accepter les 2 motifs, un avec "ORDER BY" et l'autre sans :

Citation:
La barre verticale | sert à séparer des alternatives. Par exemple, dans le masque "/dupont|martin/" recherche soit "dupont", soit "martin". Le nombre d'alternatives n'est pas limité, et il est même possible d'utiliser la chaîne vide. Lors de la recherche, toutes les alternatives sont essayées, de gauche à droite, et la première qui est acceptée est utilisée. Si les alternatives sont dans un sous-masque, elle ne réussiront que si le masque principal réussi aussi.
gomodo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 20h59   #3
Membre chevronné
 
Homme Stéphane Wirtel
Consultant ERP
Inscription : février 2004
Messages : 636
Détails du profil
Informations personnelles :
Nom : Homme Stéphane Wirtel
Localisation : Belgique

Informations professionnelles :
Activité : Consultant ERP

Informations forums :
Inscription : février 2004
Messages : 636
Points : 736
Points : 736
Envoyer un message via Skype™ à swirtel
Pourquoi parser une query ?
__________________
Nul ne peut mieux connaitre la connaissance qu'elle-même.
swirtel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 14h03   #4
Invité de passage
 
Inscription : janvier 2004
Messages : 17
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 17
Points : 3
Points : 3
Bonjour désolé pour le retard,

J'ai essayé avec le "ou" "|" comme ceci
Code :
1
2
 
$tab =preg_match('/^.*(SELECT){1,1}(.*)(\nFROM| FROM){0,1}(.*)(\nORDER BY| ORDER BY|){0,1}(.*)/i',$sql,$resultat);
Cela fonctionne si le "ORDER BY" est à la ligne ou absent. Par contre pour le cas ou il est après un espace, le tableau formé est mauvais car le "ORDER BY" et les champs concernant l'ordre sont dans le même champ que le "FROM" et les tables sélectionnés.


0 SELECT user_id, user_name FROM user ORDER BY user_id
1 SELECT
2 user_id, user_name
3 FROM
4 user ORDER BY user_id
5
6

Pour répondre à swirtel, parser un requête me permet lors d'un autre traitement de modifier la requête. Rajouter des conditions et champs...

Merci pour les réponses.
pendragon509 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 17h11   #5
Membre actif
 
Avatar de pimpmyride
 
Inscription : décembre 2005
Messages : 303
Détails du profil
Informations forums :
Inscription : décembre 2005
Messages : 303
Points : 156
Points : 156
et si quand tu generes ta requete tu ferais comme ca
Code :
1
2
3
4
5
6
7
8
 
$select = "SELECT champs1, champs2, etc...";
$from = "FROM table 1 JOIN table 2 USING(id)";
$where = "WHERE id = 2";
 
if ($var == true) {
   $oderby = "id DESC";
}
et la tu n'as plus besoin de parser ta requete.
pimpmyride est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/12/2007, 09h33   #6
Invité de passage
 
Inscription : janvier 2004
Messages : 17
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 17
Points : 3
Points : 3
Bonjour,

Merci pimpmyride pour ta solution, mais le développement est bien plus complexe que cela, car je ne créer pas la requête, je l'a récupère et la modifie. C'est pour cela que l'expression régulière est nécessaire (à part s'il y a une autre solution que l'expression régulière pour découper une requête).

Merci
pendragon509 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h21.


 
 
 
 
Partenaires

Hébergement Web