Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [HTML][MySQL][PHP] Jednorazowe wysłanie maila
Forum PHP.pl > Forum > Przedszkole
zaworek
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
Hpsi
W czasie wysłania zmianiasz status danemu uzytkownikowi na 1 np dodajesz rekord "WYSLENE" 0/1 i dodajesz warunek where wyslene =0 ?
zaworek
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?
nekomata
Pobierasz wszystkie rekordy , ale wysyłasz tylko jak wysłane = 0 , i updatujesz w tym samym if'ie wysłane na 1....
zaworek
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
nospor
WHERE...
  1. UPDATE cośtam WHERE costam=costam
zaworek
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. }
nospor
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.
zaworek
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

nospor
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
zaworek
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...
nospor
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.
zaworek
Wszystko jasne. Działa jak należy.

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