[英]Whats the best way to output data from a database using php?
我對php比較陌生,並且正在使用mysql數據庫進行項目開發。 該項目由能夠撰寫帖子的用戶組成,這些帖子然后以列表格式顯示。 問題是,帖子顯示在網站上的不同位置,例如索引(主)頁面和用戶個人資料頁面。 如果您感到困惑,類似於Twitter。 我的問題是,顯示帖子的最佳方法是什么? 目前,我正在使用自己創建的類。 它具有從數據庫檢索帖子,並將它們全部保存在多維數組中的功能。 然后,該類中的另一個函數使用foreach
格式化整個列表,然后返回格式化的HTML列表。 我要做的就是回顯返回的內容。 但是我在某處讀到,編寫輸出HTML的函數(尤其是類函數)是一種不好的做法。 什么是最好的方法,而不必在顯示帖子的每個頁面上重寫相同的代碼。 在函數中使用HTML是否真的是不好的做法?
示例...個人資料頁面如下所示。
<
require('class.php');
require('header.php');
$profile = new Profile();
$userProfile = $profile->GetUserProfile($userID);
echo $userProfile;
$class = new Posts();
$posts = $class->GetUserPosts($userID);
echo $posts;
require('footer.php');
?>
而且主頁看起來像這樣
<
$class = new Posts();
$posts = $class->GetAllPosts();
echo $posts;
?>
其中,配置文件類將使用用戶ID並輸出已經以HTML格式設置的用戶配置文件。 帖子類具有返回確定數量的已在HTML列表中格式化的帖子的功能。
我應該將所有內容都保留在課堂上,還是有更好的方法?
謝謝
好吧,如果您不使用某種MVC框架,那么我想說擁有輸出HTML的函數不會殺死任何人。
但是,通常,將HTML與邏輯分離是有幫助的,通常這是通過使用散置的PHP創建HTML模板和模板片段來完成的。 像這樣:
<div>
<h1><?php echo $title; ?></h1>
</div>
然后,您可以設置$title
變量(和其他變量),並include('title_fragment.php')
以輸出該HTML代碼。 您可以將其擴展為與整個頁面一起使用,從而使您的代碼僅需要處理傳遞到模板的少量數據。
當需要更改頁面布局或外觀時,您不必遍歷代碼即可查找生成的HTML的位...您可以直接進入模板文件。
這對於可維護的設計和代碼都很重要,並且使以后更容易生成其他輸出類型。
使用PHP,將兩者分開的最簡單的庫之一是Smarty模板。 使用Smarty(或任何其他模板庫),您可以編寫具有布局和一些簡單循環或其他構造的HTML文件,然后使用數據結構呈現該模板。 至少,我建議更改您的類以利用模板並以這種方式產生輸出,而不是在打印或echo語句中混入一堆HTML的方式混雜在一起。
我什至避開@zombat的HTML片段中的echo語句解決方案,它們很快變得丑陋。
示例Smarty模板可實現所需的功能:
{section name=i loop=$posts}
<li>{$posts[i].author} — {$post[i].text}</li>
{/section}
還有一些PHP支持代碼:
// Instantiate Smarty object
$smarty = new Smarty();
// Assign a hash of data
$smarty->assign('posts', array(
array('author' => 'Jim', 'text' => 'Hi this is my post!'),
array('author' => 'Sally', 'text' => 'My first post to the system')
)
);
// Use the file with the above template in it
$smarty->display('posts.html');
將數據分配給模板的部分可能應該通過某種編程方式完成,以將您的類對象列表轉換為哈希列表。
這樣,您只需編輯HTML模板即可輕松更改輸出的外觀,而無需擔心觸摸任何代碼即可更改輸出。
理想情況下,您的班級應該只提供數據。 使用另一個PHP文件或通用類輸出HTML,因此稍后您可以從同一數據類中輸出XML,JSON等。 這樣可以將數據處理(模型/控制器)與數據表示形式(視圖)分開。
我不同意使用像Smarty這樣的模板引擎。 PHP 是模板引擎。
您可以使用輸出緩沖。 這有助於構建模板,而不會被迫按顯示順序處理數據。
<?php
$posts = take_data_from_class();
ob_start();
require_once('path/to/posts.php');
$html_posts = ob_get_clean();
// you can do the same with other parts like header or footer
ob_start();
require_once('path/to/header.php');
$header = ob_get_clean();
ob_start();
require_once('path/to/footer.php');
$footer = ob_get_clean();
?>
在posts.php中,您可以顯示帖子:
<? foreach ($posts as $p) { ?>
<div class="...">
post data here
</div>
<? } ?>
現在,要顯示整個內容:
<?php echo $header . $html_posts . $footer; ?>
有關更多信息,請訪問http://us3.php.net/manual/zh/book.outcontrol.php
請享用!
我完全不熟悉Smarty ...這是如何工作的,使用smarty與僅創建函數以獲取大量數據並返回包含該數據的html以便稍后回顯相比有什么好處?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.