【问题标题】:check double entries before updating database在更新数据库之前检查双重条目
【发布时间】:2019-07-25 22:25:18
【问题描述】:

这是我的问题...

我有一个显示航班详细信息的 SQL 表,例如到达日期、到达时间、出发日期、出发时间等... 现在,如果我想更新航班,我想确保航班日期与其他日期不匹配,例如:

如果我有一个名为 IFLY 的航班于 8 月 10 日抵达,8 月 14 日出发,同一航班于 8 月 16 日抵达,8 月 18 日出发,想象我想更新 8 月 13 日抵达的第二个航班,我应该得到如下响应:“您的航班无法到达在前一个还没有离开之前”。为此我做了...

if (isset($_POST['update'])) {
    $regist = $_POST['reg'];
    $arrivalDate = $_POST['adof'];
    $departureDate = $_POST['ddof'];

    $sql = "SELECT reg, adof, ddof FROM flights WHERE reg = '$regist' AND  adof < $arrivalDate' order by ddof desc";//

    $data = mysqli_query($conn, $sql);

    if (mysqli_num_rows($data) > 0) {
        foreach ($data as $key => $v) {
            if ($v['ddof'] <= $arrivalDate) {
                echo 'exists';
            }
        }
    }
}

但不工作,因为当我更新时也在寻找我想要更新的航班。 如何解决,如何避免对当前条目的SQL查询?

【问题讨论】:

  • 您将不得不查询以查看是否存在冲突。如果没有冲突,则更新。没有绕过它。但是您在这里遇到的问题不止一个:1) 您需要一个准确地让您知道是否可以更新的查询,2) 如何执行该查询然后更新。按此顺序求解。同时,您的代码可以通过使用含义明显的字段名称来大大改进,即“到达”、“出发”和(我不知道 reg 是什么意思)。您也对 sql 注入持开放态度:在继续之前,请弄清楚如何使用准备好的语句并始终使用它们。
  • 在您的 SQL 中添加一个条件以忽略第一条记录或按日期对数据进行排序并忽略第一条返回的记录。

标签: php jquery mysql sql


【解决方案1】:

您描述的是业务逻辑前提条件要求。在执行任何更新之前,您需要获取记录,并评估更改是否会导致荒谬的情况。如果是这样,您可以通过错误拒绝更改并且不发布更新。

【讨论】:

  • 谢谢,但是怎么办呢?这就是我提出问题的原因
  • 您获取要更新的记录。然后评估业务规则。查看您打算在以后的步骤中更新的记录没有任何问题。实际上,这是大多数业务逻辑处理中常见且必需的步骤。现在,如果您说您想在 SQL 服务器端执行此操作,以免相信客户端正在执行正确的逻辑检查,您需要添加一个 SQL UPDATE 触发器,对此有很多很好的教程。
  • ok 明白了,但是如何避免当前条目的sql查询。我想做一个 SELECT 但不是当前条目,这可能吗?
  • 当然。只需通过更改 $sql 变量的构建方式将参数更改为您的选择。您可能必须运行一系列select 查询(或大连接)来定位需要评估的记录。这将是非常典型的。你是程序员;您始终负责计算机如何处理上下文中的数据——您可能只需要采取 2-3 步或更多步骤即可获得您真正想要的答案。
【解决方案2】:

要确定航班是否重叠,我相信您只需要查看新的出发日期是否在旧的出发日期和到达日期之间,新的到达日期是否在在两个旧日期之间,OR 如果新出发日期在旧出发日期之前并且新到达日期在旧日期之后。我认为这涵盖了您的所有场景。查询将类似于:

    SELECT TOP 1 reg, adof, ddof FROM flights 
       WHERE reg = '$regist' AND (
       (adof > $departureDate AND adof < $arrivalDate) 
       OR (ddof > $departureDate AND ddof < $arrivalDate) 
       OR (ddof < $departureDate AND adof > $arrivalDate)
       ) 

我没有尝试过,但我认为这正是您想要的。 SELECT TOP 1 应该加快查询速度,因为您只关心是否有一条记录导致冲突。那时,没有理由寻找更多记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-27
    • 1970-01-01
    • 2021-07-10
    • 1970-01-01
    • 2014-03-16
    • 1970-01-01
    • 2012-01-23
    • 2011-05-16
    相关资源
    最近更新 更多