Php 如何从准备好的语句中获取assoc数组中的all?

Php 如何从准备好的语句中获取assoc数组中的all?,php,mysqli,Php,Mysqli,我正在尝试以下代码: if ($result = $this->mysqli->prepare("SELECT * FROM `mytable` WHERE `rows1`=?")) { $result->bind_param("i",$id); $result->execute(); while ($data = $result->fetch_assoc()) {

我正在尝试以下代码:

    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>";
    }
if($result=$this->mysqli->prepare(“从`mytable`中选择*,其中`rows1`=?”)
{
$result->bind_参数(“i”,$id);
$result->execute();
而($data=$result->fetch_assoc())
{
$statistic[]=$data;
}
回声“;
var_dump($统计);
回声“;
}
但它抛出了以下错误

[Fri Jun 15 12:13:11 2012][error][client 127.0.0.1]PHP致命错误: 调用[myfile.php]中未定义的方法mysqli_stmt::fetch_assoc()

我也试过:

// 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>";
if($result=$this->mysqli->prepare(“从`mytable`中选择*,其中`rows1`=?”)
{
$result->bind_参数(“i”,$id);
$rows=$result->execute();
而($data=$rows->fetch_assoc())
{
$statistic[]=$data;
}
回声“;
var_dump($统计);
回声“;
}
因此:

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

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

事实上,你可以很容易地做到这一点,你只是不能用对象来实现,你必须提取底层,你可以通过简单的调用来实现。注意:这需要mysqlnd(MySQL本机驱动程序)扩展,该扩展可能并不总是可用的

然而,下面关于推荐PDO而不是MySQLi的观点仍然存在,这是一个很好的例子,说明了为什么:MySQLi userland API毫无意义。我花了好几年的时间断断续续地与MySQLi合作,才发现了上述机制。现在,我承认分离语句和结果集概念是有意义的,但是在这种情况下,为什么语句有
fetch()
方法呢?思考的食物(如果你仍然坐在MySQLi和PDO之间)

为了完整起见,这里有一个基于(松散地)问题中原始代码的代码示例:

$conn = mysqli_connect('host','username','password','database')
$query = 'select * from tablename';
$result = $conn->query($query);
$data = mysqli_fetch_all($result,MYSQLI_ASSOC);
//创建一条语句
$query=”
挑选*
从“我的桌子”`
其中'rows1`=?
";
$stmt=$this->mysqli->prepare($query);
//绑定参数并执行
$stmt->bind_参数(“i”,$id);
//提取结果集和循环行
$result=$stmt->get_result();
而($data=$result->fetch_assoc())
{
$statistic[]=$data;
}
//证明它起作用了
回声“;
var_dump($统计);
回声“;

未尝试,但使用以下命令更改while循环条件,然后再次测试

$data=$result->fetch()

感谢

execute()方法返回TRUE或FALSE而不是结果集,因此,fetch_assoc方法不能使用,因为它在布尔值上不存在。你需要的是

$result = $stmt->get_result();
$user   = $result->fetch_array(MYSQLI_ASSOC); //one row
你可以做:

$users  = $result->fetch_all(MYSQLI_ASSOC);
$data
包含assoc数组中的所有结果


*应该注意的是,此
mysqli\u fetch\u all()
函数仅适用于
mysqlnd
包。
我不喜欢Mysqli,但你可以这样做

如果你想要结果

或多行


修正:$query=$result->get_result();而($data=$query->fetch_assoc()){$statistic[]=$data;}混合使用OOP和程序mysqli被认为是一种不好的做法。*应该注意的是,这个mysqli_fetch_all()函数只适用于mysqlnd包。除了不好的做法之外,这个问题还清楚地说明了您的答案是什么ignores@YourCommonSense可以告诉我这个答案在没有mysqlnd驱动程序的情况下是否有效。我想告诉你,在执行之前,你可以在任何地方使用$userID。即使在你$stmt->bind_param之后,如果你愿意的话。谢谢@Dharman。但是我写1,因为我不喜欢“MYSQLI_ASSOC”形式的代码视图。它也会这样做。另外,为什么要将utf8的值更改为utf8mb4?
utf8
是一个过时且错误的字符集。没有人应该再使用它了。我把它改了,这样看到你答案的新人就不会犯这个错误。如果您想要完全支持Unicode,则必须使用
utf8mb4
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();
$result = $stmt->get_result();
$user   = $result->fetch_array(MYSQLI_ASSOC); //one row
$users  = $result->fetch_all(MYSQLI_ASSOC);