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