从mysqli_multi_query

时间:2018-06-13 12:36:59

标签: php mysql mysqli mariadb

我正在为我的Android应用程序创建PHP API,用于扫描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分钟则无关紧要)。

超时(我认为)的原因是,当扫描成功时,在存储过程中执行了一些循环,这些循环可以在结果集中返回,并且当我在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”:“命令不同步;您现在无法运行此命令”}

问题在于执行第二个查询。

1 个答案:

答案 0 :(得分:0)

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

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