在PHP中检查导入Excel中的重复记录

时间:2019-03-14 09:21:51

标签: php csv duplicates

我需要检查导入excel中的重复记录。当我单击导入时,重复的记录也会插入数据库表中。我不想在数据库表中插入重复的数据,但是我的代码在数据库表中插入了重复的记录。

这是我的代码

<?php

  if (isset($_POST["import"])) {
    ini_set('max_execution_time', 120); //300 seconds = 5 minutes

    //$filename = $_FILES['file']['name'];
    $file = $_FILES['file']['tmp_name'];
    //$ext=substr($file,strrpos($file,"."),(strlen($file)-strrpos($file,".")));
    //if($ext=="csv")

    $handle = fopen($file, "r");
    $c = 0;
    while(($filesop = fgetcsv($handle,",")) !== false)
    {
      //$filesop[] = fgetcsv($handle,",");
      $c++;

      if ($c == 1) { continue; }
      //$id = mysqli_real_escape_string($conn,$filesop[0]);
      $category = mysqli_real_escape_string($conn,$filesop[0]);
      $tags = mysqli_real_escape_string($conn,$filesop[1]);
      $title = mysqli_real_escape_string($conn,$filesop[2]);
      $url =mysqli_real_escape_string($conn,$filesop[3]);
      $description = mysqli_real_escape_string($conn,$filesop[4]);
      $date = date('Y-m-d', strtotime($filesop[5]));

      $check="SELECT * FROM `report` WHERE title='$title' AND url='$url'";
      $result=mysqli_query($conn,$check)or die($check."<br/><br/>".mysql_error());

      if(mysqli_num_rows($result) == 0)  //If no rows are returned
      {
        //print_r($filesop[0]);
        var_dump($filesop);
        //echo $filesop[0];

        $sql = "insert into report(category,tags,title,url,description,date) values ('$category','$tags','$title','$url','$description','$date')";

        $result=mysqli_query($conn,$sql)or die($sql."<br/><br/>".mysql_error());
        //echo $sql;
        print_r($_FILES);
        // 
        //echo $filesop[1];

        //echo "success";
      }
      else
        echo "duplicates found";
    }
  //if($result){
  //echo " upload success";

    exit();

     //ini_set('auto_detect_line_endings',FALSE);
    fclose($handle);

  // }
   //else
      // echo "cannot upload csv file"; 
  }

  mysqli_close($conn);      
?>

1 个答案:

答案 0 :(得分:0)

您的代码看起来有些疯狂。首先,您应该让数据库完成这项工作。在几乎所有用例中,数据库都比php快。为此,请在数据库表中定义一个唯一列。在唯一列中,值只能出现一次。这样,您可以更新此重复的唯一键上的条目。

如您的代码示例所示,您检查标题和URL。我建议根据条目的标题和网址构建一个哈希。该哈希将是唯一标识符。

$identifier = hash('sha256', $title . $url);

使用此唯一标识符,您可以通过一个查询轻松地插入或更新数据库。

$sql = "
    INSERT INTO 
        report 
        (category, tags, title, url, description, date, identifier) 
    VALUES 
        (?, ?, ?, ?, ?, ?, ?)
    ON DUPLICATE KEY UPDATE
        category = VALUES(category),
        tags = VALUES(tags),
        description = VALUES(description),
";

在此示例中,我们正在使用所谓的准备好的语句。我们这样做是为了以安全的方式执行您的sql语句。此外,我们避免调用使用预处理语句时真正不需要的这些真正的转义函数。

$stmt = mysqli_prepare($connection, $sql);
if (!$stmt) {
    // error handling here
}

$result = $stmt->bind_param('sssssss', 
    $category, 
    $tags,
    $title,
    $url,
    $description,
    $date,
    $identifier
);
if (!$result) {
    // error handling
}

// executing the insert statement
$result = $stmt->execute();
if (!$result) {
    // error handling
}

请记住,您需要数据库表中的唯一键索引才能使用重复键更新语法。因此,创建一个具有唯一索引的新列“标识符”。

CREATE UNIQUE INDEX index_name ON table_name(index_column_1);

希望对您有帮助。