重复 MySql 查询直到找到结果(有延迟)
Repeat MySql query until result is found (with delay)
我正在建立一个 PHP 网店,在购物过程的感谢页面上,支付结果 status/cancellation 可能尚未从支付服务提供商发送。
因此,当从 SHOP_PAYMENTS 检索该状态时,更新的记录可能还不存在。
查询简单:
$check_status = "SELECT * FROM SHOP_PAYMENTS WHERE order_id = '$orderID' AND status <> ''";
当 status 没有结果时(我们有 order_id),我想延迟重复一次:说每 2 秒一次,最多重复 3 次。
当然,当找到任何状态时,中断并给出结果。
我知道 SELECT REPEAT()
存在(并尝试过),但它只是连续触发了 3 次。
还有其他方法可以实现吗?
一种方法是使用 do ... while()
语句迭代并执行查询,使用 sleep()
延迟下一次迭代或为了更准确 usleep()
.
但是,在继续响应客户端之前,让消息队列发送并确定来自支付网关的状态会更有利。
以下示例假设 mysqli 配置为 MYSQLI_REPORT_STRICT
,而不是检查 true/false
此外,status
不能为 null,否则需要条件 status IS NOT NULL AND status != ""
来检查 null 或空字符串。
$i = 0;
do {
$stmt = $mysqli->prepare("SELECT `status` FROM `SHOP_PAYMENTS` WHERE `order_id` = ? AND `status` != ''");
$stmt->bind_param('i', $id);
$id = $orderID; //bind the order_id param to the value of $orderID
$stmt->execute();
$stmt->bind_result($status);
$stmt->fetch();
$stmt->close(); //important - mysqli may not unlock the results unless the prepared statement is closed and recreated
if (!$status) {
//delay next iteration by two seconds if a status is not found
sleep(2);
}
//stop checking if there is a status or iterations exceeds 2
} while (!$status && $i++ < 2);
if ($status) {
//... do something
}
PDO + Sqlite 示例演示延迟重复查询
https://3v4l.org/IFc2i
我正在建立一个 PHP 网店,在购物过程的感谢页面上,支付结果 status/cancellation 可能尚未从支付服务提供商发送。
因此,当从 SHOP_PAYMENTS 检索该状态时,更新的记录可能还不存在。
查询简单:
$check_status = "SELECT * FROM SHOP_PAYMENTS WHERE order_id = '$orderID' AND status <> ''";
当 status 没有结果时(我们有 order_id),我想延迟重复一次:说每 2 秒一次,最多重复 3 次。
当然,当找到任何状态时,中断并给出结果。
我知道 SELECT REPEAT()
存在(并尝试过),但它只是连续触发了 3 次。
还有其他方法可以实现吗?
一种方法是使用 do ... while()
语句迭代并执行查询,使用 sleep()
延迟下一次迭代或为了更准确 usleep()
.
但是,在继续响应客户端之前,让消息队列发送并确定来自支付网关的状态会更有利。
以下示例假设 mysqli 配置为 MYSQLI_REPORT_STRICT
,而不是检查 true/false
此外,status
不能为 null,否则需要条件 status IS NOT NULL AND status != ""
来检查 null 或空字符串。
$i = 0;
do {
$stmt = $mysqli->prepare("SELECT `status` FROM `SHOP_PAYMENTS` WHERE `order_id` = ? AND `status` != ''");
$stmt->bind_param('i', $id);
$id = $orderID; //bind the order_id param to the value of $orderID
$stmt->execute();
$stmt->bind_result($status);
$stmt->fetch();
$stmt->close(); //important - mysqli may not unlock the results unless the prepared statement is closed and recreated
if (!$status) {
//delay next iteration by two seconds if a status is not found
sleep(2);
}
//stop checking if there is a status or iterations exceeds 2
} while (!$status && $i++ < 2);
if ($status) {
//... do something
}
PDO + Sqlite 示例演示延迟重复查询 https://3v4l.org/IFc2i