PHP使用while循环来获取项目,使用动态选择功能?

时间:2013-07-24 11:46:38

标签: php mysql

好的,我从来没有使用动态函数,不知道为什么,我从来没有喜欢使用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'];
}

2 个答案:

答案 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) {

}