【发布时间】:2015-04-22 05:29:15
【问题描述】:
我正在尝试绑定参数(出于安全考虑),然后将结果放入数组中,因此我创建了如下代码。问题是它不起作用:$arr 为空。 (顺便说一句,我知道getList 中的查询有效。)
if ($stmt = mysqli_prepare($con, "call getList(?)")) {
mysqli_stmt_bind_param($stmt, 's', $userInputSearch);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$arr = mysqli_fetch_all($result, MYSQLI_ASSOC);
$jsonArr = json_encode($arr);
echo $jsonArr;
请注意,在使用 mysqli_query() 时,我必须使用 mysqli_fetch_all。
在mysqli_fetch_all 参考上,我发现了这条评论:
另外,mysqli_fetch_all 仅适用于缓冲结果集,它们是 mysqli_query 的默认值。 MYSQLI_USE_RESULT 将在 5.3.4+ 但是,以这种方式使用它没有什么意义,具体化无缓冲集。在这种情况下,选择 STORE_RESULT,然后 fetch_all 不会复制数据,而是引用它,因为它是存储的 已经在 mysqlnd 中了。
我发现准备好的语句返回未缓冲的结果,所以我尝试使用 $result = mysqli_stmt_store_result($stmt) 而不是 $result = mysqli_stmt_get_result($stmt); 但这没有帮助。
这让我并没有完全不知所措——我知道我可以循环加载数据,一次加载一行,但我真的不想在 PHP 中循环只是为了做一些简单的事情,比如得到一个来自准备好的语句的数组。有没有办法将结果集作为一个对象来获取和处理?
【问题讨论】:
-
如果没记错的话,您必须始终使用
_stmt_函数,包括mysqli_stmt_prepare和stmt_init才能正常工作。 -
这是一个很好的例子,说明随着新特性的添加,MySQLi API 变得多么失控。文档清楚地说您可以使用来自
mysqli_store_result()的对象,但不要引用mysqli_stmt_store_result()。我喜欢这个问题。
标签: php mysqli prepared-statement