0

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

2 回答 2

1

这是因为您在循环中调用 fetch 函数,并且每次都会重新启动查询。您需要改为在循环中调用 $check->fetch() 。

或者换句话说,如果您的 fetch 函数(可能应该有不同的名称)将返回 $check,那么在返回的对象上,您应该在循环中调用 fetch():

$r = new Database();
$q = $r->fetch(...);
while($q->fetch()){...}

您还需要编辑您的 fetch 函数以像这样结束:

    $check->execute(array_values($criteria));
    return $check;
}
于 2013-07-24T11:59:08.160 回答
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) {

}
于 2013-07-24T12:04:31.793 回答