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

Langage PHP Discussion :

Extraire des informations d'une requête SQL


Sujet :

Langage PHP

  1. #1
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut Extraire des informations d'une requête SQL
    bonjour je cherche a extraire le nom d'une table d'un string sql.

    pour le moment je pratique ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $SQL = strtoupper($SQL);
    $SQL = str_replace(" FROM ", "[*%&]", $SQL );
    $SQL = str_replace(" WHERE ", "[*%&]", $SQL);
    list($fields,$this->table,$whereclause) = explode("[*%&]",$SQL);
    mais qd il n'y a pas de where ca plante. jusqu'a present je rajoutais where 1=1 et ca ne me posait pas de problemes mais un nouvelle ecran ou je fais un select ds le dual m'impose de ne pas mettre de clause where.

    j'en profite pour essayer de mettre une expression reguliere mais je cale completement... entre le regex le posix.. je patauge
    quel est le nom de la fonction qui me retournerai le nom de la table? (si je lui donne le bon pattern)

    merci

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Si tu cherches un truc vraiment béton, tu vas te prendre la tête, je te le promets...

    Voici une piste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /(?:SELECT|UPDATE|INSERT)[[:space:]](?:FROM|INTO)?([[:space:]])?`?([^` ]+)`?/i
    PS : Je n'ai pas testé...

  3. #3
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match(/^.*(FROM|INTO)\s+(\w)+/,$SQL,$resultat)
    le tout etant de faire et de voir si ca te donne ce qu'il faut.

    Si ca marche pas, donne moi un exemple de requete SQL que tu peux avoir et je te dirai ou le regexp merde.

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    maxoo : Ton expression semble passer mais il mettre le + dans la parenthèse.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    $sql = 'SELECT truc FROM table1 WHERE INSERT INTO table2() VALUES () UPDATE table3 SET ';
     
    preg_match_all('/(?:SELECT|UPDATE|INSERT)\s([a-z0-9_]+)?\s?(?:FROM\s|INTO\s|SET\s)`?([a-z0-9_]*\s?)/i', $sql, $matches, PREG_SET_ORDER);
    echo '<pre>';
    print_r($matches);
    echo '</pre>';
     
    foreach($matches as $match){
       if(!empty($match[2])){
          $tablename = $match[2];
       }
       else{
          $tablename = $match[1];
       }
     
       echo $tablename.'<br />';
    }
    J'ai testé mon code, cette fois, et ça fonctionne.
    Parcours $matches : pour chaque élément, ton nom de table est en première position. Tu peux enlever des ?: pour avoir plus d'infos.

    [Edit] Correction : ça ne fonctionnait pas correctement pour les UPDATE.
    Pour avoir les résultats, tu dois tester chaque $match : si $match[2] est non vide, alors c'est ton nom de table, sinon tu le trouveras dans $match[1].

  5. #5
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Citation Envoyé par Kirkis
    maxoo : Ton expression semble passer mais il mettre le + dans la parenthèse.
    exact !!!

    une question : pourquoi tu t'embete a définir des trucs avant le FROM et apres le nom de la TABLE ... ca ne sert a rien ici.

    il faut optimiser (le code et la comprehension !!)

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    C'est pour les requêtes UPDATE. Comment les gères-tu si tu ne mets rien ?

    De plus, il est plus performant d'ancrer les regex et de les faire commencer par une chaîne littérale. Dans mon exemple, il n'y a pas d'ancrage car on peut parser une chaîne complète pour plusieurs requêtes.

    [Edit] Tiens, pour la compréhension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    preg_match_all('/'
       .'(?:SELECT|UPDATE|INSERT)\s'
       .'([a-z0-9_,` ]+)?'        // Maybe a tablename, maybe a list of fields
       .'(?:FROM\s|INTO\s|SET\s)'
       .'`?'
       .'([a-z0-9_]*\s?)'         // If present, assuredly a tablename
       .'/i', $sql, $matches, PREG_SET_ORDER);

  7. #7
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match(/(FROM|INTO|UPDATE)\s+(\w+)/i,$SQL,$resultat)
    mais avec ca, ca marche pour tout les SQL aussi

  8. #8
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Ouaip...
    /me va se pendre

  9. #9
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?
    $SQL = "select * from table where qqq = 111";
    preg_match(/(FROM|INTO|UPDATE)\s+(\w+)/i,$SQL,$resultat); //line 3
    foreach($resultat as $brol) echo $brol.'<br />'; 
     
    //Parse error: parse error, expecting `')'' in h:\easyphp1-8\www\index.php on line 3
     
     
    $sql = 'SELECT truc FROM table1  '; 
     
    preg_match_all('/(?:SELECT)\s([a-z0-9_]+)?\s?(?:FROM\s)`?([a-z0-9_]*\s?)/i', $sql, $matches, PREG_SET_ORDER); 
     
    echo $matches[0][2].'<br />'; 
     
    ?>
    la deuxième solution marche impecc ;-)

  10. #10
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //$msSQL = "SELECT top 20 WO_NUM, TASK, TYPE, STATUS ,'detail.php?num=' + cast( wo_num as char ) from TASKS WHERE TYPE IS NOT NULL AND STATUS = 'TERMINÉ' ";
     
    $msSQL = strtoupper($msSQL);
     
    preg_match_all('/(?:SELECT)\s([a-z0-9_]+)?\s?(?:ORDER BY\s)`?([a-z0-9_]*\s?)/i', $msSQL, $matches, PREG_SET_ORDER);
    me retourne un tableau vide, vous savez pourquoi?

  11. #11
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Arf, tu voudrais pas utiliser la balise code stp ?

    Sinon, ne serait-ce pas parce que tu as mis ta chaîne en commentaires ?


    Tu n'aimes pas la solution de maxoo ?

    [Edit] La vraie réponse : la classe qui matche ce qui suit SELECT est "[a-z0-9_]", or tu utilises également d'autres signes comme "?", "+", etc.
    Modifie la classe ou utilise la solution de maxoo (plus simple, c'est évident).

    [Edit 2] Tu mets également une obligation de trouver "ORDER BY" alors qu'il n'y en a pas...

  12. #12
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut
    mon select est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT WO_NUM, TASK, TYPE, STATUS ,'DETAIL.PHP?NUM=' + CAST( WO_NUM AS CHAR ) FROM TASKS WHERE TYPE IS NOT NULL AND STATUS <> 'TERMINÉ' ORDER BY WO_NUM DESC
    j'ai rajouté les caracteres manquants:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match_all('/(?:SELECT)\s([a-z0-9_\'\?\+\.\=\(\)]+)?\s?(?:ORDER BY\s)`?([a-z0-9_]*\s?)/i', $msSQL, $matches, PREG_SET_ORDER);
    mais ca ne va pas..

    la solution de maxoo me donne tjrs :
    Parse error: parse error, expecting `')'' in h:\easyphp1-8\www\tfe\OO\msmaster.inc on line 16
    l'adaptation qui me donne le resultat le plus proche est :
    preg_match_all('/(ORDER BY)\s+?([a-z0-9_]*\s?)/i',$msSQL,$resultat);

    foreach($resultat as $brol) foreach( $brol as $r)echo $r."<br />";
    elle m'affiche:
    ORDER BY WO_NUM
    ORDER BY
    WO_NUM
    le DESC manque...

  13. #13
    Membre émérite

    Homme Profil pro
    Expert PHP
    Inscrit en
    Novembre 2004
    Messages
    2 127
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Expert PHP
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 127
    Points : 2 557
    Points
    2 557
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <?
    $SQL = "select * from table where qqq = 111";
    preg_match(/(FROM|INTO|UPDATE)\s+(\w+)/i,$SQL,$resultat); //line 3
    foreach($resultat as $brol) echo $brol.'<br />';
    //Parse error: parse error, expecting `')'' in h:\easyphp1-8\www\index.php on line 3

    preg_match(/'(FROM|INTO|UPDATE)\s+(\w+)/i',$SQL,$resultat);
    une parse error ca se trouve facilement quand même ... t'aurais pu chercher un peu

  14. #14
    Membre averti Avatar de XtofRoland
    Profil pro
    Inscrit en
    Août 2005
    Messages
    357
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2005
    Messages : 357
    Points : 392
    Points
    392
    Par défaut
    j'ai cherché! la preuve .... dans mon post precedent en mélangeant les deux preg j'ai essayé de faire ca:

    l'adaptation qui me donne le resultat le plus proche est :
    preg_match_all('/(ORDER BY)\s+?([a-z0-9_]*\s?)/i',$msSQL,$resultat);

    foreach($resultat as $brol) foreach( $brol as $r)echo $r."<br />";

Discussions similaires

  1. [Requête]Concaténation des résultats d'une requête SQL
    Par teks9 dans le forum Développement
    Réponses: 2
    Dernier message: 01/09/2008, 15h34
  2. Comment utiliser des variables dans une requête SQL ?
    Par Ragnarok85 dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 12/02/2007, 16h23
  3. [Mail] Extraire des informations d'une liste
    Par Justin_C dans le forum Langage
    Réponses: 2
    Dernier message: 02/02/2007, 10h00
  4. Réponses: 5
    Dernier message: 28/12/2006, 15h41
  5. Extraire des informations d'une page web
    Par lr dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 28/03/2006, 12h38

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