Заявете DB, за да получите множество редове, където времевите марки са еднакви и имейл адресите са еднакви

<?php
$curr = time();

$time_query = "SELECT * FROM users ";

$time_query_result = mysql_query($time_query, $db) or 

die("Could not execute sql: $time_query"); 

$num_result = mysql_num_rows($time_query_result);

for ($i1=0; $i1 < $num_result; $i1++){

    $row = mysql_fetch_array($time_query_result); 


    if ($curr > $row["time"] + 259200)//Do if it has been three days since brochure was selected
    {
           $arr = implode (',', $row);//TURN THE ROW[BROCHURES] ARRAY INTO IMPLODE THING INSIDE THIS LOOP!?!?!
        echo $arr;
        $message1  = '<html><body><p>Brochure reminder</p>';
        $message1 .= 'Brochures:<br />'.$arr .$row["brochures"]. $row["time"];
        $message1 .= '</body></html>';
        // Mail it
        mail($row['email'], $subject, $message1, $headers);
    }

} ?>

Така че основно искам да изпратя имейл до клиентите, които избират брошура. Тази част е готова и е наред, но искам те да получат друг имейл след три дни, който да им напомня за брошурите, които са избрали. Настроих задача cron, така че тази част от кода се повтаря на всеки три дни.

Когато имейлът бъде изпратен, той го изпраща до правилния човек, но избраните брошури се разделят на отделни имейли. Например, ако някой избере 5 брошури, след три дни ще получи 5 отделни имейла с различна брошура във всеки един.

Трябва ми, за да получат всички брошури в един имейл след три дни. Наистина бих оценил това, което ме подлудява от дни. Изглежда, че отговорът може да е много прост, но не мога да го разбера.

Благодаря!


person JamesG    schedule 21.11.2011    source източник
comment
Друго важно нещо, което трябва да се отбележи е, че в базата данни, ако човек избере 5 брошури, това ще създаде 5 реда в базата данни, всеки с едно и също време и т.н., но брошурата ще бъде различна   -  person JamesG    schedule 22.11.2011


Отговори (1)


Трябва да преместите логиката на времето във вашата заявка за база данни - няма смисъл да извличате ВСИЧКИ редове, само да изхвърлите някои (повечето? всички?) от редовете, ако няма какво да правите:

SELECT *
FROM users
WHERE `time` < (now() - INTERVAL 3 DAY)

След като това бъде направено, бих предложил да преместите действителната част mail() извън цикъла за извличане на база данни, така че да можете първо да групирате брошурите на всеки потребител:

$users = array();
while($row = mysql_fetch_array($time_query_result)) {
    if (!array_key_exists($row['userID'], $users)) {
        $users[$row['userID']] = array('email' => $row['email'], 'brochures' => array());
    $users[$row['userID']]['brochures'] = array('b' => $row['brochures'], 't' => $row['time']);
    }
}

След това ще преминете през този масив $users, за да създадете имейли за потребителите:

foreach ($users as $user) {
     $text = '<html><body><p>Brochure reminder</p>';
     $i = 1;
     foreach ($user['brochures'] as $brochure) {
        $text .= 'Brochures:<br />'.$i++ .$row['b']. $row['b'];
     }
     $text .= '</body></html>';
     mail($user['email'], $subject, $text, $headers);
}

По този начин извличате всички потребителски данни наведнъж. След това създавате ЕДИН имейл до всеки потребител, изброявайки всички техни брошури и (да се надяваме) проблемът е решен.

person Marc B    schedule 21.11.2011
comment
Благодаря много за бързия отговор. - person JamesG; 22.11.2011
comment
Съжалявам, мислех, че enter ще ме отведе на нов ред - нов в този форум. Да, разбирам какво имате предвид, като преместите логиката на времето в заявката за DB, има смисъл. Това изглежда точно като това, което търся ха. Все още не мога да го изпробвам, но първо ще направя утре сутринта и ще публикувам обратно! Благодаря отново. - person JamesG; 22.11.2011
comment
@JamesG Добре дошли в StackOverflow. Ако случайно публикувате коментар, можете да го редактирате в рамките на 5 минути, просто задръжте курсора на мишката върху вашия коментар, щракнете върху опцията за редактиране. Можете също така да редактирате въпроси, за да добавите допълнителна информация, така че да не се налага да добавяте коментари. - person Adam Wenger; 22.11.2011
comment
@marc B Здравейте, имам заявка към базата данни, която работи добре, но казва, че array_key_exists се нуждае от друг параметър. Никога не съм използвал тази функция преди, съжалявам.. - person JamesG; 22.11.2011
comment
Мисля, че има нещо общо с реда с потребителски идентификатор, който получава от DB, не го разбрах, но имам един, наречен ID, който е автоматично увеличение. Добавих това, но все още не работи.. все още не е 100% това, което трябва да бъде вторият параметър. - person JamesG; 22.11.2011
comment
@jamesg: а, правилно. синтаксисът е: array_key_exists('key', $array). Ще коригирам отговора. - person Marc B; 22.11.2011
comment
@marc b - няма проблем, приятел, мисля, че го сортирах... while($row = mysql_fetch_array($time_query_result)) { ‹br› if (!array_key_exists($row[new], $users)) { ‹br› Благодаря много, наистина помогнах - person JamesG; 22.11.2011