gpt4 book ai didi

php - 从 mysqli_multi_query 获取最后结果

转载 作者:行者123 更新时间:2023-11-29 17:28:23 24 4
gpt4 key购买 nike

我正在为我的 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 参数值。

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

这是对 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":"Commands out of sync; you can't run this command now"}

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

最佳答案

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

关于php - 从 mysqli_multi_query 获取最后结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50837480/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com