Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 插入前检查重复项_Php_Mysql_Duplicates - Fatal编程技术网

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){