Errori con modello di PHP di base utilizzando eval ()
-
19-09-2019 - |
Domanda
Sono quasi pronto a piangere. Ho letto la pagina del manuale php.net, provato una dozzina di ricerche di Google con varie frasi, e scansionato centinaia di fili StackOverflow. Ho visto questo metodo in uso, ma semplicemente non funziona per me. Sembra così semplice. Ho un paio di domande relative o problemi non so come trovare le risposte a.
La parte importante del file PHP è simile al seguente:
switch() {
…other cases…
default:
$tpl['title'] = "Newsletter Signup";
$tpl['description'] = "Newsletter description";
$tpl['page-content'] = file_get_contents('signup.html');
}
$tpl_src = addslashes(file_get_contents('index.tpl'));
eval("\$html = \"$tpl_src\";");
echo $html;
Il mio file index.tpl include le linee come questi:
<title>{$tpl['title']}</title>
<meta name="description" content="{$tpl['description']}" />
nav, etc…
<div id="main-content"> {$tpl['page-content']} </div>
Mi piace come ordinato e pulito il codice è, senza un sacco di <?=…?>
di più.
In primo luogo, quando parentesi graffe {} vengono visualizzati in una stringa, che cosa è che ha chiamato? Potrei essere in grado di guardare in su e imparare a usarli se conoscevo.
Avanti, questo proprio non funziona affatto. Se rimuovo le singole citazioni dai tasti variabili, è buono, ma php.net dice che si dovrebbe mai farlo nel caso in cui il mio nome diventa un linguaggio costante ad un certo punto. Giusto. Ma come faccio a risolvere questo problema? Mi piace usare un array per le Vars nel caso in cui voglio costruire una subroutine evalTemplate e posso solo passare $ tpl ad esso.
Infine, $ tpl [ 'page-content'] non stampare. La variabile è impostata bene; Posso usare echo $tpl['page-content']
per testare, ma sembra come una singola riga vuota nel codice HTML finale.
Sono sicuro che c'è solo qualche aspetto della lingua che non so ancora. Ogni aiuto è molto apprezzato !!
Soluzione
Come Volker ha sottolineato, addslashes
sembra essere un problema. Prova addcslashes
invece. Inoltre, mi piacerebbe vivamente rendendo questa una funzione, per semplificare la sanificazione / analisi:
function render ($file, $vars)
{
// .. extra sanitisation, validation, et al.
$_html = '';
$_raw_file = addcslashes (file_get_contents ($file), '"\\');
extract ($vars, EXTR_SKIP);
eval ('$_html = "'.$_raw_file.'"');
return $_html;
}
E chiamato così:
switch() {
// …other cases…
default:
$tpl['title'] = "Newsletter Signup";
$tpl['description'] = "Newsletter description";
$tpl['page-content'] = render ('signup.html');
}
echo render ('index.tpl', $tpl);
PS: L'uso di extract
sopra significa che le Vars saranno semplicemente $title
, non $tpl['title']
, ecc
Altri suggerimenti
Di solito non si utilizzano le '' delimitatori di stringa nella stringa di espansione variabile. Cioè "$tpl[content]"
invece di "$tpl['content']"
.
Per quanto riguarda le bretelle, delimitano variabile, quando i personaggi identificatore può venire direttamente prima o dopo il nome. Ad esempio:
$item = "Cup";
$text = "I smashed four $items"; // won't work
$text = "I smashed four {$item}s"; // will work.
// 2nd output: "I smashed four Cups"
addslashes () aggiunge le barre prima di entrambe le virgolette doppie single o all'interno della stringa. Il codice generato per il vostro esempio potrebbe essere
$html = "<title>{$tpl[\'title\']}</title>
<meta name=\"description\" content=\"{$tpl[\'description\']}\" />
nav, etc…¦
<div id=\"main-content\"> {$tpl[\'page-content\']} </div>";
E {$ tpl [ \ 'titolo \ ']} non analizza bene.