从mysqli_multi_query获取最后的结果



我正在为我的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 分钟(。

超时的原因是(我认为(是当扫描成功时,在存储过程中执行了一些循环,这些循环可能会在结果集中返回并阻塞 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);    
} 

执行脚本时出现 mysql 错误:

{"成功":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);    
} 

最新更新