IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[SQL] Découpage d'une requête SQL


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre régulier
    Inscrit en
    Mai 2007
    Messages
    183
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 183
    Points : 121
    Points
    121
    Par défaut
    J'utiliserais la barre verticale pour faire accepter les 2 motifs, un avec "ORDER BY" et l'autre sans :

    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.

  3. #3
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Pourquoi parser une query ?

  4. #4
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Bonjour désolé pour le retard,

    J'ai essayé avec le "ou" "|" comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre actif Avatar de pimpmyride
    Inscrit en
    Décembre 2005
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 321
    Points : 207
    Points
    207
    Par défaut
    et si quand tu generes ta requete tu ferais comme ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  6. #6
    Membre à l'essai
    Inscrit en
    Janvier 2004
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    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

Discussions similaires

  1. [SQL] Conditions dans une requête SQL
    Par NeO666Linux dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 02/07/2007, 23h35
  2. [SQL] Problème avec une requête sql
    Par bodysplash007 dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 11/05/2007, 18h30
  3. Réponses: 15
    Dernier message: 11/05/2007, 16h28
  4. [SQL] Comment automatiser une requête SQL alimentée par un formulaire HTML?
    Par tse_tilky_moje_imja dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 30/06/2006, 00h46
  5. [SQL] Recherche d'une requête SQL
    Par kilkikou dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 07/06/2006, 17h00

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo