【问题标题】:if/else statement to prevent duplicates/overlapping in database PDOif/else 语句以防止数据库 PDO 中的重复/重叠
【发布时间】:2018-08-25 21:10:14
【问题描述】:

我目前正在使用 XAMPP 和 PDO 构建本地数据库。我让我的数据库按预期工作,除了我正在构建的 if/else 循环以防止重复项被发布到我的数据库中。我是 PDO 编码的新手,我最近才开始重新编码,所以如果我有一些看起来很奇怪的代码,请耐心等待。只是为了澄清,我不是在寻找一个简单的“这里拿这个代码”,因为我真的很想了解它是如何工作的。

$conn = new PDO("mysql:host=$servername;dbname=$db", $username, $password);

$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);



$dupe = $conn->prepare("SELECT starttime FROM missions GROUP BY starttime HAVING COUNT(starttime) > 1");  //Query för att kolla efter dubbletter i databasen. Denna fungerar i PHPmyadmin/SQL
$dupe->execute();  // Exekvera SQL query för dubbletter

// If/else loop som ser till att det inte kan postas några dubbletter. Om den märker av att det finns en liknande post i DB så körs ej execute.

if($duperesult = $dupe->fetchAll()) {


    $sql = "INSERT INTO missions (startdate, starttime, endtime, description)  
    VALUES ('$startdate' , '$starttime' , '$endtime' , '$description')";  //Inmatning av information.

    $conn->exec($sql);      // Exekvering av SQL Query. 
}
else  {

    echo "Detta är en dubbelbokning!";

}

Duplicates in database

【问题讨论】:

  • 请将您的代码直接放在您的问题中,而不是图片中。另外,具体说明什么不起作用。你有错误吗?如果是这样,它们是什么?如果没有,正在发生什么。你期待发生什么?你已经做了哪些调试?
  • 对不起,我以前从未在论坛上发过关于编码的帖子。但我想要它做的是 - 将查询发送到我的数据库并查看指定的列以查看是否有任何重复项。如果有重复项,我希望它跳转到我的 else 语句并显示错误消息。截至目前,我的 if/else 语句中的条件似乎总是返回 true,因此它允许重复。
  • 不要试图仅仅通过查询值是否已经存在来防止重复——当您添加并发用户时,该方法会很快失效。改为在您的数据库上使用 UNIQUE 约束。
  • @AlexHowansky 我可以将唯一约束放在我的所有列上还是单列?
  • 您可以有多个唯一约束,如果需要,您可以在一个约束中使用多个列。

标签: php mysql sql database duplicates


【解决方案1】:

从 cmets 读取,您不仅要防止重复,还要防止任何重叠的时间段。因此,请考虑调整您的静态 SQL,以在同一 startdate 上使用 starttimeendtime 的参数化查询检查 PHP 变量:

# CHECKS WITHIN INTERVAL, ENDPOINT OVERLAP, OR COVERS ENTIRE INTERVAL
$checkSQL = "SELECT COUNT(*) As RecordCount
             FROM missions 
             WHERE ((:st_param BETWEEN starttime AND endtime) OR 
                    (:et_param BETWEEN starttime AND endtime))
               AND (startdate = :st_date) 
             HAVING COUNT(*) > 1";

$dupe = $conn->prepare($checkSQL);    
$dupe->execute(array(':st_param' => $starttime, ':et_param' => $endtime, 
                     ':st_date' => $startdate));

$apnSQL = "INSERT INTO missions (startdate, starttime, endtime, description)
           VALUES (? , ? , ?, ?)";

if ($dupe->fetchColumn() > 0) {
     echo "Detta är en dubbelbokning!";
} else  {
     $res = $conn->prepare($apnSQL);

     $res->bindParam(1, $startdate, PDO::PARAM_STR);
     $res->bindParam(2, $starttime, PDO::PARAM_STR);
     $res->bindParam(3, $endtime, PDO::PARAM_STR);
     $res->bindParam(4, $description, PDO::PARAM_STR);

     $res->execute();
}

Rextester DEMO

【讨论】:

  • 是的,我一直在尝试使用我的数据库,并通过 php admin 手动删除了其中的帖子。但是原理是一样的,即使时间变了,我也不能让它停止重叠。
  • 非常感谢@Parfait 现在可以正常工作并停止所有重叠。我不知道该怎么感谢你才足够。但是我只是注意到,如果时间相同但日期不同,它会说这是重叠/重复。
  • 做到了!我已经标记了答案,再次感谢 Parfait!
猜你喜欢
  • 2017-02-01
  • 2020-01-28
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多