2011-11-27 15 views
8

mam stronę internetową, która pozwoli ludziom zrezygnować z innych stron internetowych (na liście dyskusyjnej lub spam etc ...)php odczytać pliku do importu mysql

moja aplikacja internetowa pozwala klientom i użytkownikom na przesyłanie zaszyfrowanych e-mail do listy masowa rezygnacja z subskrypcji.

Mam tabelę: unsubs. ta tabela ma adres e-mail i domenę.

struktura plików jest tak:

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

oto moja 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 
    } 
} 
} 
} 
} 

funkcja check email Sprawdź, czy e-mail jest unsub we wszystkich listach, zwraca false, jeżeli wszystko jest unsubscripbed i tablicę (lista usług = domena), jeśli żadna.

Teraz mój problem jest za każdym razem, gdy chcę sprawdzić, czy e-mail jest poprawny, zwraca false. Moje szyfrowanie działa poprawnie i jest odporne na kulki.

czego mi brakuje?

Odpowiedz

13

Najpierw skrypt importuje plik za pomocą \n, ale jeśli ktoś prześle plik o znaku Windows, takim jak \r\n, twój skrypt nie będzie działał.

Po drugie, wiadomość e-mail z wyrażeniem regularnym nie działa poprawnie. Polecam użyć filter_var.

Co mogę polecić dla twojego stołu to tworzenie codziennych stołów. W ten sposób, gdy zapytasz o stół, będzie on szybszy do wykonania. Jeśli masz tylko jedną tabelę z varchar jako indeksy, może to być powolne po kilkukrotnym czasie (zakładając, że ludzie chcą zrezygnować ze złej strony [co myślę, że robią]) - ale to tylko ja.

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; 

W ten sposób łatwiejsze jest przetwarzanie niewielkiej ilości danych za każdym razem. Dodałem statusów przypadku trzeba powtórzyć proces, więc tylko przetwarzać dane z is_unsubscribed = 0 (nie przetworzonych)

(jeśli trzeba utworzyć tabelę, która odczytuje wszystkie tabele można utworzyć 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

podoba mi się pomysł tworzenia wielu tabel za każdy dzień do tej pory mamy 10 plików od klientów z 5k lub tak każdy, po kilku latach to będzie szalony, ale jest to znaczy, że po za kilka lat będziemy mieć ponad 1000 stołów? – Gabriel

+0

możesz je archiwizować w tabelach rocznych lub miesięcznych raz w roku lub miesiącu ponad –

+0

ooo bardzo dziękuję bardzo – Gabriel