从mysqli\u multi\u查询获取最后结果

o8x7eapl  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(371)

我正在为我的android应用程序创建phpapi,它将用于扫描qr码。该api的一部分是检查扫描的代码是否有效,是否可以在某个时刻进行扫描。
整个检查部分是mariadb数据库中的一个存储过程,由php脚本执行。php中的执行部分如下所示:

$sql = "CALL someProcedure('qr_code', @out); ";
$sql .= "SELECT @out AS `out`;";

if($conn->multi_query($sql)) {
    while ($conn->more_results()) {
        $conn->next_result();
    }
    $rs = $conn->store_result();
    $row = $rs->fetch_assoc();
    $odp = $row['out'];

    if (!empty($rs)) {
        $response['success'] = 1;
        $response['message'] = $odp;

        echo json_encode($response);
        $rs->free();

    } else {
        $response['success'] = 0;
        $response['message'] = mysqli_error($conn);

        echo json_encode($response);    
    }

该存储过程有4个结果:
扫描的代码不存在,
扫描的代码不是包(它是文章代码)
扫描的代码还不能交付
扫描成功
现在,当代码出现问题时,php部分会毫无问题地执行,但是如果扫描成功,我会得到一个超时(不管是默认的30秒还是5分钟)。
出现超时的原因(我认为)是,当扫描成功时,存储过程中会执行一些循环,这些循环可能会在resultsets和php脚本中返回,尽管当我在dbeaver中执行存储过程(使用与php完全相同的查询)时,没有问题。
所以,我的问题是我能做些什么?删除上面php脚本中的while循环可以使脚本顺利执行(但是我无法获取out参数值)。

为什么不做两个查询而不是一个多查询呢?

这是对里克·詹姆斯评论的回应
以下是修改后的代码:

$sql = "CALL ".$storedProcedure."(".$columns."); ";
$sql2 = "SELECT @out AS `out`;";

if($conn->query($sql)) {
    if($rs = $conn->query($sql2)) {
        $row = $rs->fetch_assoc();
        $odp = $row;

        if (!empty($odp)) {
            $response['success'] = 1;
            $response['message'] = $odp;

            echo json_encode($response);
            $rs->free();

        } else {
            $response['success'] = 0;
            $response['message'] = mysqli_error($conn);

            echo json_encode($response);    
        } 
    } else {
        $response['success'] = 0;
        $response['message'] = mysqli_error($conn);

        echo json_encode($response);    
    }

执行脚本时出现错误:
{“success”:0,“message”:“命令不同步;现在不能运行此命令“}
问题是在执行第二个查询时。

gkn4icbw

gkn4icbw1#

我终于明白了。我所要做的就是在每次while循环迭代中存储结果。现在是这样的。

$sql = "CALL someProcedure('qr_code', @out); ";
$sql .= "SELECT @out AS `out`;";

if($conn->multi_query($sql)) {
    while ($conn->more_results()) {
        $rs = $conn->store_result();
        $conn->next_result();
    }
    $rs = $conn->store_result();
    $row = $rs->fetch_assoc();
    $odp = $row['out'];

    if (!empty($rs)) {
        $response['success'] = 1;
        $response['message'] = $odp;

        echo json_encode($response);
        $rs->free();

    } else {
        $response['success'] = 0;
        $response['message'] = mysqli_error($conn);

        echo json_encode($response);    
    }

相关问题