在插入数据库之前,我使用以下代码检查重复项。对我而言,name
,description
,price
,city
和enddate
匹配时,副本仅被视为重复。
foreach($states_to_add as $item) {
$dupesql = "SELECT
COUNT(*)
FROM
table
WHERE
(
name = '$name'
AND description = '$description'
AND manufacturer = '$manufacturer'
AND city ='$city'
AND price = '$price'
AND enddate = '$end_date'
)";
$duperaw = mysql_query($dupesql);
if($duperaw > 0) {
echo nl2br("$name already exists in $city \n");
}
else {
$sql = "INSERT INTO table (..... (here go the values to be inserted)
....
在运行此检查之前定义每个值,我的结果总是在项目已存在时返回。我倾倒了“dupesql”并将命令复制/粘贴到phpmyadmin中,后者返回计数0.
答案 0 :(得分:15)
您想要执行以下操作:
$dupesql = "SELECT * FROM table where (name = '$name' AND description = '$description' AND manufacturer = '$manufacturer' AND city ='$city' AND price = '$price' AND enddate = '$end_date')";
$duperaw = mysql_query($dupesql);
if (mysql_num_rows($duperaw) > 0) {
//your code ...
}
有关详细信息,请参阅Here。
答案 1 :(得分:6)
我认为你的问题可分为两部分。为什么我的PHP代码不起作用?我不知道,不知道PHP和其他人似乎刚刚回答:-)。第二个问题是我如何检查重复?你正在以完全错误的方式检查重复。
在桌面上创建unique index / primary key。然后,当您尝试插入数据库时,如果存在重复,则会抛出错误。捕获错误并按照您的需要处理它。计算记录数绝对是错误的方法,并且会严重损害您的代码速度。
答案 2 :(得分:1)
您仍然可以遇到2个用户同时尝试插入重复项的竞争条件,同时使用select语句检查重复项,这样两个用户都可以继续插入记录。我更喜欢在数据库上设置唯一索引,然后捕获从数据库中冒出来的错误。
答案 3 :(得分:0)
试试这个:
foreach($states_to_add as $item) {
$dupesql = "SELECT
name
FROM
table
WHERE
(name = '$name'
AND description = '$description'
AND manufacturer = '$manufacturer'
AND city ='$city'
AND price = '$price'
AND enddate = '$end_date'
)";
$duperaw = mysql_query($dupesql);
if( mysql_num_rows($duperaw) ) {
echo nl2br("$name already exists in $city \n");
}
else {
$sql = "INSERT INTO table (..... (here go the values to be inserted)
答案 4 :(得分:0)
您不需要在PHP中检查唯一性,您可以在MySQL中进行整个测试:
INSERT INTO table1 (name, description, ......)
SELECT name1, description1, manufacturer1, city1, price1, enddate1
FROM (SELECT * FROM (
SELECT
@name:= '$name' as name1
,@description:= '$description' as description1
,.....
FROM DUAL as d1
LEFT JOIN table1 t1
ON (t1.name = d1.name1
AND t1.description = d1.description1
AND ......)
WHERE t1.name IS NULL) s1) s2
只有在通过唯一性测试时才会插入值。
答案 5 :(得分:0)
简而言之,您需要通过PHP进行检查,还需要在MySQL表中添加复合唯一约束,以获得两全其美的效果。
如果我们将你的问题分成两个单独的问题,那将是件好事。1-如何使用PHP检查重复项并在执行查询之前通知用户? 2-如何在MySQL中指定复合唯一约束?
首先,您需要一个简单的PHP函数来检查数据库中是否存在此记录,如下所示:
function is_exist($table, $data){
$sql = "SELECT * FROM `" . $table . "` WHERE ";
foreach ($data as $key => $val) :
$sql .= "`$key`='" . $val . "' AND ";
endforeach;
$sql = substr($sql,0, -5);
$result = $mysql_query($sql);
$count = $mysql_num_rows($result);
return ($count > 0) ? true: false;
}
你应该像下面这样调用你的PHP函数:
$data = array('column1'=>$_POST['value'],'column2'=>$_POST['value'], ...);
if(is_exist($data)){
// Print your error message
}else{
// Run your insert query
}
这样你就可以在进入MySql数据库之前防止重复,但是为了拥有一个重复的免费数据库,你需要在MySQL表中添加一个复合唯一约束。
这个简单的SQL命令可以解决这个问题:
alter table `tablename` add unique index(name, description, manufacturer, city, price, enddate);
我希望有所帮助,如果我搞乱任何东西,请为我负担。
答案 6 :(得分:0)
尝试以下
INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');