2011-11-27 79 views
8

我有一個網站,讓人們退訂的其他網站(到郵件列表,或垃圾郵件等)PHP讀取文件mysql的輸入

我的web應用程序允許客戶和用戶上傳加密的電子郵件列表大量取消訂閱。

我有一個表:unsubs。該表具有電子郵件和域名。

的文件結構是這樣的:

 
jhq232q3hq2yq3yuh2qyuqU/A$Ja324ju3a4jah34u3w$UQ"$Uq4u 
q34/hRYHSEa34uw34uQ"/YQ/$84?%JHHdfhdFJKAjaRJSErjsrjse 
W%$?p09-*Y+_)y8p7uYJgADGq2/TYQgSj1qR"3tQ"/gEHseruDUId 

這裏是我的PHP:

function decrypt($line) { 
// do my logic etc... 
return $line; 
} 
function isEmail($email) { 
if(preg_match("/^([a-zA-Z0-9_-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9_-]+)+$/", $email)){ 
return true; 
} 
return false; 
} 

function checkEmail($email) { 
// logic 
return array('baddomain.com'); 
} 

function emailExists($email) { 
// my logic 
return TRUE; // for example 
} 

$file = file_get_contents('sample.txt'); 

$lines= explode("\n", $file); 
foreach($lines as $line) { 
if(!empty($line)) { 
$line = decrypt($line); 
if(isEmail($line)) { 
$services = checkEmail($line); 
if(is_array($service)) { 
    foreach($services as $service) { 
    insertEmail($db, $service, $line); // this is used 
    } 
} 
} 
} 
} 

檢查電子郵件功能檢查,如果郵件是在所有列表混蛋,返回false如果一切unsubscripbed和一個數組(服務列表=域),如果沒有。

現在我的問題是每次我想檢查一個電子郵件是否有效它返回false。 我的加密工作正常,它是防彈的。

我失蹤了什麼?

回答

13

首先,您的腳本使用\n導入文件,但如果有人使用Windows字符(例如\r\n)上載文件,您的腳本將無法工作。

其次,您的電子郵件正則表達式無法正常工作。我建議使用filter_var

我建議你的表格是創建每日表格。這樣,當你查詢你的表時,執行速度會更快。如果你只有一張以varchar作爲索引的表格,這可能會在一段時間後變慢(假設人們希望退出不良站點[我認爲他們這樣做]) - 但那只是我自己。

CREATE TABLE `unsub_20111127` (
    `email` varchar(255) NOT NULL, 
    `domain` varchar(255) NOT NULL, 
    `is_unsubscribed` tinyint(3) NOT NULL DEFAULT 0, 
    PRIMARY KEY (`email`, `domain`), 
    KEY is_unsubscribed (`is_unsubscribed`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

這樣,每次處理少量數據就更容易了。我說如果你有再次重複過程,因此只處理與is_unsubscribed = 0(不處理)

數據(如果你需要創建一個表,讀取所有的表,你可以創建一個merge table)的狀態;

PHP:

function insertEmail($db, $service, array $data) { 
    // logic for insert 
    $sql = 'INSERT IGNORE INTO table_YYYYMMDD VALUES ' . implode(',', $data); 
} 

function createTable($date) { 
    // logic for insert 
    $sql = 'CREATE TABLE IF NOT EXISTS table_' . $date . ' /* etc...*/'; 
} 

// start 

// create the table for the next day if not exists 
createTable(date('Ymd', strtotime('tomorrow'))); 

$file = file('sample.txt', FILE_IGNORE_NEW_LINES^FILE_SKIP_EMPTY_LINES); 

$emailList = array(); 

foreach($file as $line) { 
$line = decrypt($line); 
if(!filter_var($line, FILTER_VALIDATE_EMAIL)) { 
    $services = checkEmail($line); 
    if(is_array($services)) { 
    foreach($services as $service) { 
    $emailList[] = "('" . $line . "', '" . $service . "', 1)"; 
    } 
    if(!empty($emailList)) { 
    insertEmail($db, $service, $emailList); 
    } 
    $emailList = array(); 
    } 
} 
} 
+0

我喜歡每天創建多個表至今的想法,我們從5K左右,每個客戶得到10個文件,幾年後這將是瘋狂的,但意思後幾年我們會有1000多桌? – Gabriel

+0

你可以將它們存檔在一年或一年的表格中,一年或一個月結束一次 –

+0

哦,簡單的非常感謝你 – Gabriel