【问题标题】:Repeat MySql query until result is found (with delay)重复 MySql 查询直到找到结果(有延迟)
【发布时间】:2021-10-03 20:48:39
【问题描述】:

我正在建立一个 PHP 网上商店,在购物过程的感谢页面上,支付服务提供商可能尚未发送支付状态/取消的结果。

因此,当从 SHOP_PAYMENTS 检索该状态时,更新的记录可能还没有。

查询很简单:

$check_status = "SELECT * FROM SHOP_PAYMENTS WHERE order_id = '$orderID' AND status <> ''";

status 没有结果时(我们有 order_id),我想延迟重复一次:比如每 2 秒重复一次,最多重复 3 次。

当然,当发现任何状态时,打破并给出结果。

我知道SELECT REPEAT() 存在(并尝试过),但它只会连续触发 3 次。

有没有其他方法可以做到这一点?

【问题讨论】:

  • 您很可能面临严重的 SQL 注入漏洞,因为您已将 PHP 变量直接连接到查询字符串中 - 您确实应该使用准备好的语句和参数化查询来正确安全地将 PHP 变量值插入您的查询。
  • 无论如何,您能否分享您描述为minimal reproducible example 的尝试代码?如果我们知道您迄今为止尝试过的内容以及不符合您要求的内容,这将极大地帮助您获得一些具体的、可操作的建议/解决方案。 How to Ask
  • 对不起,写成这样是为了让它看起来尽可能简单。
  • 您的选择会产生错误。你必须选择一些东西,不是select from,而是select col1,col2 fromselect * from
  • @KJS 看起来 esqew 提供了对否决票的解释。前提是您在询问之前已研究并尝试解决问题。见How much research effort is expected of Stack Overflow users?

标签: php mysql mysqli


【解决方案1】:

一种方法是使用do ... while() 语句来迭代并执行查询,使用sleep() 或更准确的usleep() 延迟下一次迭代。

但是,在向客户端发送响应之前,让消息队列发送并确定支付网关的状态会更有利。

下面的例子假设mysqli配置了MYSQLI_REPORT_STRICT,而不是检查真/假

另外,status 不能为空,否则需要 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-13
    • 2019-05-31
    • 1970-01-01
    • 2022-11-05
    • 2011-05-11
    • 2019-10-21
    • 2013-08-31
    • 2018-12-31
    相关资源
    最近更新 更多