Как проверить дубликаты записей при импорте файла Excel в базу данных с помощью PHP

#php #csv #duplicates

#php #csv #дубликаты

Вопрос:

Мне нужно проверить дублирующиеся записи в import 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. Можете ли вы объяснить, что происходит не так? Что вы ожидали увидеть, и что вы видите?

2. Я не хочу вставлять дублирующиеся данные в таблицу базы данных. но мой код вставляет дублирующиеся записи в таблицу базы данных.

3. Позвольте базе данных выполнить эту работу. Просто определите уникальный идентификатор и вставьте уникальный столбец в вашу таблицу. Там вы вставляете идентификатор. Таким образом, база данных может обрабатывать уникальные записи, и вы можете обновлять свои записи в базе данных по дублирующемуся ключу.

4. Я создал уникальный индекс для столбца title и столбца URL в моей базе данных. но если первая строка моего csv-файла является дублирующимся значением, другие значения строк не вставляются.

5. Вы читали мой ответ?

Ответ №1:

Ваш код выглядит немного сумасшедшим. Прежде всего, вы должны позволить базе данных выполнять эту работу. Почти во всех случаях использования база данных работает быстрее, чем php. Для этого определите уникальный столбец в таблице вашей базы данных. В уникальном столбце значение может присутствовать только один раз. С помощью этого вы можете обновить свою запись по этому дублирующемуся уникальному ключу.

Как показано в вашем примере кода, вы проверяете заголовок и URL. Я бы предложил создать хэш из заголовка и 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. Кроме того, мы избегаем вызова этих реальных escape-функций, которые нам действительно не нужны, при использовании подготовленных инструкций.

 $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);
  

Надеюсь, это помогло вам.