Цикл по базе данных, чтобы получить детали, а затем отправить электронное письмо с указанными значениями - PullRequest
0 голосов
/ 22 ноября 2011

Я приношу брошюры, отобранные посетителями, и они могут выбрать несколько брошюр. Через три дня они должны получить электронное письмо с напоминанием о выбранных ими брошюрах.

Вот что у меня есть:

$time_query = "SELECT * FROM users WHERE time < (now() - INTERVAL 1 minute)"; //" //GROUP BY time does group them into an array... well.. it doesnt display duplicate timestamps, so assume it saves it to an array'";

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

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

        $users = array();

        while($row = mysql_fetch_array($time_query_result)) {

            if (!array_key_exists($users[$row["id"]], $users)) {

                $users[$row["id"]] = array('email' => $row["email"], 'brochures' => array());
                $users[$row["id"]]["brochures"] = array('b' => $row["brochures"], 't' => $row["time"]);

            }

        }

        foreach ($users as $user) {

            $text = '<html><body><p>Brochure reminder</p>';
              $i = 0;

            foreach ($user["brochures"] as $brochure) {

                $text .= 'Brochures:<br />'.$i++ . $row["b"];
            }

            $text .= '</body></html>';
            mail($user["email"], $subject, $text, $headers);
        }

Я получаю числа через электронные письма вместо названий брошюр, и я думаю, что это как-то связано с функцией array_key_exists.

Каждый раз, когда пользователь выбирает брошюру, он создает свою собственную строку в БД, и идея заключалась в том, чтобы вытянуть несколько брошюр, выбранных пользователем одновременно (по столбцу времени), так как многие пользователи могут выбирать брошюры в период времени.

Любая помощь будет оценена :)

Ответы [ 2 ]

0 голосов
/ 22 ноября 2011

Ваш текущий код создает массив пользователей, содержащий другой массив с индексом «брошюры».Этот массив всегда будет содержать значения буксировки.

{
    'b' => $row["brochures"]
    't' => $row["time"])
}

В связи с этим следующие утверждения не имеют смысла:

foreach ($user["brochures"] as $brochure) {

}

Все, что вам нужно сделать, это перебрать два значения с индексом«б» и «т».Если вы хотите перебрать коллекцию брошюр, вам нужно адаптировать свой код.


С другой стороны, у вас есть несколько важных ошибок:

foreach ($user["brochures"] as $brochure) {
    $text .= 'Brochures:<br />'.$i++ . $row["b"];
}

Зачем использовать foreachесли вы даже не используете переменную $ брошюр?

$text .= 'Brochures:<br />'.$i++ . $row["b"];

$ строка содержит последнюю строку, что, безусловно, не то, что вы хотели.Фактически, $ row находится вне области видимости, на серьезном языке программирования вы могли бы видеть это.

$row["id"]

Вы используете это примерно три раза.Так почему бы не сохранить его в переменной $ id?Доступ к массивам с индексами - более дорогая операция, чем простой доступ к переменной.

В общем, я настоятельно рекомендую вам перейти к объектно-ориентированному подходу, чтобы избавиться от этого уродливого массива в массиве в решении массива ...

0 голосов
/ 22 ноября 2011

В цикле 'while' вы создаете новый элемент 'брошюр' в своем массиве 'users', когда я думаю, что вы хотите добавить его.

if (!array_key_exists($row["id"], $users)) {
    $users[$row["id"]] = array('email' => $row["email"], 'brochures' => array());
}
$users[$row["id"]]["brochures"][] = array('b' => $row["brochures"], 't' => $row["time"]);

тогда в вашем 'foreach' вы захотите использовать переменную брошюры:

foreach ($user["brochures"] as $brochure) {
    $text .= 'Brochures:<br />'.$i++ . $brochure["b"];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...