如何将此列表组织到mvc中?

时间:2015-02-25 15:36:57

标签: php mysql list model-view-controller count

我想在我的商店中列出最畅销的印刷品。 我有一个表(print_for_sale),它有fk_sale_id和fk_print_id,我可以看到已经购买了多少版画。

我想出了这个代码来打印出一个有组织的列表,从大多数购买到最少(不确定它是完全正确的):

<?php 

$sql = "SELECT fk_print_id as printId, COUNT(print_for_sale_id) as saleCount
                FROM print_for_sale
                GROUP BY fk_print_id
                ORDER BY saleCount DESC";

$result = mysql_query($sql);

while ($row = mysql_fetch_assoc($result)) {     
       echo $row['printId'];  echo $row['saleCount']; }


  ?>

我正在尝试将其转换为我的模型,控制器和视图(mvc),但我遇到了很多麻烦。我是新手,我尝试了很多不同的方式,但似乎都没有。我迷路了。现在我就像这样(它没有打印出任何东西),或者当我在视图中制作回声时,它打印出的唯一内容是“注意未定义的变量arr”

model.php

function getBestSelling() {

    $sql = "SELECT fk_print_id as printId, COUNT(print_for_sale_id) as saleCount
            FROM print_for_sale
            GROUP BY fk_print_id
            ORDER BY saleCount DESC";
    $result = $this->conn->query($sql);
    return $this->buildArr($result);

}

Controller.php这样

function bestselling() {
    $arr = $this->model->getBestSelling();
    print_r($arr);
    include 'view.php'; 

    } 

view.php

<?php echo $arr['printId'] ?>

我想打印出查询结果但没有任何效果。如果这不是一个合适的问题,我很抱歉,但我真的可以帮助理解这一点。

我没有使用任何框架。

在我的模型中,我有一个class model { },一个function __construct()和一个function __destruct()。我还有一个构建数组的函数。

function buildArr($result) {
    $arr = array();
    while ($row = $result->fetch_assoc()) {
        array_push($arr, $row);
    }
    return $arr;
   }

在我的控制器include 'model.php';并拥有class Controller {}function __construct() { $this->model = new model();}

我还有 index.php ,我开始会话并define("BASE_URL", 'http://' . $_SERVER['SERVER_NAME'] . '/printstore/index.php/');

该应用正常运作。我已经可以注册用户,登录和购物。我似乎无法正确地获得这部分代码。 非常感谢一些帮助!很抱歉这篇长篇文章并提前感谢你。

1 个答案:

答案 0 :(得分:1)

包含的文件的行为与预期不符。要实现这一目标,您必须从变量中创建一个全局变量(但不要这样做!)。您可以在控制器中print_r()数组,因为您是从模型中获取数组的。但在那之后你包括了视图。当您将该数组放在包含的文件中而不在文件本身中定义它时,您将不会得到结果,因为只有包含文件才能访问任何已定义的变量。不是相反。

因此,如果您希望此功能正常工作,则您必须将变量$arr设为全局(不推荐),或将控制器包含在view.php中。 (请注意,这是不是 MVC!)如果您希望这是MVC,则必须使用控制器的类并在视图中使用这些对象。要找到更好的解释,请参阅下面的链接。

我个人喜欢使用模板引擎(也不是MVC相关)。我非常喜欢Smarty,但我也听过关于mustache的好故事。

这些模板引擎为您提供了一种将变量传递到模板的方法,而不包括控制器文件。例如在Smarty中:
PHP:

$variable = 'Hello World!';
$smarty->assign('variable', $variable);
$smarty->display('helloworld.tpl');

Smarty,helloworld.tpl:

{$variable}

输出: Hello World!

我也建议你阅读这些内容,他们可能会帮助你解决问题。

  1. 在PHP中设置MVC:http://www.sitepoint.com/the-mvc-pattern-and-php-1/
  2. 在PHP中包含文件:Passing a variable from one php include file to another: global vs. not
  3. 修改
    Teresko是对的,你不应该使用全局变量。我刚刚在这里指定了它们,因为它们可以使用它们(绝对不推荐)。 请阅读此问题,了解其中几个原因:Stop using `global` in PHP