PHP跳过重复

时间:2015-12-02 19:44:51

标签: php mysql sql database csv

我有关于将数据从CSV导入数据库的严重问题。 导入脚本:

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

问题是,我需要某种条件逻辑来检查,如果在导入之前数据库中已经存在行,并跳过它 - 如果它存在的话。如何处理这类事情?

1 个答案:

答案 0 :(得分:2)

基本上你有两种不同的方式来接近它。

<强> 1。通过rdbms:

在表格中使用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
}

在大多数情况下,编码人员将实施第一种方式,因为它减少了应用程序和RDBMS之间的流量,并使您的数据模型更加健壮。如果这是任何问题,请尝试第二种方式。