mysqli_stmt_get_result和mysqli_fetch_all不兼容?

时间:2015-02-20 13:53:39

标签: php mysqli prepared-statement

我正在尝试绑定参数(用于安全性),然后将结果放入数组中,因此我创建了如下代码。问题是它不起作用:$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中循环只做一些简单的事情就像得到一个准备好的声明中的数组。有没有办法获取和处理结果集作为一个对象?

1 个答案:

答案 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 ;
        }

对不起,如果有任何错误,现在无法跟踪和调试,希望它有用。