好的,我从来没有使用动态函数,不知道为什么,我从来没有喜欢使用explode(),implode()等。
但我已经尝试过了,出了点问题。
public function fetch($table, array $criteria = null)
{
// The query base
$query = "SELECT * FROM $table";
// Start checking
if ($criteria) {
$query .= ' WHERE ' . implode(' AND ', array_map(function($column) {
return "$column = ?";
}, array_keys($criteria)));
}
$check = $this->pdo->prepare($query) or die('An error has occurred with the following message:' . $query);
$check->execute(array_values($criteria));
$fetch = $check->fetch(PDO::FETCH_ASSOC);
return $fetch;
}
这是我的疑问。
基本上我会返回保存fetch方法的变量$fetch
。
然后在某处,我想使用while循环来获取数据,我将使用它:
$r = new Database();
while ($row = $r->fetch("argonite_servers", array("server_map" => "Wilderness")))
{
echo $row['server_map'];
}
现在,我没有收到任何错误,但是浏览器会永远加载和加载,最终会因内存不足而卡住。
那是因为循环正在运行并且没有停止运行。 它为什么这样做?如何让这个动态查询起作用?
编辑:
$r = new Database();
$q = $r->fetch("argonite_servers", array("server_map" => "Wilderness"));
while ($row = $q->fetch(PDO::FETCH_ASSOC))
{
echo $row['server_map'];
}
答案 0 :(得分:1)
这是因为您在循环中调用了fetch函数,并且每次都重新启动查询。你需要在循环中调用$ check-> fetch()。
或者换句话说,如果你的fetch函数(应该有一个不同的名字)会返回$ check,那么在返回的对象上你应该在循环中调用fetch():
$r = new Database();
$q = $r->fetch(...);
while($q->fetch()){...}
你还需要编辑你的获取功能,结束如下:
$check->execute(array_values($criteria));
return $check;
}
答案 1 :(得分:1)
PDO的一个不错的功能是PDOStatement
实现了Traversable
。这意味着您可以直接迭代它:
// `$check` is a `PDOStatement` object
$check = $this->pdo->prepare($query) or die('An error has occurred with the following message:' . $query);
$check->execute(array_values($criteria));
$check->setFetchMode(PDO::FETCH_ASSOC);
return $check;
使用它:
$statement = $r->fetch("argonite_servers", array("server_map" => "Wilderness"));
foreach ($statement as $row) {
}