PHP прочитать файл для импорта MySQL - PullRequest
8 голосов
/ 27 ноября 2011

У меня есть веб-сайт, который позволяет людям отказаться от подписки на другие веб-сайты (на список рассылки, спам и т. Д.) *

мое веб-приложение позволяет клиентам и пользователям загружать зашифрованный список электронной почты для массовой отмены подписки.

У меня есть таблица: 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
  }
 }
}
}
}

функция проверки электронной почты проверить, если электронная почтаявляется неподписанным во всех списках, возвращает ложь, если все неподписано, и массив (список служб = домен), если его нет.

Теперь моя проблема заключается в том, что каждый раз, когда я хочу проверить, является ли электронная почта действительной, она возвращает ложь.мое шифрование работает нормально и это пуленепробиваемое доказательство.

что мне не хватает?

1 Ответ

13 голосов
/ 27 ноября 2011

Во-первых, ваш скрипт импортирует файл, используя \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 (не обработано)

(если вам нужно создать таблицу, которая читает все таблицы, вы можете создать таблицу слияния );

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();
  }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...