Eval kullanarak temel PHP şablonla Hatalar ()

3 Cevap php

Ben hemen hazır ağlamaya değilim. Ben, php.net manuel sayfasını okumak Google çeşitli ifadeler ile arama bir düzine çalıştı ve stackoverflow parçacığı yüzlerce taranmış var. Ben kullanımında bu yöntemi gördük, ama bu sadece benim için çalışmıyor. O kadar basit görünüyor. Ben cevap bulmak için nasıl bilmiyorum bir çift ile ilgili bir soru ya da sorunları var.

PHP dosyasının önemli bir bölümü bu gibi görünüyor:

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;

Benim index.tpl dosyası, bu gibi çizgiler içerir:

<title>{$tpl['title']}</title>
<meta name="description" content="{$tpl['description']}" />
nav, etc…
<div id="main-content"> {$tpl['page-content']} </div>

Ben kod ekstra <?=…?> 's bir sürü olmadan, nasıl düzgün ve temiz gibi.

Kıvırcık parantez {} bir dize görünür Birincisi, o ne denir? Ben bu kadar bakmak ve ben bilsem bunları nasıl kullanacağınızı öğrenmek mümkün olabilir.

Sonra, bu sadece hiç çalışmıyor. Ben değişken tuşları tek tırnak kaldırırsanız, bu iyi, ama php.net sen durumda benim adım noktada bir dil sabit olur bunu asla gerektiğini söyledi. Yeterince adil. Ama ben bunu nasıl düzeltebilirim? Ben bir evalTemplate değişmeze inşa etmek ve sadece ona $ TPL geçebilir istediğiniz durumda vars için bir dizi kullanarak gibi.

Son olarak, $ tpl ['page-content'] yazdırmak değil. Değişken tamam ayarlanır; I echo $tpl['page-content'] sınamak için kullanabilirsiniz, ancak bu son HTML tek bir boş satır olarak görünür.

Ben henüz bilmiyorum dilin sadece bazı yönü var eminim. Herhangi bir yardım çok takdir!

3 Cevap

Volker işaret ettiği gibi, addslashes bir sorun gibi görünüyor. Try addcslashes yerine. Ayrıca, güçlü sanitisation / ayrıştırma basitleştirmek için, bu bir işlev yapma tavsiye ederim:

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;
}

Ve böylece adı:

switch() {
// …other cases…
default:
  $tpl['title'] = "Newsletter Signup";
  $tpl['description'] = "Newsletter description";
  $tpl['page-content'] = render ('signup.html');
}

echo render ('index.tpl', $tpl);

Not: kullanılması extract üstünde değişkenler sadece $title değil, $tpl['title'], vb olacağı anlamına gelir

Genellikle string değişken genişleme'' dize sınırlayıcı kullanmayın. Yani "$tpl[content]" yerine "$tpl['content']".

Tanımlayıcı karakterleri adından önce veya sonra düz gelebilir zaman parantez olarak gelince, onlar değişken en sınırlandırmak. Örneğin:

$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() adds slashes before both single- and double-quotes within the string. The code generated for your example would be

$html = "<title>{$tpl[\'title\']}</title>
<meta name=\"description\" content=\"{$tpl[\'description\']}\" />
nav, etc…¦
<div id=\"main-content\"> {$tpl[\'page-content\']} </div>";

Ve {$ tpl [\ 'title \']} iyi ayrıştırmak değildir.