mysqli_stmt_get_result和mysqli_fetch_all不兼容


mysqli_stmt_get_result and mysqli_fetch_all incompatible?

我试图绑定参数(为了安全起见),然后将结果放入数组中,因此我创建了如下代码。问题是它不起作用:$arr为null。(顺便说一句,我知道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仅适用于缓冲的结果集,这些结果集是mysqliquery的默认值。MYSQLI_USE_RESULT将在中得到支持5.3.4+然而,以这种方式使用它并没有什么意义,因为它是无缓冲的集合。在这种情况下,选择STORE_RESULT,然后fetch_all不会复制数据,而是在数据存储时引用它已经在mysqlnd中了。

我发现prepared语句返回未缓冲的结果,所以我尝试使用$result = mysqli_stmt_store_result($stmt)而不是$result = mysqli_stmt_get_result($stmt);。但是这没有帮助。

这让我并没有完全不知所措——我知道我可以一次循环加载一行数据,但我真的不想只为了从准备好的语句中获取数组这样简单的事情而必须在PHP中循环。有没有一种方法可以将结果集作为一个对象来获取和处理?

我刚刚重读了文档。。。

我现在不可能测试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$smt)

返回值
失败时返回结果集或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 ;
        }

如果有任何错误,很抱歉,现在不可能进行跟踪和调试,希望对您有所帮助。