цикл запроса MySQL - PullRequest
       6

цикл запроса MySQL

1 голос
/ 19 апреля 2011

ребята, мне действительно очень нужна помощь в этом.2 дня я полностью застрял.Мне нужно направление, чтобы принять это, потому что то, что я делаю, явно не работает, и я очень расстроен.

Моя общая цель - ограничить количество писем, отправляемых на целевые домены, если этоустановить в базе данных для регулирования.причина заключается в том, чтобы максимизировать объем электронной почты, отправляемой с почтового сервера, + возможность настраивать параметры дроссельной заслонки на основе показателей отказов и других факторов. Например,

, если я установил частоту дроссельной заслонки на '100 'для gmail и yahoo, он вытянет максимум 100 записей LIKE' gmail 'и 100 записей LIKE' yahoo 'и продолжит их отправку.тем не менее, если для обработки больше нет дросселированных доменов, потяните $ rest_max, где они НЕ НРАВИТСЯ $ throttle_domain, и продолжайте их отправлять.

вопрос № 1 - как повторять первый запрос снова и снова до $throttle_domain исчерпан?

вопрос № 2 - как я могу получить записи, где они НЕ соответствуют домену газа и как я могу связать это с этим?

РЕДАКТИРОВАТЬ забыл упомянуть, что приведенный ниже код работает нормально, за исключением того, что он будет тянуть только 1 запись газа и останавливаться.

        $rest_max = '200';

        // this is where i need to loop!?
        $query = "SELECT * FROM `mailer_lists` WHERE `email` LIKE '%".$throttle_domain."' LIMIT ".$trim_speed."" ;
        $result = mysql_query($query) or die(mysql_error());
        while($row = mysql_fetch_array($result)){
        $email = $row['email'];
        $project = $row['project_name'];

        $querya = "SELECT * FROM `mailer_controller` WHERE `project_name` = '".$project."'" ;
        $resulta = mysql_query($querya) or die(mysql_error());
        while($rowa = mysql_fetch_array($resulta)){
        $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 contact from list only if it gets sent.
    mysql_query("DELETE FROM mailer_lists WHERE `project_name` = '".$project_name."' AND `email` = '$email' ") or die(mysql_error());  
    }}

Ответы [ 3 ]

3 голосов
/ 19 апреля 2011

Это должно удалить ненужные циклы и лишние запросы, это может решить не все ваши ответы, но может помочь вам на этом пути.

Я не тестировал этот код, поэтому сначала обязательно запустите его в тестовой среде, чтобы убедиться, что я не допустил простой ошибки, которая может привести к потере данных из-за характера запросов. заявление об отказе от ответственности, ПРОВЕРЬТЕ ПЕРВЫЕ С ДАННЫМИ ИСПЫТАНИЯ, ПОЖАЛУЙСТА .

    $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());  
}

Простой способ проверки - закомментировать часть mail, изменить DELETE FROM на SELECT * FROM и повторить то, что исходит от выбора, чтобы убедиться, что были получены правильные данные, которые должны были быть удалены.

ПОЖАЛУЙСТА, ПРОЧИТАЙТЕ НИЖЕ

Однако лучший способ сделать это - использовать поле Tables ID и сохранить его в $delete. Это уменьшит оператор OR и минимизирует ошибку случайного удаления допустимых строк. Вот как это будет работать (просто используйте окончание, замените ID на любое поле идентификатора:

    $delete[] = $row['id'];
}

if (!empty($delete)) {
    mysql_query("DELETE FROM mailer_lists 
        WHERE id IN(" . implode(', ', $delete) . ")") or die(mysql_error());  
}

UPDATE

Я не уверен, насколько быстро это будет происходить и т. Д. Но один из возможных способов сделать это, не имея его внутри цикла:

    // 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";

Опять же, это не проверено, и я не уверен, насколько он будет соответствовать производительности. Но кое-что для вас, чтобы проверить.

РЕДАКТИРОВАТЬ : изменено на fetch_assoc по сравнению с fetch_array

1 голос
/ 19 апреля 2011

почему бы вам не сделать что-то в этом духе? ​​Джон:

    $rest_max = '200';
    $email = array();
    $project = array();

    $query = "SELECT * FROM `mailer_lists`, `mailer_controller` WHERE mailer_lists.project_name = mailer_controller.project_name AND `email` LIKE '%".$throttle_domain."' LIMIT ".$trim_speed."" ;
    $result = mysql_query($query) or die(mysql_error());
    $count = mysql_num_rows($result);
    while($row = mysql_fetch_array($result)){
    $email[] = $row['email'];
    $project[] = $row['project_name'];
    }
    $rest_max = $rest_max - $count;
    if($rest_max > 0)
    {
            //repeat the process with the new domain
    }

Вы можете использовать объединение для выполнения обоих ваших запросов одновременно и использовать mysql_num_rows, чтобы увидеть, сколько результатов было возвращеновыберите, и используйте это, чтобы определить, достигли ли вы ваших 200 результатов еще.Вы также можете поместить все это в цикл for, но если вы используете только 2 домена, как вы упомянули выше, это будет лучший метод

0 голосов
/ 19 апреля 2011

Из того, что я вижу, вы делаете это:

$query = "SELECT * FROM `mailer_lists` WHERE `email` LIKE '%".$throttle_domain."' LIMIT ".$trim_speed."" ;

где вы могли бы делать это:

$query = "SELECT * FROM `mailer_lists` WHERE `email` LIKE '%$throttle_domain';";

Я заменил вашу конкатенацию ("string". $ Variable. "Morestring") на встроенные переменные ("string $ variable morestring"), потому что это немного легче выполнить без выделения IDE. Это все еще правильный синтаксис, и ваш интерпретатор PHP будет в порядке с ним. Но по фактическому изменению: упущение предложения LIMIT.

Удаляя LIMIT, вы возвращаете все сразу. Это хорошо, потому что это означает, что вместо выполнения n запросов при каждом запуске сценария вы выполняете два запроса. Это также хорошо, потому что он дает вам все ваши результаты сразу.

Затем вы можете перебрать результат с помощью mysql_fetch_array, или вы можете - и это здорово - использовать функцию типа mysql_fetch_all , чтобы превратить весь результат в стандартный массив. По некоторым причинам mysql_fetch_all не является частью модуля PHP MySQL, но реализации размещены в комментариях здесь:

http://php.net/manual/en/function.mysql-fetch-array.php

И тогда у вас будет весь ваш результат поиска в виде легкодоступного массива с ключами. Сексуально и просто.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...