如何只显示数据库中表格中的某些行?

时间:2012-05-16 12:58:06

标签: php mysql zend-framework forum

我正在使用Zend Framework和phpMyAdmin(MySQL)在PHP中创建留言板。我是Zend Framework的初学者,并且在PHP方面做得不多,所以请在答案中尽可能简单。

我在数据库中保存了留言板的结构(部分,部分和部分下部)。我需要显示论坛的各个部分及其相应的underSections。问题是 - 如何在其下显示特定部分的下部分?

IndexController.php

 public function indexAction()
{
    $sections = new Model_Sections();
    $this->view->sections = $sections->fetchAll();

    $undersections = new Model_Undersections();
    $this->view->undersections = $undersections->fetchAll();
}

在这段代码中,我获取了所有的节和音调数据(id& name)。

数据库模型Section.php

class Model_Sections extends Zend_Db_Table_Abstract
{
    protected $_name = 'sections';
}

数据库模型Undersection.php

class Model_Undersections extends Zend_Db_Table_Abstract
{
    protected $_name = 'undersections';
}

关于数据输出的主视图“index.phtml”中的片段:

<div class="section">
   <?php foreach($this->sections as $sections) : ?>

   <!-- Generates names of sections -->
   <h1><?php echo $this->escape($sections->section_name);?></h1>

      <!-- Generates names of undersections -->
      <?php foreach($this->undersections as $undersections) : ?>
         <div class="underSection">
            <h2>
              <a href=" ***link to some controller according to the undersection*** ">
                 <?php echo $this->escape($undersections->undersection_name);?>
              </a>
            </h2>
         </div>
      <?php endforeach; ?>
   <?php endforeach; ?>
 </div>

目前它显示每个部分下的所有下方。

2 个答案:

答案 0 :(得分:1)

您的代码当前显示每个部分下的所有底部的原因是因为您使用嵌套的for循环,其中内部循环始终相同。即你总是在同一个反射集合上迭代。您需要为部分和副部分定义一种方式,以建立父子关系。

以下是我粗略构建它的方法:

数据库结构(表名:部分):

id INT NOT NULL AUTO_INCREMENT
parentId INT DEFAULT 0
section_name TINYTEXT

因此所有部分的数据将存在于同一个数据库表中。插入顶级部分时,只需保留parentId列= 0.插入底部时,将插入父节的id值。

我还会更改您的模型,以便您没有Model_Section和Model_Undersection。相反,在Model_Section类中有一个函数,例如, getChildren()将返回属于该特定Model_Section实例的所有部分的集合。

控制器操作:

public function indexAction()
{
    $sections = new Model_Sections();
    $this->view->sections = $sections->fetchAll();
}

查看脚本:

<div class="section">
   <?php foreach($this->sections as $sections) : ?>

   <!-- Generates names of sections -->
   <h1><?php echo $this->escape($sections->section_name);?></h1>

      <!-- Generates names of undersections -->
      <?php foreach($sections->getChildren() as $undersections) : ?>
         <div class="underSection">
            <h2>
              <a href=" ***link to some controller according to the undersection*** ">
                 <?php echo $this->escape($undersections->section_name);?>
              </a>
            </h2>
         </div>
      <?php endforeach; ?>
   <?php endforeach; ?>
 </div>

请注意使用$ sections-&gt; getChildren()而不是$ this-&gt; undersections的更改

您从中获得的最大好处是您的模型现在完全递归。你的断言可以有自己的子节,依此类推。

答案 1 :(得分:1)

您应该设置要选择的列:

class Model_Sections extends Zend_Db_Table_Abstract
{
    protected $_name = 'sections';
    public function getSections()
    {
        $select = $this->select()
            ->from($this->_name, array('col1', 'col2')); // set your columns
        return $this->fetchAll($select);
    }
}

在控制器中:

$sections = new Model_Sections();
$this->view->sections = $sections->getSections();