如何从准备好的语句中获取关联数组中的所有内容?

Aqu*_*ita 16 php mysqli

我正在尝试这段代码:

    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>";
    }
Run Code Online (Sandbox Code Playgroud)

但它抛出以下错误

[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>";
    }
Run Code Online (Sandbox Code Playgroud)

这使得:

[Fri Jun 15 12:22:59 2012] [错误] [client 127.0.0.1] PHP致命错误:在[myfile.php]中的非对象上调用成员函数fetch_assoc()

我还能做些什么来获得结果或我做错了什么?我需要DB中的assoc数组看起来像$data[0]["id"] = 1

Dav*_*dom 23

事实上,你可以很容易地做到这一点,你只是不能用mysqli_stmt对象做,你必须提取底层mysqli_result,你可以通过简单的调用来做到这一点mysqli_stmt::get_result().注意:这需要mysqlnd(MySQL Native Driver)扩展,这可能并不总是可用.

但是,关于在MySQLi上推荐PDO的观点仍然存在,这就是原因的一个主要例子:MySQLi userland 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>";
Run Code Online (Sandbox Code Playgroud)


man*_*ams 7

你可以做:

$conn = mysqli_connect('host','username','password','database')
$query = 'select * from tablename';
$result = $conn->query($query);
$data = mysqli_fetch_all($result,MYSQLI_ASSOC);
Run Code Online (Sandbox Code Playgroud)

$data 包含assoc数组中的所有结果.

*应该注意,此mysqli_fetch_all()功能仅适用于mysqlnd包. http://php.net/manual/en/mysqli-result.fetch-all.php

  • 除了不好的做法之外,问题还明确指定了“准备好的声明”,您的答案忽略了它 (2认同)

Emr*_*cel 5

我不喜欢 Mysqli,但你可以在准备时这样做。

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$db = new mysqli('hostAddress', 'username', 'password', 'databaseName');
$db->set_charset('utf8mb4');

$userID = 2;

$stmt = $db->prepare("SELECT * FROM users WHERE ID = ?");
$stmt->bind_param("i", $userID);

// because the variable is bound by reference you can assign the value after binding, too
//$userID = 2;

$stmt->execute();
Run Code Online (Sandbox Code Playgroud)

如果你想要结果;

$result = $stmt->get_result();
$user   = $result->fetch_array(MYSQLI_ASSOC); //one row
Run Code Online (Sandbox Code Playgroud)

或多行

$users  = $result->fetch_all(MYSQLI_ASSOC);
Run Code Online (Sandbox Code Playgroud)