2011-11-15 42 views
0

我期望將我自己的自定義CMS作爲個人學習項目進行開發,並可能在工作中使用此項目。對於大多數其他CMS如何將他們的魔力加載到佈局中,除了他們的內容之外,我對此非常瞭解。將內容放入作爲字符串從數據庫加載的佈局中

我想做什麼就能做的是存儲HTML/PHP在我的數據庫類型的文本佈局。佈局將有一行php,如this->content();,我想要加載內容。由於佈局來自數據庫,我不能簡單地使用php的include();加載頁面並執行php,它將作爲字符串加載。

所以我的問題是,我怎樣才能從數據庫裝載這個HTML/PHP字符串和不使用危險eval();調用執行PHP。

我會把自己當作一個新手/ PHP高級用戶,遠離主,所以如果我已經在這個問題上,意見有任何錯誤,我會編輯。

感謝所有

+2

從我在Wordpress,Drupal和Joomla!中看到的大部分內容,這些CMS都沒有在數據庫中存儲它們的** PHP代碼**,只是內容。您將擁有將內容加載到數據庫中的模板文件。 – mmundiff

+0

爲什麼你想要將模板或任何html/php代碼存儲在數據庫中?我不明白這對創建CMS是如何非常有用的。如果你堅持這種方法,我想你可以拉動字符串並將其保存爲一個帶有php擴展名的臨時文件,將其包含在內,然後刪除該文件。但我仍然看不到這對您的總體目標有用或有幫助。 – mason81

+1

你的做法是錯誤的和危險的。你會暴露自己的問題和攻擊的基礎上使用'eval()'這將是必要的從數據庫字符串中繪製PHP。 KISS - 保持簡單,愚蠢。你這樣做是爲了學習,所以從小做起,做大。探索WordPress的,Drupal的,Joomla ...這些都是不好的例子 - 他們試圖成爲每個人的一切,最終臃腫。自定義CMS應該專注於您的需求。 – stslavik

回答

0

Include真的不應該被用來加載內容,但含有其他文件的功能...

如果內容簡單地從數據庫中來了,爲什麼不直接查詢的輸出,將該值存儲到變量中,並使用print($var)

一個基本的CMS將其文章存儲在數據庫中,其ID可能是標題字符串和內容。內容是print編輯爲div或某個其他作爲容器的塊元素。它周圍的佈局只是某種模板 - 一個帶有內容標記的html頁面。

您可以通過管理控制檯添加內容,通常有至少管理的文章,編輯文章,併發布新文章的地方。這個區域應該有密碼保護。

所以我們可以說你已經有了一個URI /articles/1/How-Grinch-Stole-Thanksgiving(使用URL重寫引擎優化的目的),模板的基本排序可能是這樣的:

<body> 
    <div id="container"> 
    <?php 
     $uri = substr($_SERVER['REQUEST_URI'], 1); //Gives us articles/1/How-Grinch-Stole-Thanksgiving 
     $components = explode('/', $uri); // $components[0] is "articles", $components[1] is 1, etc. 

     /* Do SQL Query here: "SELECT * FROM '".$components[0]."' WHERE 'id'=".$components[1] */ 
     $conn = mysql_connect("localhost", "mysql_user", "mysql_password"); 
     if (!$conn) { 
     echo "Unable to connect to DB: " . mysql_error(); 
     exit; 
     } 
     if (!mysql_select_db("mydbname")) { 
     echo "Unable to select mydbname: " . mysql_error(); 
     exit; 
     } 
     $sql = "SELECT * FROM '".$components[0]."' WHERE 'id'=".$components[1]; 
     $result = mysql_query($sql); 
     if (!$result) { 
     echo "Could not successfully run query ($sql) from DB: " . mysql_error(); 
     exit; 
     } 
     if (mysql_num_rows($result) != 1) { 
     echo "Improper result. Exiting"; 
     exit; 
     } 
     $row = mysql_fetch_assoc($result); 
     print($row["content"]); 
    ?> 
    </div> 
</body> 

這是非常簡陋的;你不可能在這類劇本上走得太遠。關鍵是你應該開始探索這種類型的CMS,其中索引從$_GET值中取出替換線索,以便您能夠意識到頁面是如何結合在一起的。稍後,您可以閱讀模板並將它們組裝成頁面,並用數據庫或其他模板中的內容替換標記。

相關問題