2010-06-14 5 views
3

Je veux stocker le code php dans ma base de données et ensuite l'utiliser dans mon script.Comment injecter le code php de la base de données dans le script php?

class A { 
    public function getName() { 
     return "lux"; 
    } 
} 
// instantiates a new A 
$a = new A(); 

Dans ma base de données contient des données comme

"hello {$a->getName()}, how are you ?" 

Dans mon code php je charger les données dans une variable $ string

$string = load_data_from_db(); 
echo $string; // echoes hello {$a->getName()}, how are you ? 

Alors maintenant $ string contient « bonjour {$ a-> getName()}, comment allez-vous? "

{$ a-> getName()} étant toujours non interpretated

Question: Je ne peux pas trouver comment écrire le reste du code de sorte que {$ a-> getName()} obtient interpretated "en bonjour lux, comment allez-vous". Quelqu'un peut-il aider?

$new_string = ?????? 
echo $new_string; //echoes hello lux, how are you ? 

Existe-t-il une solution avec eval()? (s'il vous plaît pas de débat sur l'évaluation du mal;)) Ou toute autre solution?

+3

Vous ne savez pas pourquoi vous voulez uld faire cela, semble être une mauvaise pratique/codage –

+2

D'accord, une pratique hideuse et inefficace. – DRL

+1

Je ne pense pas que ce soit aussi mauvais que vous les gens semblent croire. On dirait que les données qu'il développe sont juste un modèle d'email ou quelque chose de similaire.Il y a peut-être de meilleures façons de le faire, mais il n'est pas très pragmatique. De toute façon, la réponse d'Oezi semble être pratique et correcte. – Kris

Répondre

3

un coup d'oeil à eval() - c'est ce que vous cherchez (mais je suis d'accord avec Phill, cela ressemble à une mauvaise pratique)

EDIT: juste vu que vous savez eval - alors pourquoi ne pas le faire:

eval('$string = "'.load_data_from_db().'";'); 

(ont pas testé, mais je suis presque sûr qu'il fonctionne)

+0

Parce que hum ... Je faisais une faute de frappe et ne pouvais pas le faire fonctionner: p Merci beaucoup :) –

0

vous pouvez l'enregistrer dans un fichier temporaire comme temp.file puis faire une include('temp.file');

+0

Cela peut fonctionner aussi, merci. Dans mon cas, la solution oezi est plus adaptée –

+0

bienvenue, je ne vais pas argumenter contre 'eval' dans un environnement sécurisé, mais je vais chercher et proposer des options non-eval. – Rixius

0

Une base de données est utilisée pour stocker des données NOT code. Vous devriez rendre votre code dynamique pour lire les données de l'entrée de base de données/utilisateur, mais le stockage de code dans une base de données n'est pas recommandé. Pourquoi ne pas stocker la valeur "lux" dans une table de base de données.

Essayez cette façon:

class A { 
    private $name; 

    public function getName() { 
     return $this->name; 
    } 

    public function setName($name) { 
     $this->name = $name; 
    } 
} 
// Query DB 
// Don't know your query so just using what you have 
$passed_name = load_data_from_db(); // This would return "lux" 

// instantiates a new A 
$a = new A(); 
$a->setName($passed_name); 
echo "hello ".$a->getName().", how are you ?<br />\n"; 
+0

Merci. En fait, dans mon cas, les données du code php IS sont donc stockées dans ma base de données. Il doit être dynamique afin que je puisse injecter à l'intérieur de ce "modèle de code" toutes les données de mon environnement d'exécution php. –

+0

hmm si les données sont CODE, alors pourquoi avez-vous besoin de l'exécuter? –

+0

Phill, je viens de vous répondre sur les commentaires principaux –

3

On dirait que vous essayez de faire quelque chose comme des chaînes multilangues.

Il y a une approche astucieuse utilisant sprintf

intérieur DB vous mettez

"hello %s, how are you ?" 

et dans votre code php vous

$string = load_data_from_db(); 
echo sprintf($string,$a->getName()); // replaces %s with the function value. 

la partie changeant ($ a-> getName()) devrait provenir de la base de données aussi, mais avec une requête séparée (peut-être en classe A)

+0

Merci pour votre solution. Cela fonctionne dans l'exemple que j'ai donné mais dans mon cas réel, il ne fonctionne pas parce que j'ai des espaces réservés inconnus dans un ordre inconnu. J'aurais dû être plus précis. La solution doit être complètement dynamique et injecter quelque chose de mon environnement d'exécution actuel –

Questions connexes