【问题标题】:Stop insert on duplicate停止重复插入
【发布时间】:2014-10-12 04:57:09
【问题描述】:

我有这个从数组插入电子邮件的代码。电子邮件列设置为unique,因此不应发生重复。

$pieces = explode(",", $email);

if (!empty($pieces)){

    foreach ($pieces as $value) {
       mysqli_query($con,"INSERT INTO name (`email`, `email_id`) VALUES ('$value', '$id')");
    }

   $num = mysqli_affected_rows($con);

        if($num != 0){  
            $response = 1;  // all record inserted

        }
        if (mysqli_errno($con) == 1062) {
            $response = 0; // duplicate entry, ALL RECORD SHALL NOT INSERTED.

        }

}   
else{

        $response = 2; // empty string, no query

}     

        $display = array('response' => $response);
        echo json_encode($display);  

我想做的是在找到重复的错误代码1062 后停止ALL 插入。问题是数组中的一些电子邮件不是唯一的,所以插入仍然发生。如何防止插入数组中是否存在唯一或非唯一电子邮件?

我知道我可以SELECT 并与$pieces 数组进行比较,但我现在只尝试做INSERT。有可能吗?

更新:我实际上尝试使用mysqli_affected_rowmysqli_errno($con) 设置我自己的错误代码并将其提供给用户。问题是即使在数组中得到唯一的电子邮件,插入仍然发生,所以这使我的错误代码无用,这就是为什么我认为我需要在插入期间停止它们。

【问题讨论】:

  • 这可能有点明显,但您的错误检查器在循环完成之前永远不会触发?
  • 也许您应该使用 SELECT + NOT IN ($email) 来获取不存在的电子邮件,然后才插入它?在我看来,依靠错误而不是自己检查是很奇怪的想法。 P.S.:您忘记分配从mysqli_query 收到的资源 id。
  • 如果这是生产代码,从安全的角度来看,这是一个非常糟糕的主意。
  • 你应该考虑使用事务,如果有重复,那么不要提交。

标签: php mysql arrays mysqli explode


【解决方案1】:

在循环中每次插入后检查响应,而不是执行所有插入然后检查结果(most recent function call)。

【讨论】:

    【解决方案2】:

    这是我解决它的方法。通过使用事务(提交)。

            $pieces = explode(",", $email);
    
            $total_pieces = count($pieces);
    
    if (!empty($email)){
            //insert
        $total = 0;
    
        mysqli_autocommit($con, FALSE); //http://stackoverflow.com/questions/12091971/how-to-start-and-end-transaction-in-mysqli
    
        foreach ($pieces as $value) {
          //echo "$value <br>";
            $result = mysqli_query($con,"INSERT INTO name (`email`, `email_id`) VALUES ('$value', '$id')");
    
            if ($result){   
                    $total = $total + count($value); // the total that succesfully insert not including duplicate.
            }
    
        }
    
        if ($total_pieces == $total){
            mysqli_commit($con); //INSERT INTO aren't auto committed because of the autocommit(FALSE)
            $response = 1;  //record updated
        }
        else{
            $response = 0; // duplicate record found!
        }
    
    
    }   
    else{
    
                $response = 2; // no record updated
    
    }           
    
                $display = array('response' => $response);
                echo json_encode($display);  
    

    感谢这里的每个人给我这个想法并试图提供帮助。

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2015-08-07
      • 1970-01-01
      • 2016-02-19
      • 2012-08-30
      • 1970-01-01
      • 1970-01-01
      • 2021-09-25
      • 2014-07-30
      相关资源
      最近更新 更多