sql >> Database >  >> RDS >> Mysql

een mysql-query herhalen

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



  1. oracle - converteer veel datumnotaties naar een enkele opgemaakte datum

  2. MariaDB JSON_EXTRACT() uitgelegd

  3. Update de rangorde in een MySQL-tabel

  4. MySQL - Meerdere WHEN-voorwaarden combineren in CASE