试图避免重复的SQL条目

时间:2015-06-01 23:42:33

标签: mysql

我试图避免不止一次将某个游戏的数据添加到我的表中,所以我试图制作一个if语句来检查该游戏的ID是否已经在表中,但是由于某种原因if语句总是假。这是我的代码:

    $a = $_GET['id'];
    $colname = $_GET['colname'];
    $b = "SELECT count(*)
              FROM table
              WHERE gameid = ".$a;
    if($dup = mysqli_query($dbc, $b)){
      if(mysqli_num_rows($dup)==0){
        $insrt = "INSERT INTO table ($colname)
        VALUES ($a)";
        mysqli_query($dbc, $insrt);
      }
    }

3 个答案:

答案 0 :(得分:1)

除非出现特殊情况,否则SELECT COUNT()....查询通常会返回至少一行(如果有GROUP BY子句则更多,否则会另外指示);您需要检查字段值是否为0,而不是结果中没有行。

答案 1 :(得分:1)

如果我是你,而不是在你的程序中使用逻辑来避免创建重复的条目,我只是告诉MySQL你的ID列应该是唯一的。请查看MySQL Reference Manual中有关列定义的信息,特别是关键字PRIMARY KEY.gif

如果指定您的ID列应该是唯一索引,那么MySQL将阻止添加具有相同ID值的另一个条目。这样,在您的程序中,您可以简单地尝试添加数据,如果它是重复的,则该过程将自动失败。作为额外的奖励,这意味着您只需要从您的程序而不是两个查询中进行一次查询。

答案 2 :(得分:0)

更改您的查询以删除聚合,然后只返回一列,例如

 SELECT gameid 
   FROM table
  WHERE gameid = ?
  LIMIT 1

您不需要计算行数,您只需要知道是否返回了行。

或者,您可以在查询中添加HAVING子句,以便在COUNT为零时不返回行...

 SELECT COUNT(*)
   FROM table
  WHERE gameid = ?
 HAVING COUNT(*) > 0  

您无需从返回的行中检索列的值,只返回一个空的结果集,并测试结果集是否为空,就像您的代码正在执行的那样。 / p>