【问题标题】:How to check the duplicate records while importing excel file in to database using PHP使用PHP将excel文件导入数据库时​​如何检查重复记录
【发布时间】:2019-08-05 03:09:23
【问题描述】:

我需要检查导入 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);      
?>

【问题讨论】:

  • 你能解释一下出了什么问题吗?你期望看到什么,你看到了什么?
  • 我不想在数据库表中插入重复数据。但是我的代码在数据库表中插入了重复记录。
  • 让数据库完成这项工作。只需定义一个唯一标识符并在表中插入一个唯一列。在那里插入标识符。因此数据库可以处理唯一条目,您可以在重复键上update您的数据库条目。
  • 我在我的数据库中为标题列和 url 列创建了唯一索引。但如果我的 csv 文件的第一行是重复值,其他行值不会插入。
  • 你看过我的回答了吗?

标签: php csv duplicates


【解决方案1】:

您的代码看起来有点疯狂。首先,您应该让数据库完成这项工作。在几乎所有用例中,数据库都比 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);

希望对你有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 1970-01-01
    • 2014-07-15
    • 2014-03-24
    • 2014-10-16
    • 2019-09-21
    • 2012-03-10
    相关资源
    最近更新 更多