Php 将sql结果传递给视图硬代码视图传递给数据库列名

Php 将sql结果传递给视图硬代码视图传递给数据库列名,php,python,model-view-controller,Php,Python,Model View Controller,我刚刚意识到我可能没有遵循MVC模式的最佳实践 我的问题是,我的视图“知道”有关数据库的信息 这是我在psuedo代码中的情况 我的控制器从模型中调用一个方法,并将其直接传递给视图 view.records = tableGateway.getRecords() // gets array of records view.display() 在我看来 each records as record print record.name print record.address

我刚刚意识到我可能没有遵循MVC模式的最佳实践

我的问题是,我的视图“知道”有关数据库的信息

这是我在psuedo代码中的情况

我的控制器从模型中调用一个方法,并将其直接传递给视图

view.records = tableGateway.getRecords() // gets array of records
view.display()
在我看来

each records as record
    print record.name
    print record.address
    ...
在我看来,我有记录。姓名和记录。地址,这些信息硬编码到我的数据库中。这不好吗

除了迭代控制器中的所有内容并基本上重写记录集合之外,还有什么其他方法可以解决这个问题呢。这看起来很傻

谢谢
编辑
这是一个真实的观点

<?php foreach( $categories as $category ): ?>
    <tr>
        <td><?php echo $category['name'] ?> </td>
        <td><?php echo $category['fields'] ?> </td>
        <td><?php echo $category['records'] ?></td>
        <td><a href="/category/view/<?php echo $category['id'] ?>/<?php echo url::title( $category['name'] ) ?>/">View</a></td>
    </tr>
<?php endforeach; ?>

因此,通过数据进行简单的循环是行不通的,我需要在视图中捕获sql结果的某些字段


有办法解决这个问题吗?这让我觉得很肮脏。

如果你需要快速而肮脏的信息,我想说,将这些信息硬编码也不错

但请考虑使用泛型类查看视图,该方法从DB中获取数据,并使用一些数组来描述要使用哪些列。然后在子类(UserView、PostView、WhateverTableNameView)中,您可以使用包含“Name”、“Address”等的数组调用此基本方法

如果我说的是Python的胡言乱语,请原谅,我是从PHP标签中找到这个问题的;)差不多是这样

class BaseView {
   public function display(& $data, array $columnNames) {
      foreach($data as $row) {
         foreach($columnNames as $c) {
            echo $row->$c; // or $row[$c] or whatever your data is, I'm assuming objects
         }
      echo "\n";
   }
}

class UserView extends BaseView{
    public function display(& $data) {
        parent::display($data, array('Name', 'Address');
    }
}
这里的好东西:

  • 还需要一个专栏吗?确保查询它,然后在UserView中修改1行
  • 需要有HTML列标签(东西)的文本-它已经在这里了
  • $data可以是资源描述符(想想while($rs.nextRow()),而不一定是完整的数组,这可能会占用大量内存,并需要时间从一个函数传递到另一个函数
  • 若您在这些记录周围寻找美观的HTML表,那个么整个应用程序都有统一的外观,因为只有一个地方可以定义它们

如果出于某种原因,您对此不感兴趣,那么真正通用的解决方案是使用索引而不是列名$数据[$i][0]、$data[$i][1]等。。。大多数数据库API都提供了以名称、数字或两者兼有的形式查询列的可能性。有关PHP+MySQL,请参见上的示例

但这迟早会让你陷入a$$的困境,因为你会丢失元数据信息。假设您希望稍后将您的“姓名”包装成链接:

echo '<a href="user/',$record['id'],'">',$record['name'],'</a>';
echo';

祝您好运,在没有列名的情况下以可重用的方式完成此操作…

使用getter/setter和一段代码将记录字段映射到它们,您可以删除此操作,但会增加一些复杂性

真正的问题是:我需要重命名字段名吗


通过一些规划/思考/反馈,应该不难为应用程序生命周期内的字段找到合适的名称。但是,如果字段的语义发生变化,则应添加一个新字段。这还有一个好处,就是您可以清楚地记录对它的反对,并引导程序员使用新的。

我实际上在使用kohana。我不知道这个问题的语言,希望得到更多的回答。很明显,它不起作用。我更新了我的问题…谢谢我不知道科哈纳但是。。。我的意思是要有一个助手函数,它将获取数据源和第二个参数,并提示应该显示源的哪些元素。看起来有点“脏”。我开始认为可能没有一个“干净”的方法来做这件事。