什么是使用PHP从数据库输出数据的最佳方法?

时间:2009-08-14 20:45:26

标签: php mysql html oop

我是php的新手,我正在使用mysql数据库进行项目。该项目由能够撰写帖子的用户组成,然后以列表格式显示。问题是,帖子显示在网站的不同位置,如索引(主)页面和用户个人资料页面。如果你感到困惑,就像推特一样。我的问题是,显示帖子的最佳方式是什么?目前我正在使用我创建的课程。它具有从数据库中检索帖子的功能,将它们全部保存在多维数组中。然后,该类中的另一个函数使用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格式化的用户配置文件。 posts类具有返回已在HTML列表中格式化的确定数量的帖子的功能。

我应该把所有课程都保留在课堂上,还是有更好的方法?

谢谢

5 个答案:

答案 0 :(得分:1)

好吧,如果你没有使用某种类型的MVC框架,那么我会说拥有输出HTML的函数不会杀死任何人。

然而,一般来说,将HTML与逻辑分离是有帮助的,这通常是通过创建HTML模板和散布PHP的模板片段来完成的。像这样:

<div>
    <h1><?php echo $title; ?></h1>
</div>

然后,您可以设置$title变量(和其他),并include('title_fragment.php')输出该位的HTML。您可以扩展它以使用整个页面,使其只需处理传递给模板的少量数据。

当需要更改页面布局或外观时,您不必通过代码查找生成的HTML的位...您可以直接转到模板文件。

答案 1 :(得分:1)

这对于可维护设计和代码非常重要,并且以后可以更轻松地生成其他输出类型。

使用PHP,用于分离两者的最简单的库之一是Smarty模板。使用Smarty(或任何其他模板库),您可以编写带有布局和一些简单循环或其他构造的HTML文件,然后使用数据结构渲染该模板。至少,我会建议改变你的课程以利用模板并以这种方式产生输出,而不是用一堆带来的 print echo 语句。其中包含HTML。

我甚至回避@ zombat在HTML片段中的echo语句解决方案,它们很快变得难看。

示例Smarty模板,以实现您想要的东西:

{section name=i loop=$posts}
   <li>{$posts[i].author} &mdash; {$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模板轻松更改输出的显示方式,而无需担心触摸任何代码来更改输出。

答案 2 :(得分:0)

理想情况下,您的课程应仅提供数据。使用另一个PHP文件或通用类来输出HTML,以后您可以输出例如来自同一数据类的XML,JSON等。这将您的数据处理(模型/控制器)与数据表示(视图)分开。

我不同意使用像Smarty这样的模板引擎。 PHP 模板引擎。

答案 3 :(得分:0)

您可以使用输出缓冲。它有助于构建模板,而不是被迫按显示顺序处理数据。

<?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/en/book.outcontrol.php

享受!

答案 4 :(得分:0)

我根本不熟悉Smarty ......究竟是如何工作的,以及使用smarty与仅创建函数来获取大量数据并返回包含该数据的html以便稍后回应的好处是什么? ?