2012-09-03 38 views
1

我有2種存儲頁面的方法。第一個很簡單,將其存儲在一個文件中。第二個是將它存儲在我遇到問題的數據庫中。
整個「系統」基於一個「引擎」,它通過將頁面注入HTML模板來輸出頁面。簡單來說:代碼必須在到達引擎之前執行。希望這會使一些代碼更有意義。
page.class.php執行存儲在數據庫中的PHP代碼

... 
// Page was found in the database 
      $this->name = $pageVariables['name']; 
      $this->requiredAuth = $pageVariables['requiredAuth']; 
      if ($parsed) { 
       ob_start(); 
       echo $pageVariables['content']; 
       $this->contents = ob_get_clean(); 
       var_dump($this->contents); 
      } else { 
       $this->contents = $pageVariables['content']; 
      } 
... 
// File exists on the system, load it 
       $fileContents = file_get_contents($this->url); 
       if ($parsed) { 
        ob_start(); 
        include($this->url); 
        $this->contents = ob_get_clean(); 
var_dump($this-contents); 
        if (isset($pageName)) { 
         $this->name = $pageName; 
        } 
        if (isset($requiredAuth)) { 
         $this->requiredAuth = $requiredAuth; 
        } 
        if (isset($useEngine)) { 
         $this->useEngine = $useEngine; 
        } 
       } else { 
        $this->contents = $fileContents; 
       } 

if ($parsed) {...}有如此的頁面可以獲取的未解析進行編輯。
顯然這是一個減少版本,但我希望顯示足夠。
如果我從數據庫中加載一個頁面的代碼

Hello World<br> 
<?php echo 'Hello World'; ?> 

輸出我得到的是

Hello World<br> 
<?php echo 'Hello World'; ?> 

然而,存儲在文件輸出

Hello World 
    Hello World 

我相同的代碼嘗試使用eval(),但這隻會評估PHP代碼,並且在包含HTML/PHP混合時失敗。
也許有更好的方法來解決這個問題(存儲它,執行等),但這是我目前看到的問題。

+0

就我所知,'eval'適用於HTML/PHP。 –

回答

4

您可以使用PHP's eval來運行存儲在數據庫中的代碼。

$code = get_code_from_db(); 
eval($code); // will evaluate (run) code stored in $code variable 

雖然小心點。 eval是一個需要仔細對待的功能。如果您不考慮存儲代碼的含義,它可能是錯誤,安全漏洞的根源,您將其命名。

+0

由於你提到的原因,我希望不要使用'eval()',但即使如此,它也不適用於我:'解析錯誤:語法錯誤,/var/www/cms/includes/page.class中意外的T_STRING .php(71):線1上的eval()'d代碼' –

+0

這不起作用,因爲您的數據庫中可能存儲了SYNTAX ERROR。您將需要'eval'來運行PHP代碼。否則你將無法做到這一點。除非您採用VEEEERY DIFFERENT方法。 (即在數據庫中使用模板並在PHP上解析/處理它們,而不是PHP直接編輯) –

+0

編輯:如果我在開始處添加'?>''',它就可以工作,這不是什麼大問題。我使用的代碼在數據庫和文件中是一樣的:'Hello World
<?php echo'Hello World'; ?'',但是如果代碼是'echo'Hello World';',使用'eval()'似乎只能工作。我想我將不得不看看任何替代品。 –

1

小心eval,this is a good post on why

更好的解決方案是將頁面模板存儲在數據庫中,然後在PHP中安全地解析它們。

相關問題