用于mysql导入的php读取文件

Gab*_*iel 8 php mysql import file

我有一个网站,允许人们取消订阅其他网站(邮件列表,或垃圾邮件等...)

我的网络应用程序允许客户和用户上传加密电子邮件列表以进行大规模取消订阅.

我有一张桌子: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
  }
 }
}
}
}
Run Code Online (Sandbox Code Playgroud)

检查电子邮件功能检查所有列表中的电子邮件是否取消,如果所有内容都未取消,则返回false,如果没有,则返回数组(services = domain列表).

现在我的问题是每次我想检查电子邮件是否有效它返回false.我的加密工作正常,它是防弹.

我错过了什么?

Boo*_*eus 13

首先,您的脚本使用导入文件,\n但如果有人使用Windows字符上传文件,那么\r\n您的脚本将无效.

其次,您发送电子邮件regexp无法正常工作.我建议使用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;
Run Code Online (Sandbox Code Playgroud)

这样,每次处理少量数据都会更容易.我添加了一个状态,以防你再次重复处理,所以你只处理数据is_unsubscribed = 0(未处理)

(如果需要创建一个读取所有表的表,则可以创建合并表);

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();
  }
 }
}
Run Code Online (Sandbox Code Playgroud)