Dit zou onnodige loops en extra vragen moeten verwijderen, dit lost misschien niet al je antwoorden op, maar kan je op weg helpen.
Ik heb deze code niet getest, dus zorg ervoor dat je deze eerst in een testomgeving uitvoert om er zeker van te zijn dat ik geen simpele fout heb gemaakt die kan leiden tot gegevensverlies, vanwege de aard van de vragen, plaats ik deze disclaimer, TEST HET EERST MET TESTGEGEVENS AUB .
$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());
}
Een gemakkelijke manier om te testen is commentaar te geven op de mail
deel en verander de DELETE FROM
naar SELECT * FROM
en echo uit wat er uit de select komt om er zeker van te zijn dat de juiste gegevens die verwijderd hadden moeten worden eruit kwamen.
LEES HIERONDER
Een betere manier om de verwijdering uit te voeren is echter om de Tabellen ID
. te gebruiken veld en sla dat op in de $delete
. Omdat dat de OR
. zou verlichten statement en minimaliseer de fout van het per ongeluk verwijderen van geldige rijen. Hier is hoe dat zou werken (gebruikte zojuist het einde, vervang ID
met wat uw id-veld ook is:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
UPDATE
Ik weet niet zeker hoe snel dit zal werken, enz. Maar een mogelijke manier om het te doen, zonder dat het in een lus zit, is:
// 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";
Nogmaals, dit is niet getest en ik weet niet zeker hoe het qua prestaties overeenkomt. Maar iets voor jou om te testen.
BEWERKEN :Gewijzigd in fetch_assoc
zoals toegepast op fetch_array