Php 插入前检查重复项
在插入数据库之前,我将使用以下代码检查重复项。对我来说,只有当Php 插入前检查重复项,php,mysql,duplicates,Php,Mysql,Duplicates,在插入数据库之前,我将使用以下代码检查重复项。对我来说,只有当名称、说明、价格、城市、和结束日期匹配时,副本才被视为副本 foreach($states_to_add as $item) { $dupesql = "SELECT COUNT(*) FROM table WHERE (
名称
、说明
、价格
、城市
、和结束日期
匹配时,副本才被视为副本
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 您要执行以下操作:
$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 ...
}
有关更多信息,请参阅。试试这个:
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)
在我看来,你的问题可以分为两部分。为什么我的PHP代码不起作用?我不知道,不太懂PHP,其他人似乎刚刚回答了这个问题:-)。第二个问题是如何检查重复项?你在用完全错误的方法检查副本
在您的表上创建一个/s。然后,当您尝试插入数据库时,如果存在重复数据,则会抛出一个错误。抓住错误,按照你的意愿处理它。计算记录的数量肯定是错误的,并且会严重影响代码的速度。您仍然可能遇到两个用户同时尝试插入DUP的竞争条件,同时使用select语句检查DUP会让两个用户都可以插入他们的记录。我更喜欢在数据库上设置唯一索引,然后捕获数据库中出现的错误。您不需要在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
这只会在值通过唯一性测试时插入值。简而言之,您需要通过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);
我希望这会有帮助,如果我弄乱了什么,请给我增加负担。试试下面的内容
INSERT IGNORE INTO person_tbl (last_name, first_name)
-> VALUES( 'Jay', 'Thomas');
如果您保留COUNT(*),则始终会有一行,因此问题尚未解决。您是对的,我忘记将
COUNT(*)
更改为name
或*
在您的SELECT和INSERT之间可能会发生从其他位置插入的操作,那么您将破坏数据。不要自己进行唯一性检查,在数据库中添加唯一约束并忽略预期的“唯一约束冲突”错误。不是多个用户向数据库中添加信息,而是一个人每天分析一次或两次新提要。出于这个原因,性能并不是一个很大的问题。当我继续这个项目并且填写了更多的数据时,我正在阅读这篇文章,我还不能100%确定(目前)如何根据我描述的所有值(名称、描述、价格、城市、结束日期)来指定唯一的索引/主键。@Mike,我包括了MySQL官方网站的链接,这应该会给你一些帮助。仔细想想,看看答案,你其实不需要让你的PHP代码正常工作。如果您尝试插入并捕获异常,那么代码的其余部分就不需要了……谢谢!我正在仔细阅读。不过,就目前而言,使用if count>0似乎是可行的。我担心将来的扩展,在我添加更多的过滤器进行检查时,必须更改主键的参数。我在每个过滤器上插入了大约20-30个值,从我现在的观点来看,这可能会变得相当混乱,尽管我很可能是错的。先生,您输入错了。。如果(mysql_num_rows($duberaw)>0){