Dies sollte unnötige Schleifen und zusätzliche Abfragen entfernen, dies löst möglicherweise nicht alle Ihre Antworten, kann Ihnen aber auf dem Weg helfen.
Ich habe diesen Code nicht getestet, also stellen Sie sicher, dass Sie ihn zuerst in einer Testumgebung ausführen, um sicherzustellen, dass ich keinen einfachen Fehler gemacht habe, der zu Datenverlust führen könnte. Aufgrund der Art der Abfragen habe ich diesen Haftungsausschluss BITTE ZUERST MIT TESTDATEN TESTEN .
$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());
}
Eine einfache Möglichkeit zum Testen ist das Auskommentieren der mail
Teil und ändern Sie den DELETE FROM
zu SELECT * FROM
und wiederholen Sie, was von der Auswahl kommt, um sicherzustellen, dass die richtigen Daten, die gelöscht werden sollten, herauskamen.
BITTE UNTEN LESEN
Eine bessere Methode zum Löschen ist jedoch die Verwendung der ID
der Tabelle Feld und speichern Sie das in $delete
. Denn das würde das OR
erleichtern -Anweisung und minimieren Sie den Fehler, versehentlich gültige Zeilen zu löschen. So würde das funktionieren (nur die Endung verwendet, ID
ersetzen mit was auch immer Ihr ID-Feld ist:
$delete[] = $row['id'];
}
if (!empty($delete)) {
mysql_query("DELETE FROM mailer_lists
WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());
}
AKTUALISIEREN
Ich bin mir nicht sicher, wie schnell das laufen wird usw. Aber ein möglicher Weg, es zu tun, ohne es in einer Schleife zu haben, ist:
// 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";
Auch dies ist ungetestet, und ich bin mir nicht sicher, wie leistungsmäßig es zusammenpassen würde. Aber etwas zum Testen.
BEARBEITEN :Geändert in fetch_assoc
im Gegensatz zu fetch_array