2015-12-02 3 views
0

У меня есть серьезный вопрос об импорте данных из CSV в базу данных. Импорт сценария:PHP skip duplicates

if (file_exists('temp.csv')) { 

     $i=0; 
     require "connection.php"; 
     $handle = fopen("temp.csv", "r"); 
     try { 
    $import= $db->prepare("INSERT INTO adherence(
          dateandtime, 
          lastname, 
          firstname, 
          paidtime, 
          approvedtime, 
          notadhering) VALUES(
          ?,?,?,?,?,?)"); 
$i = 0;   
while (($data = fgetcsv($handle, 1000, ",", "'")) !== FALSE) { 
    if($i > 0) { 
     $data = str_replace('"', '', $data); 
     $myDate = date("Y/m/d",strtotime(str_replace('/','-',$data[0]))); 
     $import->bindParam(1, $myDate, PDO::PARAM_STR);    
     $import->bindParam(2, $data[1], PDO::PARAM_STR);     
     $import->bindParam(3, $data[2], PDO::PARAM_STR);     
     $import->bindParam(4, $data[3], PDO::PARAM_STR);     
     $import->bindParam(5, $data[4], PDO::PARAM_STR); 
     $import->bindParam(6, $data[5], PDO::PARAM_STR);    
     $import->execute(); 
    } 
    $i++; 
} 
fclose($handle); 

Проблема, мне нужно какое-то условная логика для проверки, если строка Allready существует в базе данных перед импортом, и пропустить его - если он существует. Как обращаться с такими вещами?

+0

SO - каковы критерии, которые существуют в этой строке? –

+1

Добавьте те атрибуты/столбцы, которые делают 2 строки дубликатом как ключ/индекс mysql. Затем используйте «insert ignore ...» для вставки только несуществующих строк. – maxhb

+0

Проблема в том, что есть несколько таблиц, которые содержат 8 элементов в таблице, 7 из них похожи на ключи. – JustinasT

ответ

2

В принципе у вас есть два разных способа подхода к нему.

1. с помощью РСУБД:

Используйте unique index в таблице. После того, как вы введете дубликат, , вы столкнетесь с ошибкой, которая может быть правильно отображена/зарегистрирована/что угодно.

2. с помощью логики приложения:

Поиск вашего товара перед вставкой с соответствующим SELECT заявление .. Если вы найти матч, не вставить.

Пример:

$sth = $db->prepare("SELECT yourfields FROM yourtable WHERE yourcondition = :cond"); 
$sth->bindParam(':cond',$yourvariable, PDO::PARAM_STR); 
$sth->execute(); 

if ($sth->rowCount() > 0) { 
    // results - don't insert 
} else { 
    // place your insert terms here 
} 

В большинстве условий, кодеры будет реализовывать первый способ, так как это уменьшает трафик между приложением и СУБД и делает вашу модель данных более надежной. Если это проблема, попробуйте второй способ.

+0

Спасибо. Во всяком случае, может быть, у вас есть пример второго пути? – JustinasT

+0

Вариант 2 на самом деле не вариант – Strawberry

+1

@JustinasT Я добавил пример. – Bjoern