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;
    }

これは私の質問です。

基本的には$fetchfetchメソッドを保持している変数を返します。

そして、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

PDO の優れた機能の 1 つは、 が を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 に答える