#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) 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
Pour l'instant ça fonctionne en localhost, donc tu ne pourra pas essayer
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 :
<?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