24

私はこのコードを試しています:

    if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?"))
    {

        $result->bind_param("i",$id);
        $result->execute();
        while ($data = $result->fetch_assoc())
        {

            $statistic[] = $data;

        }

        echo "<pre>";
        var_dump($statistic);
        echo "</pre>";
    }

しかし、それは次のエラーをスローしています

[Fri Jun 15 12:13:11 2012] [error] [client 127.0.0.1] PHP致命的なエラー:[myfile.php]の未定義のメソッドmysqli_stmt :: fetch_assoc()を呼び出します

そしてまた私は試しました:

if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?"))
    {

        $result->bind_param("i",$id);
        $rows = $result->execute();
        while ($data = $rows->fetch_assoc())
        {

            $statistic[] = $data;

        }

        echo "<pre>";
        var_dump($statistic);
        echo "</pre>";
    }

それはこれを作ります:

[Fri Jun 15 12:22:59 2012] [error] [client 127.0.0.1] PHP致命的なエラー:[myfile.php]の非オブジェクトでメンバー関数fetch_assoc()を呼び出します

結果を得るために他に何ができるか、または私が間違っていることは何ですか?DBからの連想配列は次のようになります$data[0]["id"] = 1

4

6 に答える 6

27

実際、これは非常に簡単に実行できます。オブジェクトmysqli_stmtでは実行できません。基になる を抽出する必要があります。mysqli_resultこれは、 を呼び出すだけで実行できますmysqli_stmt::get_result()。注: これには mysqlnd (MySQL Native Driver) 拡張機能が必要ですが、これは常に利用できるとは限りません。

ただし、MySQLi よりも PDO を推奨するという以下の点は依然として有効であり、これがその理由の代表的な例です。MySQLi ユーザーランド API は意味がありません。上記のメカニズムを発見するには、断続的に MySQLi を使用して数年かかりました。ここで、ステートメントと結果セットの概念を分離することは理にかなっていることを認めますが、その場合、ステートメントにfetch()メソッドがあるのはなぜでしょうか? 検討の材料 (MySQLi と PDO の間のフェンスにまだ座っている場合)。

完全を期すために、質問の元のコードに(大まかに)基づいたコードサンプルを次に示します。

// Create a statement
$query = "
    SELECT *
    FROM `mytable`
    WHERE `rows1` = ?
";
$stmt = $this->mysqli->prepare($query);

// Bind params and execute
$stmt->bind_param("i", $id);

// Extract result set and loop rows
$result = $stmt->get_result();
while ($data = $result->fetch_assoc())
{
    $statistic[] = $data;
}

// Proof that it's working
echo "<pre>";
var_dump($statistic);
echo "</pre>";
于 2012-06-15T10:09:31.190 に答える
11

できるよ:

$stmt = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?");
$stmt->bind_param("i",$id);
$stmt->execute();
$result = $stmt->get_result();
$statistic = $result->fetch_all(MYSQLI_ASSOC);

$statisticすべての結果が 2 次元配列に含まれています。

※パッケージ mysqli_fetch_all()のみの機能となりますのでご注意ください。http://php.net/manual/en/mysqli-result.fetch-all.phpmysqlnd

于 2014-12-20T18:20:54.147 に答える
-1

メソッド execute() は、結果セットではなく TRUE または FALSE を返すため、ブール値には存在しないため、fetch_assoc メソッドは使用できません。必要なのは

mysqli_fetch_assoc($result); //Use in association with query();
于 2012-06-15T10:25:23.797 に答える
-2

試していませんでしたが、次のようにwhileループ条件を変更して、もう一度テストしてください

$data = $result->fetch()

ありがとう

于 2012-06-15T10:13:42.317 に答える