Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] klaula WHERE ... IN (), a wysyłka maili w pętli.
Forum PHP.pl > Forum > Przedszkole
rozny
Witam,

w tabeli bazy danych mam rekord, w któym przechowuje identyfikatory adresów email z innej tabeli. Chcę wysłać maile w pętli do wszystkich adresów, których identyfikatory znajdują się w tym rekordzie.

mój kod:

  1. $query = @mysql_query("SELECT `email_id` FROM distribution_lists WHERE id = ".$list_id) or displayError(3);
  2.  
  3. $mail_list = @mysql_fetch_assoc($query);
  4.  
  5. $query = @mysql_query("SELECT * FROM `users` WHERE id IN ('$mail_list[email_id]') AND verify_status = '1' AND send_status = 'to_send'") or displayError(3);
  6.  
  7. $i = 0;
  8.  
  9. while ($row = @mysql_fetch_assoc($query)) {
  10.  
  11. if ($i == 10) {
  12.  
  13. echo 'Wysłano newsletter pod pierwszą porcję adresów.';
  14. sleep(30);
  15. $i = 0;
  16.  
  17. }
  18.  
  19. else {
  20.  
  21. $mail->AltBody = "Otwórz tę wiadomość aplikacją obslugującą wiadomości HTML";
  22. $mail->MsgHTML($body);
  23. $mail->AddAddress($row['email'], $row['name']);
  24.  
  25. if(!$mail->Send()) {
  26.  
  27. echo "Błąd (" . str_replace("@", "@", $row['email']) . ')<br /> ' . $mail->ErrorInfo . '<br />';
  28.  
  29. }
  30.  
  31. else {
  32.  
  33. echo "Wiadomość wysłana do: " . $row["name"] . ' (' . str_replace("@", "@", $row["email"]) . ')<br />';
  34. $query = @mysql_query("UPDATE `users` SET send_status = 'sent' WHERE email = '$row[email]'") or displayError(3);
  35.  
  36. if (!$query) {
  37.  
  38. displayError(4);
  39.  
  40. echo $row[email];
  41.  
  42. }
  43.  
  44. else {
  45.  
  46. $mail->ClearAddresses();
  47. $mail->ClearAttachments();
  48. $i++;
  49.  
  50. }
  51.  
  52.  
  53. }
  54.  
  55. }
  56. }


echo $mail_list['email_id'] zwraca mi ciąg identyfikatorów po przecinku (1,2,3,4,...,n), więc składnia jest odpowiednia dla klauzuli IN(). Niemniej email i tak wysyła się tylko do 1 usera i pętla kończy bieg. Szukam na googlach przykładów z użyciem składni select z where in, ale przykładów użycia takiej kwerendy jest jak na lekarstwo i ciężko znaleźć coś co mnie nakieruje na rozwiązanie problemu. A może po prostu pętla jest źle skonstruowana? Bardzo proszę o pomoc lub chociaż nakierowanie na właściwe tory smile.gif
nospor
$query = @mysql_query("UPDATE `users` SET send_status = 'sent' WHERE email = '$row[email]'") or displayError(3);
W tej linijce w petli nadpisujesz zmienna $query, z której to korzystasz w pętli while... No mysl troche i nie nadawaj takich samych nazw zmiennym...
rozny
Masz rację, już poprawiłem. Niemniej nic się nie zmieniło wink.gif Nadal wysyła tylko pod pierwszy adres email i kończy pętle...
nospor
Mission Impossible 20 .... pokaż kod po poprawkach.
rozny
Dla pewności zmieniłem wsystkie "query" wink.gif

  1. $get_list = @mysql_query("SELECT `email_id` FROM distribution_lists WHERE id = ".$list_id) or displayError(3);
  2.  
  3. $mail_list = @mysql_fetch_assoc($get_list);
  4.  
  5. $get_emails = @mysql_query("SELECT * FROM `users` WHERE id IN ('$mail_list[email_id]') AND verify_status = '1' AND send_status = 'to_send'") or displayError(3);
  6.  
  7. $i = 0;
  8.  
  9. while ($row = @mysql_fetch_assoc($get_emails)) {
  10.  
  11. if ($i == 10) {
  12.  
  13. echo 'Wysłano newsletter pod pierwszą porcję adresów.';
  14. sleep(30);
  15. $i = 0;
  16.  
  17. }
  18.  
  19. else {
  20.  
  21. $mail->AltBody = "Otwórz tę wiadomość aplikacją obslugującą wiadomości HTML";
  22. $mail->MsgHTML($body);
  23. $mail->AddAddress($row['email'], $row['name']);
  24.  
  25. if(!$mail->Send()) {
  26.  
  27. echo "Błąd (" . str_replace("@", "@", $row['email']) . ')<br /> ' . $mail->ErrorInfo . '<br />';
  28.  
  29. }
  30.  
  31. else {
  32.  
  33. echo "Wiadomość wysłana do: " . $row["name"] . ' (' . str_replace("@", "@", $row["email"]) . ')<br />';
  34. $update = @mysql_query("UPDATE `users` SET send_status = 'sent' WHERE email = '$row[email]'") or displayError(3);
  35.  
  36. if (!$update) {
  37.  
  38. displayError(4);
  39.  
  40. echo $row[email];
  41.  
  42. }
  43.  
  44. else {
  45.  
  46. $mail->ClearAddresses();
  47. $mail->ClearAttachments();
  48. $i++;
  49.  
  50. }
  51.  
  52.  
  53. }
  54.  
  55. }
  56. }
nospor
Wywal całego while i zostaw jedynie
  1. while ($row = @mysql_fetch_assoc($get_emails)) {
  2. print_r($row);
  3. }
  4.  

Zwraca tylko jeden rekord czy wiecej?
rozny
tak, tylko jeden w tablicy... to zapytanie z klauzulą WHERE IN mi się nie podoba, wydaje mi się, że to tu jest hohlik...

wywaliłem apostrofy z klauzuli IN() i poszło...
nospor
nie: IN ('$mail_list[email_id]')
a: IN ($mail_list[email_id])
rozny
w jednym czasie wink.gif

tak czy inaczej dzięki za pomoc smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.