2011-11-27 27 views
8

tôi có trang web cho phép mọi người hủy đăng ký các trang web khác (danh sách gửi thư hoặc spam ...)php đọc tệp để nhập mysql

ứng dụng web của tôi cho phép khách hàng và người dùng tải lên danh sách email được mã hóa cho hủy đăng ký hàng loạt.

tôi có một bảng: unsubs. bảng đó có email và tên miền.

cấu trúc tập tin là như thế này:

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

đây là PHP của tôi:

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

chức năng email kiểm tra kiểm tra nếu email là unsub trong tất cả các danh sách, trả về false nếu mọi thứ đều unsubscripbed và một mảng (danh sách các dịch vụ = tên miền) nếu không có.

hiện tại vấn đề của tôi là mọi lúc tôi muốn kiểm tra xem email có hợp lệ không trả về false. mã hóa của tôi hoạt động tốt và nó là bằng chứng đạn.

tôi đang thiếu gì?

Trả lời

13

Đầu tiên, tập lệnh nhập tệp bằng cách sử dụng \n nhưng nếu ai đó tải lên tệp có ký tự cửa sổ như \r\n tập lệnh của bạn sẽ không hoạt động.

Thứ hai, bạn gửi email regexp không hoạt động đúng cách. Tôi khuyên bạn nên sử dụng filter_var.

Điều tôi muốn giới thiệu cho bảng của bạn là tạo các bảng hàng ngày. Bằng cách này khi bạn truy vấn bảng của bạn, nó sẽ nhanh hơn để thực hiện. Nếu bạn chỉ có một bảng với varchar vì các chỉ mục này có thể chậm sau một thời gian (giả sử mọi người muốn chọn không tham gia trang web xấu [mà tôi nghĩ họ làm]) - nhưng đó chỉ là tôi.

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; 

Cách này dễ dàng xử lý lượng dữ liệu nhỏ mỗi lần. Tôi đã thêm trạng thái trong trường hợp bạn phải lặp lại quy trình để bạn chỉ xử lý dữ liệu với is_unsubscribed = 0 (không được xử lý)

(nếu bạn cần tạo bảng đọc tất cả các bảng bạn có thể tạo 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

tôi thích ý tưởng của việc tạo ra nhiều bảng cho mỗi ngày cho đến nay chúng tôi nhận được 10 tập tin từ khách hàng với 5k hoặc lâu hơn mỗi, sau vài năm nó sẽ là điên nhưng đó có nghĩa là sau khi vài năm chúng ta sẽ có 1000 bảng? – Gabriel

+0

bạn có thể lưu trữ chúng trong một bảng hàng năm hoặc hàng tháng mỗi năm một lần hoặc một tháng là hơn –

+0

oh đơn giản cảm ơn bạn rất nhiều – Gabriel

Các vấn đề liên quan