2

こんにちは、私は最近、さらに別のプロジェクトを開始しました。私の上司は、MVC モデルを使用するよう主張しています。問題は、これを行うためのさまざまな方法を示す多くの記事のために、適切な MVC モデルがどのように見えるべきかについて合意できていないことです。

したがって、これがこのプロジェクトの私の問題です(これが正しい方法であるかどうかにかかわらず)私は次のベースラインルールを使用しています

コントローラ クラスは、モデル クラスからのデータの取得とビュー クラスへのデータの受け渡し、およびビューの取得と表示の両方を管理します。

モデル クラスはすべてのデータベース アクションを管理し、次を使用してデータを返します。mysql_fetch_assoc

ビュークラスは、データなどを使用してビューを作成します。

したがって、私の問題は、mysql_fetch_assoc通常、このようなことを行う情報を処理することです(すでにクエリを実行していると仮定します)

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

しかし、モデルではなくビュークラスで結果を処理しているため、既に連想配列をビューに渡しているときにすべての結果を循環するにはどうすればよいですか?現在、それがループし続けるという問題が発生していますメモリサイズエラーに達するまで結果が表示されないため、何らかの理由で、循環する必要がある結果の数を把握できません

私の現在のコード スニペットは以下のとおりです。説明が不十分で申し訳ありません。

コントローラー require_once 'admin_model.php'; require_once '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 に答える