За последние 24 часа нас посетил 24221 программист и 1547 роботов. Сейчас ищут 1286 программистов ...

Как отправить массив данных через функцию mail в цикле while?

Тема в разделе "PHP для новичков", создана пользователем petyann, 10 апр 2022.

Метки:
  1. petyann

    petyann Активный пользователь

    С нами с:
    8 июл 2015
    Сообщения:
    30
    Симпатии:
    0
    Подскажите, как отправить массив данных через функцию mail в цикле while?
    Есть код, который берёт из базы данных элементы, сравнивает даты их добавления за последний день и выводит на экран данные эти данные (ID, Модель и дату добавления).
    Если функцию mail засунуть прямо в него, то, полагаю, что если таких элементов, скажем, штук 100, то он мне отправит отдельно 100 писем, что не есть хорошо.
    Если эта функция стоит в конце (как сейчас), то выводит лишь один элемент.
    Необходимо, чтобы в одном письме мне приходило то же самое, что выводится на экран.
    Сейчас код такой:

    Код (Text):
    1. <?php
    2. $days = 1;
    3. $query = "SELECT date_modified, model, product_id FROM oc_product WHERE TO_DAYS(NOW()) - TO_DAYS(date_modified) <= $days;";
    4. $result = mysqli_query($link, $query);
    5.  
    6. while ( $row = mysqli_fetch_array( $result ) ) {
    7.     if($row) {echo "<br>Новый";};
    8. $date=$row['date_modified'];
    9. $model=$row['model'];
    10. $product_id=$row['product_id'];
    11. ?>
    12. <br>ID:&nbsp;
    13. <?php
    14. print_r($product_id);
    15. ?>
    16. <br>Модель:&nbsp;
    17. <?php
    18. print_r($model);
    19. ?>
    20. <br>Дата добавления:
    21. <?php
    22. print_r($date);
    23. ?>
    24. <br>
    25. <?php
    26. }
    27. $to      = 'pochta@pochta.ru';
    28. $subject = 'the subject';
    29. $message = 'ID: ' . $product_id . "\n" . 'Модель: ' .  $model . "\n" . 'Дата добавления: ' . $date . "\n";
    30. $headers = 'From: info@voltgarant.ru' . "\r\n" . 'X-Mailer: PHP/' . phpversion();
    31. $result = mail($to, $subject, $message, $headers);
    32. ?>
     
  2. twim32

    twim32 Активный пользователь

    С нами с:
    29 мар 2017
    Сообщения:
    275
    Симпатии:
    58
    Убери отправку почты из цикла. генерируй html и потом выводи на экран и отправляй по почте
     
    petyann нравится это.
  3. petyann

    petyann Активный пользователь

    С нами с:
    8 июл 2015
    Сообщения:
    30
    Симпатии:
    0
    Идея интересная.
    Так отправка почту у меня как раз за пределами цикла.
    HTML там тоже генерируется — он в браузере выводится, если сам файл в браузере запустить. А как его отправить через mail, ума не приложу.
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.820
    Симпатии:
    648
    ЧЁ прям тот же HTML должен отправляться? Использование разных вьюшек – это норм. Для мыла контент можно делать и путем нанизывания отдельных кусков строки, т.е. конкатенацией.
    --- Добавлено ---
    Перед циклом – $message = ''; внутри – $message .= $productinfo;

    P.S. Но лучше с такими знаниями не лезть в код сайта, который должен реально работать.
     
    petyann нравится это.
  5. petyann

    petyann Активный пользователь

    С нами с:
    8 июл 2015
    Сообщения:
    30
    Симпатии:
    0
    Так сайт у меня уже давно реально работает. А это я просто решил дополнительно небольшой скрипт сделать себе для удобства.
     
  6. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.820
    Симпатии:
    648
    Я об этом и говорю. Лучше не лезьте, а то будет бо-бо.
    --- Добавлено ---
    Хотя если там какой-то «ларек», то в общем-то пусть криво работает, пусть ломают :)
     
  7. antoniii

    antoniii Активный пользователь

    С нами с:
    16 мар 2022
    Сообщения:
    419
    Симпатии:
    71
    Объяви перед циклом while массив. В цикле добавляй к массиву каждый $row. После цикла сформируй строку из массива. Перебрать его через foreach и сделать конкатенацию. Итоговую строку отправь по почте.
     
    petyann нравится это.
  8. petyann

    petyann Активный пользователь

    С нами с:
    8 июл 2015
    Сообщения:
    30
    Симпатии:
    0
    О, а это идея. Мне так даже проще получается. Спасибо.
     
  9. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.820
    Симпатии:
    648
    Если нра. на пустом месте циклы лепить, хотя бы не делайте это сами: implode() ;)
     
  10. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.820
    Симпатии:
    648
    Второй цикл можно влепить для второй вьюшки. Но тогда для экономии памяти его лучше делать на той же $result. При этом в первой вьшке должна использоваться спец. ф-ция получения строки:
    PHP:
    1. function previewrow(mysqli_result $result)
    2. {
    3.   if ($row=$result->fetch_assoc()) return $row;
    4.   $result->data_seek(0);
    5.   return FALSE;
    6. }
    Обычная ф-ция могла бы выглядеть так:
    PHP:
    1. function getrow(mysqli_result $result)
    2. {
    3.   if ($row=$result->fetch_assoc()) return $row;
    4.   $result->free();
    5.   return FALSE;
    6. }
    Когда не хотят в «экранной» вьюшке менять обычную ф-цию на спец., создание экранной вьюшки опускают в самый конец кода, например в return из контроллера, а вьюшку для мыла создают первой и в ней используют спец. ф-цию.

    Также можно не париться и делать в осн. ф-ции data_seek(0) вместо free() ;)
     
    #10 miketomlin, 11 апр 2022
    Последнее редактирование: 11 апр 2022
    petyann нравится это.
  11. petyann

    petyann Активный пользователь

    С нами с:
    8 июл 2015
    Сообщения:
    30
    Симпатии:
    0
    Спасибо, отличный вариант!