簡體   English   中英

使用PHP將大CSV文件導入MySQL數據庫並檢查重復項

[英]Importing big CSV files to MySQL database using PHP with checking for duplicates

我希望你能幫助我。 我搜索了很多,但不幸的是沒有找到任何東西。 有什么問題? 我有1列的大型CSV文件,其中包含電子郵件地址。 單個文件中大約有50000行。 我正在創建管理面板,該面板允許使用HTML表單和PHP將這些文件導入服務器。 通過PHP將CSV導入MySQL數據庫很簡單,但是我還需要更多-檢查每個電子郵件是否存在,如果是,請跳過它。 有什么問題? 該表有大約一百萬條記錄,檢查一封電子郵件持續+/- 3秒。 50000條記錄乘以3 ...這將需要分鍾。 44小時! PHP腳本在不到10分鍾后停止響應...因此無法通過這種方式進行操作:

function doesExist($email) {
    $sql = "SELECT count(*) as counter FROM mailing_subscribers WHERE subscriber_email LIKE :subscriber_email";
    $sth = $this->db->prepare($sql);
    $sth->execute(array(':subscriber_email' => $email));
    $row = $sth->fetch();
    $counter = $row->counter;
    if ($counter > 0) {
        return true;
    } else {
        return false;
    }
}

function importCSV($file,$group) {            

    $fp = fopen($file['tmp_name'], "r");
    $importsCounter = 0;

    while($csv_line = fgetcsv($fp)) {
        for ($i = 0, $j = count($csv_line); $i < $j; $i++) {
            if (!$this->doesExist($csv_line[$i])) {
                $sql = "INSERT INTO mailing_subscribers(subscriber_email,subscriber_group) VALUES('".$csv_line[$i]."','".$group."')";
                $sth = $this->db->prepare($sql);
                $sth->execute();
                $importsCounter++;
            }
        }
    }

    $_SESSION["feedback_positive"][] = FEEDBACK_FILE_IMPORT_SUCCESSFUL . " Utworzonych wpisów: " . $importsCounter;
}

$file$_FILE數組。

還有其他更快的方法嗎?

以下是我的建議:

1)在臨時表中加載您的csv文件。 參考http://dev.mysql.com/doc/refman/5.1/en/load-data.html

2)它將在幾秒鍾內非常快地加載您的批量csv數據。 現在使用插入查詢,並通過重復值檢查將數據從臨時表插入到主表中。

例如

1)假設您已在名為“ TempTable”的臨時表中加載了csv數據

2)說您的主表名稱是“ mailing_subscribers”

3)說您不想插入重復的記錄。

您的查詢將類似於:

插入到mailing_subscribers(subscriber_email,cola,colb ..)中,從TempTable中選擇“ subscriber_email,cola,colb ..”,其中“ subscriber_email”不在其中(從mailing_subscribers中選擇“ users_email”)

如果您遇到任何問題,請告訴我。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM