Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 30/11/2013, à 11:33

kleer

[Résolu] PHP : executer du code sous forme de chaine de caractère

Bonjour à tous

Je suis bloqué sur un programme en php
J'aimerais qu'a partir d'une chaine de caractères, php tente d’exécuter cette chaine comme étant du code :
Par exemple si

$str = "ma_fonction($a, $b, $c)";

J'aimerais que php appelle ma_fonction avec les paramètres $a, $b, $c.

Pour essayer de résoudre ce problème, je me suis tourné vers les fonctions variables

function mafonction($a, $b, $c)
{
    return $a . $b . $c;
}

$func_name = "mafonction";
$param1 = "aze";
$param2 = "rty";
$param3 = "uio";
echo $func_name($param1, $param2, $param3);

Ca marche très bien, mais ici, le problème qui se pose est le passage de paramètres :
Ca ne marchera que si la fonction appelée a trois paramètres

Avez vous une idée ?

Si besoin, je peux donner plus de détails

Merci beaucoup

Dernière modification par kleer (Le 01/12/2013, à 19:50)

Hors ligne

#2 Le 30/11/2013, à 12:28

ssdg

Re : [Résolu] PHP : executer du code sous forme de chaine de caractère

Euh, c'est très facile. Par contre, ce que tu demande semble extrèmement dangereux en termes de programmation. ce que tu vas éxecuter, s'il y a LA MOINDRE CHANCE que LA MOINDRE PORTION du code en question puisse être construite À PARTIR DE DONNÉES EXTÉRIEURES, Alors tu DONNE UN ACCÈS GRATUIT ET POTENTIELLEMENT ILLIMITÉ AU MOINDRE GREDIN CAPABLE DE TROUVER SA DROITE DE SA GAUCHE SUR INTERNET.

Si tu es toujours d'avis pour faire ça, merci de m'envoyer l'adresse du script en MP (parce que moi aussi je veux une machine gratuite) tongue et consulte le lien suivant: http://php.net/manual/fr/function.eval.php


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#3 Le 30/11/2013, à 13:15

kleer

Re : [Résolu] PHP : executer du code sous forme de chaine de caractère

Ah merci ! il me semblait bien que ça existait mais je retrouvais plus !

Merci de ta mise en garde, je ferais très attention et l'utiliserait le moins possible mais j'ai pas le choix hmm

Pour l'instant ça fonctionne en localhost, donc tu ne pourra pas essayer tongue

Hors ligne

#4 Le 30/11/2013, à 18:34

pires57

Re : [Résolu] PHP : executer du code sous forme de chaine de caractère

Merci de ta mise en garde, je ferais très attention et l'utiliserait le moins possible mais j'ai pas le choix 

On a toujours le choix .


Utilisateur d'Archlinux, Ubuntu et Kali Linux
Administrateur système et réseau spécialisé Linux.
LinkedIn

Hors ligne

#5 Le 30/11/2013, à 21:33

ssdg

Re : [Résolu] PHP : executer du code sous forme de chaine de caractère

Pour le coup, peut être pourrais tu exprimer ton problème histoire de voire si d'autres plus expérimentés ne pourraient pas trouver une autre solution.


s'il n'y a pas de solution, c'est qu'il n'y a pas de problème... ou pas.

Hors ligne

#6 Le 01/12/2013, à 19:30

kleer

Re : [Résolu] PHP : executer du code sous forme de chaine de caractère

D'accord, je vais vous expliquer :

Je voudrais faire une fonction qui valide un formulaire
Et pour chaque input du formulaire, il doit être possible de donner
Un groupe de requêtes à exécuter
Et/ou
Une liste de fonctions à exécuter
Et/ou
Une liste de méthodes d'un objet à exécuter



J'ai réussi à faire une première version qui exécute seulement une liste de requêtes par input du formulaire en fonction des permissions de
l'utilisateur courant, et de l'endroit où il se trouve sur le site. Mais certaines requêtes que je passe à la fonction que je veux faire existent déjà dans d'autres fonctions/méthodes que j'ai défini, donc au lieu de redéfinir des requêtes, il serait mieux d'appeler ces fonctions déjà existantes.

Le problème qui se pose est au passage de paramètres des fonctions
Je n'arrive pas à dire à PHP

Execute moi la fonction "x" avec les paramètres "a", "b", "c"

C'est ce que je disais dans mon premier post : on peux utiliser les fonctions variables en stockant le nom de la fonction en chaine de caractère de cette manière :

kleer a écrit :

<?php

function mafonction($a, $b, $c)
{
    return $a . $b . $c;
}

$func_name = "mafonction";
$param1 = "aze";
$param2 = "rty";
$param3 = "uio";
echo $func_name($param1, $param2, $param3);

?>

Donc pour le nom de la fonction, aucun problème

Là où ça coince : comment faire dans cet exemple lorsqu'il y a un nombre de paramètres différent de 3 ?

Pour info,
J'ai fait une fonction qui exécute une liste de requêtes avec PDO en utilisant les transactions, et au moindre petit problème ou warning, elle fait un rollback, sinon, commit. Elle me retourne les résultats sous différentes formes en fonction des paramètres d'entrée : chaine de caractère, tableau représentant une ligne ou colonne, tableau à 2 dimensions, nombre de lignes affectées pour chaque requêtes.
Mais là, rien à dire, c'est pratique, ça marche très bien et je m'en sers tout le temps.

Je suis assez à l'aise en PHP, mais là, je vois pas trop comment faire

Hors ligne

#7 Le 01/12/2013, à 19:36

kleer

Re : [Résolu] PHP : executer du code sous forme de chaine de caractère

La solution m'est venue en écrivant mon dernier commentaire :

<?php

    function f_2_params($str1, $str2)
    {
        // Fonction à 2 paramètres
        return $str1 . $str2;
    }

    function f_3_params($str1, $str2, $str3)
    {
        // Fonction à 3 paramètres
        return $str1 . $str2 . $str3;
    }

    function exec_func($func_name, $array_params)
    {
        // Fonction qui execute une fonction avec son nom et les paramètres en tableau

        // Paramètres qui vont être passés à la fonction
        $func_params = array();

        // Nombre de paramètres passés à cette fonction
        $nb_params = count($array_params);

        // Compteur de paramètre
        $ct = 0;

        // Max paramètres
        $ct_max = 10;
        while($ct < $nb_params)
        {
            // Début de remplissage du tableau
            $func_params[$ct] = $array_params[$ct];
            $ct = $ct + 1;
        }
        while($ct <= $ct_max)
        {
            // Comblage du reste du tableau avec NULL
            $func_params[$ct] = NULL;
            $ct = $ct + 1;
        }

        // Execution avec les paramètres
        return $func_name   (
                                $func_params[0],
                                $func_params[1],
                                $func_params[2],
                                $func_params[3],
                                $func_params[4],
                                $func_params[5],
                                $func_params[6],
                                $func_params[7],
                                $func_params[8],
                                $func_params[9],
                                $func_params[10]
                            );
    }

    echo exec_func("f_2_params", array("chaine1", "chaine2<br/>"));
    echo exec_func("f_3_params", array("chaine1", "chaine2", "chaine3<br/>"));

?>

Ca marche, ça affiche

chaine1chaine2
chaine1chaine2chaine3

sans faire d'erreurs.

Je ne pense pas que le retour de fonction avec chaque indice du tableau de 0 à 10 soit simplifiable
Maintenant, j'ai la solution, exec_func() appellera $func_name avec dans tous les cas $ct_max paramètres
Ca marche car php accepte que l'on passe plus de paramètres à une fonction que ce dont elle a vraiment besoin, le reste est ignoré.

Avec eval(), je voulais faire quelque chose du genre

<?php

    $func_name = "f_2_params";
    $str1 = "aze";
    $str2 = "rty";
    $str_exec = $func_name . "(" . "\$str1" . ",\$str2" . ");";
    echo eval($str_exec);
   
?>

Mais ça n'affiche rien : le retour de eval() vaut NULL

Je pense que c'est bon, et merci d'avoir voulu m'aider !

Hors ligne