2011-11-27 78 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