sql >> Databasteknik >  >> RDS >> Mysql

loopa en mysql-fråga

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



  1. Hur använder man MAX i MySQL?

  2. Gör en videodelningssida, behöver en videospelare

  3. PHP:Medan loopen inte fungerar efter att ha justerat SELECT för att förhindra SQL-injektion

  4. PHP mysql_connect set wait_timeout