Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] klaula WHERE ... IN (), a wysyłka maili w pętli., Klauzula zwraca tylko pierwszy atrybut...
rozny
post
Post #1





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




$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...


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rozny
post
Post #3





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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...
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Mission Impossible 20 .... pokaż kod po poprawkach.
Powód edycji: [nospor]:


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rozny
post
Post #5





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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. }


Ten post edytował rozny 12.04.2012, 12:16:00
Go to the top of the page
+Quote Post
nospor
post
Post #6





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rozny
post
Post #7





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


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...

Ten post edytował rozny 12.04.2012, 12:43:35
Go to the top of the page
+Quote Post
nospor
post
Post #8





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




nie: IN ('$mail_list[email_id]')
a: IN ($mail_list[email_id])


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
rozny
post
Post #9





Grupa: Zarejestrowani
Postów: 116
Pomógł: 0
Dołączył: 14.01.2004
Skąd: Zielona Góra

Ostrzeżenie: (0%)
-----


w jednym czasie wink.gif

tak czy inaczej dzięki za pomoc smile.gif
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 20:58