php - 将 sql 结果传递给 View 将 View 硬编码为数据库列名称

标签 php python model-view-controller

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

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

这是我在伪代码中的情况...

我的 Controller 调用模型中的方法并将其直接传递到 View

view.records = tableGateway.getRecords() // gets array of records
view.display()

在我看来

each records as record
    print record.name
    print record.address
    ...

在我看来,我有记录。名称和记录。地址,这些信息硬编码到我的数据库中。这很糟糕吗?

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

谢谢

<小时/> 编辑 <小时/> 这是实际 View

<?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; ?>

所以简单的数据循环是行不通的,我需要在我的 View 中捕获sql结果的某些字段。

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

最佳答案

我想说,如果您需要快速而肮脏的信息,那么将此类信息硬编码也不错。

但是请考虑为 View 提供通用类,该类具有从数据库获取数据的方法和一些描述要使用哪些列的数组。然后在子类(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 表格,那么您可以在整个应用程序中获得统一的外观和感觉,因为只有一个位置可以定义它们。
<小时/>

如果由于某种原因这对您不感兴趣,真正通用的解决方案是使用索引而不是列名。 $data[$i][0]、$data[$i][1] 等等...大多数数据库 API 都提供了以名称、数字或两者的形式查询列的可能性。对于 PHP + MySQL,请参阅 http://www.php.net/manual/en/function.mysql-fetch-array.php 上的示例

但这迟早会咬你一口,因为你会丢失元数据信息。假设您稍后想要将您的“名称”包装到链接中:

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

祝你好运,以可重用的方式完成此操作,无需列名...

关于php - 将 sql 结果传递给 View 将 View 硬编码为数据库列名称,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657336/

相关文章:

php - 解析大 JSON 文件并使用 php 插入数据库的最佳方法是什么?

python - 用python按单词数拆分字符串

python - 保存和检索 Python 对象属性值到文件

java - 如何在打开新框架时关闭上一个框架

ruby-on-rails - 在 View 模板中保留逻辑是否可以接受?

php - WooCommerce 预订 : adding and reordering item data in cart and checkout

php - preg_match_all() 不匹配所有可能出现的情况

php - 如何修复从数据库填充的选择列表返回的奇数值

python将多个子图图形保存为pdf

java - 如何考虑MVC模式下的 "loader class"?