Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [JavaScript][PHP][MySQL] Automatyczne wysyłanie wiadomości email po spełnieniu warunków
Forum PHP.pl > Forum > Przedszkole
brzanek
Witam planuję napisać funkcję do automatycznego masowego wysyłania wiadomości email o określonej treści do osób z z dresami zamieszczonymi w bazie danych mysql.
Jestem w trakcie pisania warunków i mam pierwszy problem.
  1. include('db.php');
  2.  
  3. $result = $mysqli->query("SELECT * FROM prognoza WHERE wtemperatureMax BETWEEN 22 AND 28 AND wtime=1562277600");
  4. //$result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =2 ORDER BY id ASC LIMIT 1");
  5. while($row = mysqli_fetch_array($result)) {
  6. echo "".$row['wid_miasto'].": ".ceil($row['wtemperatureMax'])."</br>";
  7. //temperatura
  8. if ($row['wid_miasto'] = 1)
  9. {
  10. echo "<i>wyślij emaila do choszczna</i>";
  11. }
  12. else if ($row['wid_miasto'] = 2)
  13. {
  14. echo "<i>wyślij emaila do szczecina</i>";
  15. }
  16. else if ($row['wid_miasto'] = 7)
  17. {
  18. echo "<i>wyślij emaila do dębna</i>";
  19. }
  20. else{
  21. // instrukcje, gdy wszystkie warunki nie są spełnione
  22. }
  23. }

Nie wiem dlaczego nie spełnia się ten warunek.
Powinien być napis wysyłany zostaje email do dębna a jest do choszczna.
Czy da się coś takiego zrobić?
Na tym przykładzie:
Temperatura jutro w jednej z miejscowości wyniesie od 22 do 25 stopni. W związku z tym dla mieszkańca tej miejscowości zostaje wysłane powiadomienie o treści np. We wtorek w m. Dębno temperatura powietrza wyniesie tyle i tyle.
W bazie danych będę przechowywał adresy email oraz np.miejscowości lub powiaty i na podstawie zapytania z bazy danych do odpowiednich ludzi zostaną automatycznie wysłane wiadomości.
W cronie planuję odświeżanie np. co godzinę i sprawdzanie warunków.
Może ktoś coś takiego widział i może mnie nakierować.

Kod do wysyłania email
  1. $kontakt_imie = 'Tytuł';
  2. $kontakt_nazwisko = 'Nazwa';
  3. $kontakt_email = 'adres@email';
  4. $kontakt_wiadomosc = 'tekst wiadomości';
  5.  
  6. if( $kontakt_imie == true )
  7. {
  8. $nadawca = $kontakt_email;
  9. $odbiorca = "adresyemail@zbazy";
  10. $client_ip = $_SERVER['REMOTE_ADDR'];
  11. $email_tresc = "Imie: $kontakt_imie \nNazwisko: $kontakt_nazwisko \nEmail: $nadawca \n\nWiadomość: \n\n$kontakt_wiadomosc \n\nIP: $client_ip \n\n";
  12. $extra = "From: $nadawca\r\n" . "Reply-To: $nadawca \r\n" . "X-Mailer: PHP/" . phpversion();
  13.  
  14. if( mail( $odbiorca, "Formularz kontaktowy", $email_tresc, $extra ) )
  15. {
  16. echo "wyslano=tak";
  17. }
  18. else
  19. {
  20. echo "wyslano=nie";
  21. }
  22. }
rad11
Bo używasz = zamiast == lub ===
brzanek
Mam coś takiego.
  1. include('db.php');
  2.  
  3.  
  4. // pobieranie daty z bazy danych w formacie unix
  5. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =1 ORDER BY id ASC LIMIT 1");
  6. while ( $row = mysqli_fetch_array($result) ) {
  7. $tm = $row['wtime'];
  8. }
  9. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =1 ORDER BY id ASC LIMIT 1,1");
  10. while ( $row = mysqli_fetch_array($result) ) {
  11. $tmm = $row['wtime'];
  12. }
  13. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =1 ORDER BY id ASC LIMIT 2,1");
  14. while ( $row = mysqli_fetch_array($result) ) {
  15. $tmmm = $row['wtime'];
  16. }
  17. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =1 ORDER BY id ASC LIMIT 3,1");
  18. while ( $row = mysqli_fetch_array($result) ) {
  19. $tmmmm = $row['wtime'];
  20. }
  21. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =1 ORDER BY id ASC LIMIT 4,1");
  22. while ( $row = mysqli_fetch_array($result) ) {
  23. $tmmmmm = $row['wtime'];
  24. }
  25. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =1 ORDER BY id ASC LIMIT 5,1");
  26. while ( $row = mysqli_fetch_array($result) ) {
  27. $tmmmmmm = $row['wtime'];
  28. }
  29. $result = $mysqli->query("SELECT * FROM prognoza WHERE wid_miasto =1 ORDER BY id ASC LIMIT 6,1");
  30. while ( $row = mysqli_fetch_array($result) ) {
  31. $tmmmmmmm = $row['wtime'];
  32. }
  33.  
  34. // sprawdzanie i pobieranie lokalizacji gdzie jest od 20 do 28 stopni. Zastosowany warunek do wysłania wiadomości email do odpowiedniej lokalizacji
  35.  
  36. $result = $mysqli->query("SELECT * FROM prognoza WHERE wtemperatureMax BETWEEN 20 AND 28 AND wtime =$tm");
  37. while($row = mysqli_fetch_array($result)) {
  38. echo "".$row['wid_miasto'].": ".ceil($row['wtemperatureMax'])."</br>";
  39. //temperatura
  40. if ($row['wid_miasto'] == 1)
  41. {
  42. echo "<i>wyślij emaila o temp. do choszczna</i>";
  43. }
  44. else if ($row['wid_miasto'] == 2)
  45. {
  46. echo "<i>wyślij emaila o temp. do szczecina</i>";
  47. }
  48. else if ($row['wid_miasto'] == 7)
  49. {
  50. echo "<i>wyślij emaila o temp. do dębna</i>";
  51. }
  52. else if ($row['wid_miasto'] == 26)
  53. {
  54. echo "<i>wyślij emaila o temp. do police</i>";
  55. }
  56. else{
  57. // instrukcje, gdy wszystkie warunki nie są spełnione
  58. }
  59. }
  60.  
  61. $result = $mysqli->query("SELECT * FROM prognoza WHERE wwindGust BETWEEN 50 AND 60 AND wtime =$tm");
  62. while($row = mysqli_fetch_array($result)) {
  63. echo "".$row['wid_miasto'].": ".ceil($row['wwindGust'])."</br>";
  64. //temperatura
  65. if ($row['wid_miasto'] == 1)
  66. {
  67. echo "<i>wyślij emaila o silnym wietrze do choszczna</i>";
  68. }
  69. else if ($row['wid_miasto'] == 2)
  70. {
  71. echo "<i>wyślij emaila o silnym wietrze do szczecina</i>";
  72. }
  73. else if ($row['wid_miasto'] == 7)
  74. {
  75. echo "<i>wyślij emaila o silnym wietrze do dębna</i>";
  76. }
  77. else if ($row['wid_miasto'] == 26)
  78. {
  79. echo "<i>wyślij emaila o silnym wietrze do police</i>";
  80. }
  81. else{
  82. // instrukcje, gdy wszystkie warunki nie są spełnione
  83. }
  84. }
  85.  
  86. // wysyłanie emaila
  87. $kontakt_imie = '...';
  88. $kontakt_nazwisko = '...';
  89. $kontakt_email = 'info@wp.pl';
  90. $kontakt_wiadomosc = 'tekst wiadomości';
  91.  
  92. if( $kontakt_imie == true )
  93. {
  94. $nadawca = $kontakt_email;
  95. $odbiorca = "pobieranie_adresów_z_bazy";
  96. $client_ip = $_SERVER['REMOTE_ADDR'];
  97. $email_tresc = "Imie: $kontakt_imie \nNazwisko: $kontakt_nazwisko \nEmail: $nadawca \n\nWiadomość: \n\n$kontakt_wiadomosc \n\nIP: $client_ip \n\n";
  98. $extra = "From: $nadawca\r\n" . "Reply-To: $nadawca \r\n" . "X-Mailer: PHP/" . phpversion();
  99.  
  100. if( mail( $odbiorca, "Formularz kontaktowy", $email_tresc, $extra ) )
  101. {
  102. echo "wyslano=tak";
  103. }
  104. else
  105. {
  106. echo "wyslano=nie";
  107. }
  108. }

Jak to teraz mogę połączyć z tym wysyłaniem emiali
com
napisz sobie funkcje do wysyłki tych email i w odpowiednich miejscach ja wywołuj wink.gif
brzanek
To znaczy muszę ją wywołać w każdym miejscu gdzie jest warunek? Czy dobrze rozumiem.
Bo tych miejsc trochę będzie.
Funkcję do wysyłki emaili?

Dodałem to do spełniającego warunki
  1. mail('adres@gmail.com', 'My Subject', 'W Dębnie temperatura osiągnie ponad 20 stopni');

Ale wiadomość nie dociera.
com
Po pierwsze nie mieszaj obiektowego mysqli z proceduralnym bo to tak nie działa. Jak uzywasz
  1. $mysqli->query(...);
  2.  
  3. // to tez powinieneś
  4. $mysqli->fetch_array();
  5.  
  6. // a nie
  7. mysqli_fetch_array(...);


Po drugie jeśli masz stałe id dla wid_miasto to poco pobierasz wszystkie pobierz tylko te i dla nich zrób wysyłkę. Tak ten kod do wysyłki email opakuj w funkcje i jeśli te warunki są konieczne bo dla każdego wysyłasz na inny adres np to tak w każdym miejscu wywołaj te funkcje a jak nie to wywołaj tylko raz na końcu wink.gif
brzanek
Ok zmieniłem kod do wysyłania na ten
  1. if(mail("adres@gmail.com", "temat", "W Dębnie temperatura osiągnie ponad 20 stopni", "From: info@pogoda-zachodniopomorskie.pl")){
  2. echo 'Wiadomość została wysłana.';
  3. } else {
  4. echo 'Błąd przy wysyłaniu wiadomości.';
  5. }

Teraz działa.
Zostaje mi tylko zrobić jakiś podział.
W bazie danych gdzie będę trzymał adresy email będą też nazwy powiatów przypisane do odpowiedniego adresu. Teraz aby wiadomości docierały do tych użytkowników gdzie będzie to konieczne muszę to jakoś rozgraniczyć.
com
Bo musisz poprawnie zdefiniować wysyłkę tych emaili, użyj lepiej biblioteki np Swift Mailer wink.gif
brzanek
Cytat(com @ 2.07.2019, 09:43:30 ) *
Po pierwsze nie mieszaj obiektowego mysqli z proceduralnym bo to tak nie działa. Jak uzywasz
  1. $mysqli->query(...);
  2.  
  3. // to tez powinieneś
  4. $mysqli->fetch_array();
  5.  
  6. // a nie
  7. mysqli_fetch_array(...);


Po drugie jeśli masz stałe id dla wid_miasto to poco pobierasz wszystkie pobierz tylko te i dla nich zrób wysyłkę. Tak ten kod do wysyłki email opakuj w funkcje i jeśli te warunki są konieczne bo dla każdego wysyłasz na inny adres np to tak w każdym miejscu wywołaj te funkcje a jak nie to wywołaj tylko raz na końcu wink.gif

id dla wid_miasto nie jest stałe za każdym razem po odświeżeniu warunków zmienia się.

Cytat(com @ 2.07.2019, 09:48:26 ) *
Bo musisz poprawnie zdefiniować wysyłkę tych emaili, użyj lepiej biblioteki np Swift Mailer wink.gif

A jak to działa. Pierwszy raz o tym słyszę. Dlaczego to jest lepsze?
com
tak jak mówiłem zrób z tego funkcje i jako parametry funkcji przekazuj adresy do wysyłki itd

Skoro działa Ci wysyłka to na razie możesz tak zostawić, ale nie wszystkie serwery maja funkcje mail i ta biblioteka jest pewna abstrakcja wiec łatwiej potem ja wymienić na inna w miarę potrzeb wink.gif

Ok, czyli zapewne nie potrzebujesz tylu tych ifów tylko potrzebujesz sprawdzić czy dla danego warunku jest to spełnione jak rozumiem wink.gif
brzanek
Cytat(com @ 2.07.2019, 09:56:57 ) *
Ok, czyli zapewne nie potrzebujesz tylu tych ifów tylko potrzebujesz sprawdzić czy dla danego warunku jest to spełnione jak rozumiem wink.gif

Dokładnie o to chodzi. Jeśli jakiś warunek nie zostaje spełniony to nic się nie wysyła.
Da się to jakoś okroić z tych ifów?
com
te id do których porównujesz skąd są pobierane?
brzanek
id?
Chyba wid_miasto.
To jest na stałe miejscowość ma stałą wartość ma swoje wid
viking
Jeśli dobrze cię rozumiem to zwykłe relacje
users: user_id
powiaty/wojewodztwa/co tam masz za poziom: pow_id
users_powiaty: user_id, pow_id

Albo
users: user_id
wojewodztwa: id_woj
woj_miasta: id_woj, wid_miasto
us_woj: user_id, id_woj
brzanek
a więc tak
mam tabelę
prognoza w której mam wid_miasto, tempmax, tempmin itd
oraz tabelę
emial w której też mam wid_miasto, miasto, adres
Teraz jeśli warunek w jakimś wid_miasto zostanie spełniony (wyżej w temacie) zostaje wysłany email do odpowiednich adresów z tego miasta.
com
no to pobierz dane z obu tabel w 1 zapytaniu, łącząc je za pomocą relacji w oparciu o klucz wid_miasto
brzanek
coś takiego?
  1. $result = $mysqli->query("SELECT * FROM prognoza AS t, email AS zt WHERE t.wtemperatureMax BETWEEN 20 AND 28 AND wtime =$tm");
com
poczytaj o łączeniu tabel np tu
Kod
https://www.samouczekprogramisty.pl/klauzula-join-w-zapytaniach-sql/
brzanek
ok czyli coś takiego?
  1. $result = $mysqli->query("SELECT * FROM prognoza INNER JOIN email ON prognoza.wid_miasto = email.email_wid_miasto WHERE wtime =$tm AND wtemperatureMax BETWEEN 20 AND 28");
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.