PHP MVC,PDO:循环返回的mysql数据

时间:2012-09-27 19:30:31

标签: php mysql pdo

在我的数据库层类中,我有一个方法,它将select sql查询作为参数:

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  $ret = $stmt->fetch(PDO::FETCH_ASSOC);
  return $ret;
}

我希望能够将获取的数据返回到我的模型,然后在我的视图类中循环它,而不在视图中使用任何PDO。

如何以正确的方式做到这一点?

我希望能够以$ row ['testCol']等方式到达表行。

3 个答案:

答案 0 :(得分:2)

调用fetchAll()而不是fetch(),这将返回完整的多维数组。

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  $ret = $stmt->fetchAll(PDO::FETCH_ASSOC);
  return $ret;
}

$results = $your_object->select("SELECT * FROM yourtable");
// It's a 2D array!
var_dump($results);

答案 1 :(得分:2)

模型是一个层。不是一个阶级或对象。

而且,如果您通过遵守SRP编写代码,模型层将包含几种不同类型的结构。至少,您将拥有域业务逻辑和存储抽象的单独类。

你在这里完成的是一团糟。您不仅将域逻辑和存储机制都集中在同一个类中(并假装它是“模型”),而且还将SQL直接暴露给表示层。


如果您尝试构建正确的模型层,则当前视图将从服务实例请求信息(这将是结构的类型,用于将域业务逻辑与视图和控制器分离)并获取数据它需要。

该服务将实例化正确的domain object(s),并且基于先前由控制器设置的状态,使用某种形式的存储抽象(data mapperrepository,{ {3}},unit of work或类似的结构)。然后,在对填充的域对象执行所需的数据操作之后,它会将数据返回到视图。

根据收到的信息和来自控制器的先前信号,查看应该决定应该生成什么样的响应。如果响应的指示是HTML,它将使用一个或(通常)多个模板来组成输出。以为它可能只发送一个HTTP位置标头,以触发重定向。

如需进一步阅读,我建议dao


重点是:您目前已经简化了MVC的概念,甚至已经破坏了表示层和模型层之间的分离。

答案 2 :(得分:2)

您可以轻松返回$stmt。它允许您对其进行迭代,并且可以像PDO::FETCH_ASSOC一样访问:

$rows = $model->select($sqlQuery);

...

foreach($rows as $row)
{
    echo $row['testCol'], "\n";
}

在你的功能中,它就像:

public function select($sqlQuery) {             
  $stmt = $this->pdo->prepare($sqlQuery);
  $stmt->execute();
  return $stmt;
}

保持简单,从长远来看,这将对您有所帮助。您只希望视图中的某些内容可以像数组一样访问,PDO为您提供开箱即用的功能。如果需要,您可以稍后使用 - 比方说 - 替换它。也许不是阵列的最好例子,但我相信你明白了。

在边缘只是一个注释:不要称它为模型,只是称它为数据库或类似。它更好地命名了总是有用的东西。