重复 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