Detta borde ta bort onödiga loopar och extra frågor, detta kanske inte löser alla dina svar, men kan hjälpa dig på vägen.
Jag har inte testat den här koden, så se till att köra den i en testmiljö först för att försäkra mig om att jag inte gjorde ett enkelt misstag som kan leda till dataförlust, på grund av frågornas natur, jag sätter denna friskrivningsklausul, TESTA DET FÖRST MED TESTDATA SNÄLLA .
$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());
}
Ett enkelt sätt att testa är att kommentera mail
del och ändra DELETE FROM
till SELECT * FROM
och upprepa vad som kommer från markeringen för att se till att rätt data som borde ha raderats kom ut.
LÄS NEDAN
Ett bättre sätt att göra raderingen är dock att använda tabellerna ID
och lagra det i $delete
. Eftersom det skulle lindra OR
och minimera felet att oavsiktligt radera giltiga rader. Så här skulle det fungera (använde precis ändelsen, ersätt ID
med vilket id-fält du än har:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
UPPDATERA
Jag är inte säker på hur snabbt detta kommer att köras, etc. Men ett möjligt sätt att göra det utan att ha det i en loop är:
// 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";
Återigen är detta oprövat, och jag är inte säker på hur prestandamässigt det skulle matcha. Men något för dig att testa.
REDIGERA :Ändrad till fetch_assoc
till skillnad från fetch_array