我有这个代码从数组中插入电子邮件。电子邮件列设置为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);
我想要做的是在找到重复的错误代码ALL
后停止1062
插入。问题是阵列中的某些电子邮件并不是唯一的,因此仍然会发生插入。如何阻止插入阵列中是否有唯一或非唯一的电子邮件?
我知道我可以SELECT
并与$pieces
数组进行比较,但我现在只尝试INSERT
。有可能吗?
更新:我实际上尝试使用mysqli_affected_row
和mysqli_errno($con)
来设置我自己的错误代码并将其提供给用户。问题是,即使在阵列中获得了唯一的电子邮件,插入仍然会发生,因此我的错误代码无效,这就是为什么我认为我需要在插入过程中阻止它们。
答案 0 :(得分:1)
在循环中每次插入后检查响应,而不是执行所有插入,然后检查结果(most recent function call)。
答案 1 :(得分:0)
这就是我解决它的方式。通过使用事务(提交)。
$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);
感谢这里的每个人给我这个想法,并试图提供帮助。