web-dev-qa-db-ja.com

準備されたステートメントから連想配列のすべてをフェッチする方法は?

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

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

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

[金6月15日12:13:11 2012] [エラー] [クライアント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>";
    }

これがこれを作ります:

[2012年6月15日12:22:59] [エラー] [クライアント127.0.0.1] PHP致命的エラー:[myfile。]の非オブジェクトでメンバー関数fetch_assoc()を呼び出します。 php]

結果を得るために他にできることは何ですか? $data[0]["id"] = 1のようなDBのassoc配列が必要です

14
AquaVita

実際、あなたはcanこれを非常に簡単に行うことができますが、 _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>";
_
23
DaveRandom

できるよ:

_$conn = mysqli_connect('Host','username','password','database')
$query = 'select * from tablename';
$result = $conn->query($query);
$data = mysqli_fetch_all($result,MYSQLI_ASSOC);
_

_$data_には、すべての結果が連想配列に含まれています。

*このmysqli_fetch_all()関数はmysqlndパッケージでのみ機能することに注意してください。 http://php.net/manual/en/mysqli-result.fetch-all.php

7
manojadams