Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [HTML][MySQL][PHP] Jednorazowe wysłanie maila, mail wysyłany po spełnieniu warunku dat
zaworek
post
Post #1





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

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


Witam. Nie mam pomysłu jak skrypt ma sprawdzić czy wiadomość mailowa została już raz wysłana do odbiorcy.
Kod który obecnie posiadam wysyła mi maila przy każdorazowym odświeżeniu strony.

  1. // kod powyżej nieistotny
  2.  
  3. $mailto = "adres mailowy";
  4. $mailsubj = "temat wiadomosci";
  5. $mailhead = "MIME-Version: 1.0\n";
  6. $mailhead .= "Content-type: text/html; charset=UTF-8\n";
  7. $mailhead .= "From: adres mailowy\n";
  8. $uchwyt=mysql_connect('host','login','pass') or die ('Błąd połączenia');
  9. mysql_select_db('zur') or die('Nie można wybrać bazy');
  10. mysql_set_charset('utf8'); //ustawiam kodowanie znaków z bazy na UTF-8
  11. $all=mysql_query("SELECT * FROM zur ORDER BY workshop");
  12. while($wiersz=mysql_fetch_array($all))
  13. {
  14. $data['dzis'] = date('Y-m-d');
  15. $data['termin'] = date('Y-m-d',strtotime('30 day')); //30 dni od dziś
  16. if($wiersz['done'] == $data['dzis'])
  17. {
  18. $style = 'style="background-color: #F2F246;"';
  19. $mailbody = '<html><body>
  20. <FONT face=verdana size=2><p>Dziś mija termin dla poniższego sprzętu:</p></FONT>
  21. <table border=1>
  22. <tr>
  23. <th><FONT face=verdana size=2>Obiekt: '.$wiersz['workshop'].'</FONT></th>
  24. <th><FONT face=verdana size=2>TYP : '.$wiersz['typ'].'</FONT></th>
  25. <th><FONT face=verdana size=2>MODEL : '.$wiersz['model'].'</FONT></th>
  26. <th><FONT face=verdana size=2>SN : '.$wiersz['sn'].'</FONT></th>
  27. <th><FONT face=verdana size=2>DO : '.$wiersz['done'].'</FONT></th>
  28. </tr>
  29. </table>
  30. <FONT face=verdana size=2><p>Proszę nie odpowiadać na tego maila.</p></FONT>
  31. </body></html>';
  32. mail($mailto, $mailsubj, $mailbody, $mailhead);
  33. }// wysyła maila i koloruje wiersz tabeli na zółto jeżeli data w done = dacie dzisiejszej
  34. elseif($wiersz['done'] <= $data['termin'] || $wiersz['done'] < $data['dzis']){ $style = 'style="background-color: #FF5F5F;"'; }
  35. elseif($wiersz['done'] > $data['termin']){ $style = 'style="background-color: #9ACD32;"' ; }
  36. echo '<tr>
  37. <td align="center" '.$style.'>'.$wiersz['workshop'].'</td>
  38. <td align="center" '.$style.'>'.$wiersz['typ'].'</td>
  39. <td align="center" '.$style.'>'.$wiersz['model'].'</td>
  40. <td align="center" '.$style.'>'.$wiersz['sn'].'</td>
  41. <td align="center" '.$style.'>'.$wiersz['done'].'</td>
  42. </tr>';
  43. }
  44. //kod poniżej nieistotony


Ten post edytował zaworek 10.05.2011, 12:30:15
Go to the top of the page
+Quote Post
Hpsi
post
Post #2





Grupa: Zarejestrowani
Postów: 483
Pomógł: 50
Dołączył: 15.03.2005
Skąd: Poznań

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


W czasie wysłania zmianiasz status danemu uzytkownikowi na 1 np dodajesz rekord "WYSLENE" 0/1 i dodajesz warunek where wyslene =0 ?

Ten post edytował Hpsi+ 10.05.2011, 13:39:12


--------------------
Daiquiri: T1 = (dx/dt * s)^hpsi
Daiquiri: gdzie T1 - Twój czas przybycia na miejsce, dx/dt - prędkość, s droga
Daiquiri: brb trzeba by to poprawić T1 - Czas jaki Ci to zajmie
Daiquiri: Zatem T - czas dotarcia p T1 + T2 gdzie T2 = aktualny czas

===
po prostu kocham ją :D haha
Go to the top of the page
+Quote Post
zaworek
post
Post #3





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

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


Cytat(Hpsi+ @ 10.05.2011, 13:40:58 ) *
W czasie wysłania zmianiasz status danemu uzytkownikowi na 1 np dodajesz rekord "WYSLENE" 0/1 i dodajesz warunek wehere wyslene =0 ?


Tak też kombinowałem ale WHERE wyslane = 0 nie mogę dać tutaj :

  1. $all=mysql_query("SELECT * FROM zur ORDER BY workshop");


bo wówczas nie wyświetli mi wszystkich rekordów.
Ogólnie rzecz biorąc skrypt ma mi pomóc nadzorować terminy różnych czynności, a przy okazji zbliżania się konkretnych dat zmieniać kolorowanie wierszy no i słać do mnie ten nieszczęsny mail (nie mam użytkowników).

Jeżeli napiszę tak:
  1. if($wiersz['done'] == $data['dzis']){
  2. $style = 'style="background-color: #F2F246;"';
  3. mysql_query("UPDATE zur SET mail = '1'");
  4. }// zółty kolor jeżeli data w done = dzis, wstawia 1 do kolumny mail


to do każdego rekordu w kolumnie mail wstawi mi 1 czyli źle. Jak to powiązać z id wpisu?

Ten post edytował zaworek 10.05.2011, 13:22:25
Go to the top of the page
+Quote Post
nekomata
post
Post #4





Grupa: Zarejestrowani
Postów: 314
Pomógł: 44
Dołączył: 12.11.2010
Skąd: UK

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


Pobierasz wszystkie rekordy , ale wysyłasz tylko jak wysłane = 0 , i updatujesz w tym samym if'ie wysłane na 1....
Go to the top of the page
+Quote Post
zaworek
post
Post #5





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

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


To rozumiem, a wracając do wcześniejszego pytania jak powiązać update z id wpisu bo przy poniższej konstrukcji każdy rekord dostaje "1"?

  1. if($wiersz['done'] == $data['dzis']){
  2. $style = 'style="background-color: #F2F246;"';
  3. mysql_query("UPDATE zur SET mail = '1'");
  4. }// zółty kolor jeżeli data w done = dzis, wstawia 1 do kolumny mail
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




WHERE...
  1. UPDATE cośtam WHERE costam=costam


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

"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
zaworek
post
Post #7





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

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


Czy w tabeli jest 0 czy 1 i tak wysyła maila. Pewnie zrobiłem prosty błąd którego nie widzę.

  1. // część kodu sprawdzająca wrunek
  2.  
  3. if($wiersz['done'] == $data['dzis']){
  4. $style = 'style="background-color: #F2F246;"';
  5. if ($wiersz['mail'] == 0) //sprawdzam czy w tabeli jest 1 czy 0
  6. $mailbody = '<html><body>
  7. <FONT face=verdana size=2><p>Dziś mija termin dla:</p></FONT>
  8. <table border=1>
  9. <tr>
  10. <th><FONT face=verdana size=2>Cel: '.$wiersz['workshop'].'</FONT></th>
  11. <th><FONT face=verdana size=2>TYP : '.$wiersz['typ'].'</FONT></th>
  12. <th><FONT face=verdana size=2>MODEL : '.$wiersz['model'].'</FONT></th>
  13. <th><FONT face=verdana size=2>SN : '.$wiersz['sn'].'</FONT></th>
  14. <th><FONT face=verdana size=2>DO : '.$wiersz['done'].'</FONT></th>
  15. </tr>
  16. </table>
  17. <FONT face=verdana size=2><p>Proszę nie odpowiadać na tego maila.</p></FONT>
  18. </body></html>';
  19. mail($mailto, $mailsubj, $mailbody, $mailhead);
  20. mysql_query("UPDATE zur SET mail = '1' WHERE done = '$data[dzis]'"); //update pola mail na 1 - mail wyslany
  21. }



edit:

ok znalazłem problem, brakowało otwartej klamry po if ($wiersz['mail'] == 0) oraz drugiej zamykającej po mysql_query, po zmianie wygląda że jest ok.
dziękuję za wszystkie sugestie

Jednak nie jest dobrze. O ile kolorowanie wierszy funkcjonuje tak jak chciałem to wysyłanie powiadomień już nie.
Status czy wysłany (1) czy nie (0) działa poprawnie tylko dla ostatniego wyświetlanego rekordu z bazy danych. Zmiana innych uzależniona jest właśnie od niego.
Czemu skrypt się tak zachowuje?

  1. $mailto = "adres mailowy";
  2. $mailsubj = "Kalibracja sprzętu";
  3. $mailhead = "MIME-Version: 1.0\n";
  4. $mailhead .= "Content-type: text/html; charset=UTF-8\n";
  5. $mailhead .= "From: zur@sbe-online.pl\n";
  6. $uchwyt=mysql_connect('host','login','pass') or die ('Błąd połączenia');
  7. mysql_select_db('zur') or die('Nie można wybrać bazy');
  8. mysql_set_charset('utf8'); //ustawiam kodowanie znaków z bazy na UTF-8
  9. $all=mysql_query("SELECT * FROM zur ORDER BY workshop");
  10. while($wiersz=mysql_fetch_array($all))
  11. {
  12. $data['dzis'] = date('Y-m-d');
  13. $data['termin'] = date('Y-m-d',strtotime('30 day')); //30 dni od dziś
  14. if($wiersz['done'] == $data['dzis']){
  15. $style = 'style="background-color: #F2F246;"';
  16. if ($wiersz['mail'] == 0) { //sprawdzam czy mail był już wysłany 0 - nie, 1 - tak
  17. $mailbody = '<html><body>
  18. <FONT face=verdana size=2><p>Dziś mija termin kalibracji poniższego sprzętu:</p></FONT>
  19. <table border=1>
  20. <tr>
  21. <th><FONT face=verdana size=2>MIEJSCE: '.$wiersz['workshop'].'</FONT></th>
  22. <th><FONT face=verdana size=2>TYP : '.$wiersz['typ'].'</FONT></th>
  23. <th><FONT face=verdana size=2>MODEL : '.$wiersz['model'].'</FONT></th>
  24. <th><FONT face=verdana size=2>SN : '.$wiersz['sn'].'</FONT></th>
  25. <th><FONT face=verdana size=2>DO : '.$wiersz['done'].'</FONT></th>
  26. </tr>
  27. </table>
  28. <FONT face=verdana size=2><p>Proszę nie odpowiadać na tego maila.</p></FONT>
  29. </body></html>';
  30. mail($mailto, $mailsubj, $mailbody, $mailhead); //wysłanie maila na zdefiniowany adres
  31. mysql_query("UPDATE zur SET mail = '1' WHERE done = '$data[dzis]'"); //jeżeli mail wysyłany po raz pierwszy dopisuje 1 do kolumny mail w tym konkretnym rekordzie - działa tylko dla ostatniego rekordu z tabeli
  32. }
  33. }
  34. elseif($wiersz['done'] <= $data['termin'] || $wiersz['done'] < $data['dzis'])
  35. {
  36. $style = 'style="background-color: #FF5F5F;"';
  37. }
  38. elseif($wiersz['done'] > $data['termin']) //warunek kiedy termin jest odległy
  39. {
  40. $style = 'style="background-color: #9ACD32;"' ;
  41. mysql_query("UPDATE zur SET mail = '0'"); //zmienia status na 0 w kolumnie mail jeżeli data jest odległa od terminu (działa tylko jeżeli warunek dotyczy ostatniego rekordu w tabeli)
  42. }


Ten post edytował zaworek 10.05.2011, 14:32:09
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




CHłopie.... włącz myślenie.

mysql_query("UPDATE zur SET mail = '0'");
Znowu bezwarunkowo czyścisz wszystko, całą tabelę. Czyli jak coś ustawiłeś na 1, to gdy tylko wykona się linijka wyżej znowu wszystko ma 0

mysql_query("UPDATE zur SET mail = '1' WHERE done = '$data[dzis]'");
Czemu dajesz warunek na datę? Skoro robisz to dla każdego maila osobno to daj warunek na ID - na ten rekord, który właśnie przetwarzasz.


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

"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
zaworek
post
Post #9





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

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


Cytat(nospor @ 11.05.2011, 20:15:22 ) *
CHłopie.... włącz myślenie.

mysql_query("UPDATE zur SET mail = '0'");
Znowu bezwarunkowo czyścisz wszystko, całą tabelę. Czyli jak coś ustawiłeś na 1, to gdy tylko wykona się linijka wyżej znowu wszystko ma 0

mysql_query("UPDATE zur SET mail = '1' WHERE done = '$data[dzis]'");
Czemu dajesz warunek na datę? Skoro robisz to dla każdego maila osobno to daj warunek na ID - na ten rekord, który właśnie przetwarzasz.


@nospor podpowiesz mi jak napisać ten warunek? zakładam że wpierw trzeba sprawdzić dla których ID spełniony jest $wiersz['done'] == $data['dzis']
przyznam jednak szczerze że nie wiem jak to zrobić wstydnis.gif

Go to the top of the page
+Quote Post
nospor
post
Post #10





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




Zamiast
WHERE done = '$data[dzis]'
Masz dać:
WHERE done = '$wiersz[id]'

Zakładam, że każdy mail ma swoje ID w tabeli

Wracając do tego:
mysql_query("UPDATE zur SET mail = '0'");
po co w ogóle to robisz? Maile mają mieć wartość 0. Dopiero gdy mail wyślesz masz zmienić mu wartość na 1. W żadnym innym wypadku wartości już masz nie zmieniać. Na żadną ani na 0, ani na 1


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

"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
zaworek
post
Post #11





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

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


Cytat(nospor @ 11.05.2011, 21:42:59 ) *
Zakładam, że każdy mail ma swoje ID w tabeli

Wracając do tego:
mysql_query("UPDATE zur SET mail = '0'");
po co w ogóle to robisz? Maile mają mieć wartość 0. Dopiero gdy mail wyślesz masz zmienić mu wartość na 1. W żadnym innym wypadku wartości już masz nie zmieniać. Na żadną ani na 0, ani na 1


Zmiana na WHERE done = '$wiersz[id]' nic nie dała. Przy tym zapisie w tabeli zur kolumna mail 0 nie zmieniło się na 1. Mail oczywiście dotarł ale przy odświeżania przyjdzie kolejny i kolejny...

Jak wspomniałem to skrypt który ma mi przypominać o zbliżających się terminach konkretnie kalibracji sprzętu.
Update w tabeli o który pytasz ma się dokonywać jeżeli data w done zostanie przez administratora (oddzielny skrypt) zmieniona ( w ramach tego samego ID) i będzie to znowu "bezpieczny" czyli odległy termin.
Inaczej w kolumnie mail tkwiła by cały czas 1

Tak to sobie wykombinowałem...

Ten post edytował zaworek 11.05.2011, 21:40:24
Go to the top of the page
+Quote Post
nospor
post
Post #12





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




Cytat
Zmiana na WHERE done = '$wiersz[id]' nic nie dała.
No bo ja się pomyliłem a ty bezmyślnie skopiowałeś.

Skoro przyrównujemy id to ma być id a nie done
WHERE id = '$wiersz[id]'

Cytat
Update w tabeli o który pytasz ma się dokonywać jeżeli data w done zostanie przez administratora (oddzielny skrypt) zmieniona ( w ramach tego samego ID) i będzie to znowu "bezpieczny" czyli odległy termin.
Inaczej w kolumnie mail tkwiła by cały czas 1
No ok, ale przy zmianie na 0 też masz robić to z warunkiem a nie na całej tabeli.


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

"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
zaworek
post
Post #13





Grupa: Zarejestrowani
Postów: 62
Pomógł: 0
Dołączył: 27.06.2006

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


Wszystko jasne. Działa jak należy.

Dziękuję.
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 - 04:38