2

嗨,我最近开始了另一个项目,我的老板坚持我们使用 MVC 模型,问题是由于许多文章显示了不同的方法来做到这一点,我们还没有就正确的 MVC 模型应该是什么样子达成一致。

所以这是我对这个项目的问题(无论这是否是正确的方法)我正在使用以下基线规则

控制器类管理从模型类获取数据并将数据传递给视图类并检索视图并显示它

模型类管理所有数据库操作并使用返回数据mysql_fetch_assoc

视图类使用数据等创建视图。

所以我的问题是处理信息,mysql_fetch_assoc通常你会做这样的事情(假设我们已经运行了一个查询)

while ($row = mysql_fetch_assoc($result)) {
    echo $row["username"];
}

但是当我在视图类而不是模型中处理结果时,当我已经将 assoc 数组传递给视图时,如何循环遍历所有结果,目前我遇到了一个问题,它一直在循环结果直到它遇到内存大小错误,因此由于某种原因它无法弄清楚它需要循环多少个结果

对于不好的解释,我目前的代码片段如下。

控制器 require_once 'admin_model.php'; 需要一次'admin_view.php';

class admin_controller {
    public $model;
    public $view;

    public function __construct() {
        $this->model = new admin_model;
        $this->view = new admin_view;
    }

    public function get_group_view() {
        $in_model = $this->model->get_group_view();
        $in_view = $this->view->get_group_view ($in_model);

        echo $in_view;
    }

模型类 admin_model {

    public function get_group_view() {
        $query = mysql_query("
            SELECT
                group_id,
                group_name
            FROM
                user_groups
        ");

        return mysql_fetch_assoc($query);
    }
}

看法

class admin_view {

    public function get_group_view($group_data) {

        while($group_data) {
            $output .= $group_data['group_id'] . '###' . $group_data['group_name'] . '<hr />';
        }

        return $output;
    }

}

当前返回错误:

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 133693393 bytes)

那么有人可以建议我在不从模型类中移动“mysql_fetch_assoc”函数的情况下查看结果的最佳方法吗?

PS 我知道我可能在做 MVC 完全错误,但它对我们有用,我们不想再次研究和更改我们的代码,谢谢。

4

3 回答 3

2

你在这里有错误

    while($group_data) {
        $output .= $group_data['group_id'] . '###' . $group_data['group_name'] . '<hr />';
    }

如果$group_data不为空 - 您的循环将永远不会结束。

于 2012-09-10T22:55:53.130 回答
2

你不应该返回 MySQL Result - 你应该这样做:

 $return = array();
 $query = mysql_query("SELECT group_id, group_name FROM user_groups");
 while($row = mysql_fetch_assoc($query)) {
     $return[] = $row;
 }
 mysql_free_result($row);
 return $return;

你应该修复每个 @Roman_S 的 $group_data 错误。正确的用法,连同上面的代码是

public function get_group_view($group_data) {
    $output = '';
    foreach($group_data as $group) {
        $output .= $group['group_id'] . '###' . $group['group_name'] . '<hr />';
    }
    return $output;
}

最后,如果可能,您应该迁移到 MySQLi 或 PDO。

于 2012-09-10T23:08:25.710 回答
1

就如何处理数据库控制提出建议。

例如使用 PDO 时

$pdoInst = new PDO( .. );

我们在某处有一个方法可以验证 $pdoInst 生成的每个语句

abstract class .. {
  public static function validateStmt($stmt) {
    if($stmt !== false) { .. }
      // everything else you like, even error handling, log files, etc.
    }
  }
}

get_group_view方法这样的准备好的语句将如下所示

public function get_group_view { 
  $stmt = $pdoInst->prepare(" .. QUERY .. ");
  // the return can be wrapped in a method to handle errors, etc, which can be done
  // here or else where.
  $stmt->execute() // returns true or false
  return $stmt;
}

现在进行迭代

public function get_group_view($group_data) {
  $output = "";
  // validate the statement, can be done here or else where as said before
  if($pdoInst::validateStmt($group_data)) {
    // many ways how to iterate, foreach is just one.
    foreach($group_data as $index => $group) {
      $output .= $group['group_id'] . '###' . $group['group_name'] . '<hr />';
    }
  }
  return $output;
}

PDO 最好的一点是您可以使用自定义类扩展类。您可以添加为您的模型增加更多价值的功能。

于 2012-09-10T23:09:54.540 回答