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 :

[PHP-CLI] Interprêter code PHP dans une chaîne


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Points : 37
    Points
    37
    Par défaut [PHP-CLI] Interprêter code PHP dans une chaîne
    Bonjour à tous,

    J'écris une appli de type command line et je suis amené à devoir exécuter des requêtes SQL. Ces requêtes SQL s'exécuteront sur des bases Oracle et sont stockées dans une base MySQL.

    J'aimerai pouvoir dynamiser ces requêtes.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    INSERT INTO toto
    SELECT * FROM titi
    WHERE id = <?= $context->id ?>
    J'aimerai ici pouvoir interpréter le code PHP un peu comme une page HTML contenant du PHP et retourner la requête dans un string puis l'exécuter avec PDO.

    Jusque là vous allez me dire qu'il suffit de faire un replace ou un truc du genre.

    Néanmoins, j'aimerai faire aussi ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    INSERT INTO toto
    SELECT * FROM titi
    WHERE id in (
    <?php foreach($context->ids as $id): ?>
    <%= $id %>,
    <?php endforeach ?>
    )
    J'ai pensé à générer le code en utilisant des fichiers temporaires mais cette solution ne me convient pas (bricolage).

    Une autre idée ?

    Merci

  2. #2
    Rédacteur
    Avatar de Halleck
    Homme Profil pro
    Consultant PHP
    Inscrit en
    Mars 2003
    Messages
    597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Consultant PHP

    Informations forums :
    Inscription : Mars 2003
    Messages : 597
    Points : 878
    Points
    878
    Par défaut
    Une solution pas spécialement élégante mais qui fonctionne (attention aux effets de bord; écrasements...):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php
    ob_start();
    include 'fichier_sql.php';
    $query = ob_get_clean();
    Zend PHP Certified Engineer, Certifié Symfony2
    blog : blog.lepine.pro
    Secrétaire de l'AFUP (Association des Utilisateurs de PHP)

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    J'ai fait ça:
    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    <?php
     
    /**
     * PHP QUERY GENERATOR
     * -------------------
     */
     
    require_once "Collection.class.php";
     
    $usage = <<< USAGE
    usage: $argv[0] [options] <query|file>
     
    Valid options:
        -c --context <context> The context file
        -t --type <type>       The type of the context file
                               (INI or JSON)
        -h --help              Display this help message
     
    USAGE;
     
    $self = array_shift($argv); // le premier paramètre est toujours le script
    $argc = count($argv);
     
    $argc || die($usage);
     
    // on parse les arguments un à un
    while ($arg = array_shift($argv)) {
        switch ($arg) {
            case '-c':
            case '--context':
                $context_file = array_shift($argv);
                if (empty($context_file))
                    die($usage);
                if (!is_file($context_file) || !is_readable($context_file))
                    die("$context_file is not a valid file\n");
                break;
     
            case '-t':
            case '--type':
                $context_file_type = strtolower(array_shift($argv));
                if (empty($context_file_type))
                    die("you must provide a type\n");
                if (!in_array($context_file_type, array('ini','json')))
                    die("invalid type $context_file_type\n");
                break;
     
            case '-h':
            case '--help':
                die($usage);
     
            default:
                $query = $arg;
                break;
        }
    }
     
    // on crée le contexte
    if ($context_file) {
        $method = "from" . ucfirst(isset($context_file_type) ? $context_file_type : 'Ini') . "File";
        $context = Collection::$method($context_file);
    }
     
    // on crée le fichier temporaire pour execution
    $file             = is_file($query) ? file_get_contents($query) : $query;
    $tmp_file         = dirname(__FILE__) . '/' . uniqid('query_') . '.php';
    $tmp_file_content = str_replace('<?=', '<?php echo ', $file);
     
    if (!file_put_contents($tmp_file, $tmp_file_content))
        die("cannot create temp file $tmp_file");
     
    // on exécute le script temporaire
    include $tmp_file;
     
    unlink($tmp_file);
    Usage:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /c/wamp/www/query-generator> php query-generator.php -c test.ini -t ini test.sql
    SELECT *
    FROM a.bWHERE `a`='hello'
    AND `c` IN (1|2|3)
     
    /c/wamp/www/query-generator> php query-generator.php -c test.ini -t ini 'SELECT * FROM <?=$context->table?>'
    SELECT * FROM a.b
    ça a pas l'air de marcher trop mal non ?
    Fichiers attachés Fichiers attachés

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Février 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 50
    Points : 37
    Points
    37
    Par défaut
    J'ai pris vos trucs pour en faire un mix :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    $tempFile = new File(tempnam(null,null));
    $tempFile->open('w');
    $tempFile->write($sqlQuery);
    ob_start();
    $context = Job_Instance_Context::load();
    include $tempFile->fileName;
    $sqlQuery2 = ob_get_contents();
    ob_end_clean();
    $tempFile->close();
    $tempFile->delete();
    ?>
    Je récupère bien ma requête avec le code PHP interprété

    Merci à vous 2

Discussions similaires

  1. interprétation des variables dans une chaîne
    Par marts dans le forum Langage
    Réponses: 2
    Dernier message: 31/01/2009, 20h01
  2. [phpBB] Code PHP non interprété dans un thème subsilver
    Par killpilot dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 24/06/2007, 11h42
  3. [Système] Inclure du code PERL dans une page php ?
    Par Munkey74 dans le forum Langage
    Réponses: 3
    Dernier message: 31/05/2007, 09h18
  4. Réponses: 1
    Dernier message: 30/11/2006, 17h49
  5. [Système] Exécuter un bloc PHP dans une chaîne
    Par ideal dans le forum Langage
    Réponses: 7
    Dernier message: 30/08/2006, 16h15

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