Thao tác này sẽ loại bỏ các vòng lặp không cần thiết và các truy vấn bổ sung, điều này có thể không giải quyết được tất cả các câu trả lời của bạn, nhưng có thể giúp ích cho bạn trong suốt quá trình.
Tôi chưa thử nghiệm mã này, vì vậy hãy đảm bảo chạy nó trong môi trường thử nghiệm trước để đảm bảo rằng tôi không mắc một lỗi đơn giản có thể dẫn đến mất dữ liệu, do bản chất của các truy vấn, tôi đưa ra tuyên bố từ chối trách nhiệm này, KIỂM TRA ĐẦU TIÊN VỚI DỮ LIỆU THỬ NGHIỆM VUI LÒNG .
$rest_max = '200';
$query = "SELECT *
FROM `mailer_lists` ml
JOIN `mailer_controller` mc ON ml.project_name = mc.project_name
WHERE `email` LIKE '%".$throttle_domain."' LIMIT ".$trim_speed."" ;
$result = mysql_query($query) or die(mysql_error());
$delete=array();
while($row = mysql_fetch_assoc($result)){
$email = $row['email'];
$project_name = $rowa['project_name'];
$from_name = $rowa['from_name'];
$from_email = $rowa['from_name']."@".$node_domain;
$subject = $rowa['subject'];
$body = $rowa['body'];
$content = addslashes($body);
// set header
$header_from = 'From: '.$from_name.' <'.$from_email.'>';
$header_reply_to = '-f '.$from_email;
// send mail
mail($email,$subject,$body,$header_from,$header_reply_to);
$delete[] = " (project_name = '$project_name' AND email = '$email') ";
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE " . implode(' OR ', $delete)) or die(mysql_error());
}
Một cách dễ dàng để kiểm tra là nhận xét mail
và thay đổi DELETE FROM
thành SELECT * FROM
và lặp lại những gì xuất phát từ vùng chọn để đảm bảo dữ liệu thích hợp đáng lẽ đã bị xóa xuất hiện.
VUI LÒNG ĐỌC BÊN DƯỚI
Tuy nhiên, cách tốt hơn để xóa là sử dụng ID
của Bảng và lưu trữ trường đó trong $delete
. Như vậy sẽ làm giảm bớt OR
và giảm thiểu lỗi vô tình xóa các hàng hợp lệ. Đây là cách nó sẽ hoạt động (chỉ cần sử dụng phần cuối, thay thế ID
với bất kỳ trường id nào của bạn là:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
CẬP NHẬT
Tôi không chắc điều này sẽ chạy nhanh như thế nào, v.v. Nhưng có một cách khả thi để làm điều đó mà không cần có nó bên trong vòng lặp là:
// Fill the array however you want to with the domains. this is just an example
$throttle = array('domain1.com', 'domain2.com', 'domain3.com');
$query = "SELECT *
FROM `mailer_lists` ml
JOIN `mailer_controller` mc ON ml.project_name = mc.project_name
WHERE `email` LIKE '%". implode("' OR `email` LIKE '%", $throttle) . "' LIMIT ".$trim_speed." ORDER BY project_name, email";
Một lần nữa, điều này vẫn chưa được kiểm tra và tôi không chắc nó sẽ phù hợp với hiệu suất như thế nào. Nhưng một cái gì đó để bạn kiểm tra.
CHỈNH SỬA :Đã thay đổi thành fetch_assoc
như được thêm vào fetch_array