【问题标题】:Get last result from mysqli_multi_query从 mysqli_multi_query 获取最后一个结果
【发布时间】:2018-06-13 12:36:58
【问题描述】:

我正在为我的 Android 应用程序创建 PHP API,用于扫描二维码。该 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 分钟)。

出现超时的原因(我认为)是,当扫描成功时,存储过程中执行了一些循环,这些循环可能会在结果集中返回,并且当我在 DBeaver 中执行该存储过程时阻塞 PHP 脚本尽管(与完全相同用PHP查询)没有问题。

那么,我的问题是我能做些什么呢?删除上面 PHP 脚本中的 while 循环使脚本执行没有问题(但我无法获取 out 参数值。

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

这是对 Rick James 评论的回应

这里是修改后的代码:

$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);    
    } 

执行脚本时mysql出错:

{"success":0,"message":"命令不同步;您现在无法运行此命令"}

问题出在执行第二个查询时。

【问题讨论】:

  • 为什么不做两个查询而不是一个多查询?
  • 我通过编辑我的帖子回答了你
  • query($sql) 需要在开始 query($sql2) 之前完成。

标签: php mysql mysqli mariadb


【解决方案1】:

我终于明白了。我所要做的就是在每个 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);    
    } 

【讨论】:

  • 此时,您不妨将SELECT @out 作为someProcedure 中的最后一个命令。
  • 谢谢,仅仅基于 php.net 文档,我永远不会到达那里。
猜你喜欢
  • 2011-12-20
  • 1970-01-01
  • 2019-09-02
  • 2014-06-06
  • 1970-01-01
  • 1970-01-01
  • 2018-12-09
  • 2023-03-23
  • 1970-01-01
相关资源
最近更新 更多