Powinno to usunąć niepotrzebne pętle i dodatkowe zapytania, może to nie rozwiązać wszystkich twoich odpowiedzi, ale może ci pomóc.
Nie testowałem tego kodu, więc najpierw uruchom go w środowisku testowym, aby upewnić się, że nie popełniłem prostego błędu, który może doprowadzić do utraty danych, ze względu na charakter zapytań, zamieszczam to zastrzeżenie, NAJPIERW PRZETESTUJ Z DANYMI TESTOWYMI .
$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());
}
Łatwym sposobem na przetestowanie jest skomentowanie mail
część i zmień DELETE FROM
do SELECT * FROM
i powtórz to, co pochodzi z zaznaczenia, aby upewnić się, że pojawiły się prawidłowe dane, które powinny zostać usunięte.
PROSZĘ PRZECZYTAĆ PONIŻEJ
Jednak lepszym sposobem na usunięcie jest użycie ID
tabel pole i zapisz to w $delete
. Ponieważ to złagodziłoby OR
oświadczenie i zminimalizować błąd przypadkowego usunięcia poprawnych wierszy. Oto jak to działa (wystarczy użyć końcówki, zastąp ID
z dowolnym polem identyfikacyjnym:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
AKTUALIZUJ
Nie jestem pewien, jak szybko to będzie działać itp. Ale jednym z możliwych sposobów, aby to zrobić, bez umieszczania go w pętli, jest:
// 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";
Znowu jest to nieprzetestowane i nie jestem pewien, jak pod względem wydajności by to pasowało. Ale coś do przetestowania.
EDYTUJ :Zmieniono na fetch_assoc
jak w przypadku fetch_array