php读取文件用于mysql导入

标签 php mysql file import

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

我的网络应用程序允许客户和用户上传加密的电子邮件列表以进行批量退订。

我有一张 table :取消订阅。该表有电子邮件和域名。

文件结构是这样的:

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

here's my 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,如果没有则返回一个数组(服务列表 = 域)。

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

我错过了什么?

最佳答案

首先,您的脚本使用 \n 导入文件,但如果有人使用 \r\n 这样的 Windows 字符上传文件,您的脚本将无法运行。

其次,您的电子邮件正则表达式无法正常工作。我建议使用 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();
  }
 }
}

关于php读取文件用于mysql导入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8287033/

相关文章:

php - 插入 foreach 循环

php - 用表格中的 Logo 替换团队名称

c - 使用 C,我如何知道文件何时创建?

如果在启动时自动启动,则无法通过控制面板停止 Yosemite 上的 MySql

java - 如何在Java中按行将CSV文件分割成不同的CSV文件?

使用 C 文件处理更改本地路径上的文件名?

php - 来自 MySQL 表的 RecursiveArrayIterator

javascript - 表单在 php while 循环中呈现相同的数据

javascript - 正则表达式中的美元符号 "\$",字边界为 "\b"(PHP/JavaScript)

PHP 表单处理和浏览器行为