我正在尝试绑定参数(用于安全性),然后将结果放入数组中,因此我创建了如下代码。问题是它不起作用:$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_fetch_all
时,我mysqli_query()
可以使用。
在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中循环只做一些简单的事情就像得到一个准备好的声明中的数组。有没有办法获取和处理结果集作为一个对象?
答案 0 :(得分:0)
我刚刚重读了文档...
我现在无法测试mysql。
但只是一个猜测:
mysqli_fetch_all(mysqli_result $ result ...
参数结果仅限过程样式:结果集标识符 由mysqli_query(),mysqli_store_result()或者返回 mysqli_use_result()。
我想强调所有函数mysqli_query(), mysqli_store_result() mysqli_use_result()
都属于mysqli类,而不属于stmt
,它们返回类型mysqli_result
但您正在尝试使用mysqli_stmt_get_result($stmt);
mysqli_result mysqli_stmt_get_result(mysqli_stmt $ stmt)
...返回值
返回结果集或失败时返回FALSE。
所以这个函数返回类型resultset
而不是mysqli_result
。
所以你必须改变你的代码才能使用mysqli_stmt
所以改变:
if ($stmt = mysqli_prepare($con, "call getList(?)")) {
mysqli_stmt_bind_param($stmt, 's', $userInputSearch);
mysqli_stmt_execute($stmt);
到
$result = mysqli_query ( $con , "call getList(".mysqli_real_escape_string($userInputSearch).")" );
,或 只需改变你的行:
$arr = mysqli_fetch_all($result, MYSQLI_ASSOC);
到
$arr = array()
while ($row = $result->fetch_array())
{
arr[] = $row ;
}
对不起,如果有任何错误,现在无法跟踪和调试,希望它有用。