Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [JavaScript][PHP][MySQL] Automatyczne wysyłanie wiadomości email po spełnieniu warunków
brzanek
post 1.07.2019, 12:49:26
Post #1





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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


Ten post edytował brzanek 1.07.2019, 12:51:37
Go to the top of the page
+Quote Post
rad11
post 1.07.2019, 13:03:46
Post #2





Grupa: Zarejestrowani
Postów: 1 270
Pomógł: 184
Dołączył: 7.10.2012
Skąd: Warszawa

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


Bo używasz = zamiast == lub ===
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 08:05:51
Post #3





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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
Go to the top of the page
+Quote Post
com
post 2.07.2019, 08:18:08
Post #4





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


napisz sobie funkcje do wysyłki tych email i w odpowiednich miejscach ja wywołuj wink.gif
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 08:40:26
Post #5





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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.
Go to the top of the page
+Quote Post
com
post 2.07.2019, 08:43:30
Post #6





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 08:45:59
Post #7





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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ć.
Go to the top of the page
+Quote Post
com
post 2.07.2019, 08:48:26
Post #8





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


Bo musisz poprawnie zdefiniować wysyłkę tych emaili, użyj lepiej biblioteki np Swift Mailer wink.gif
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 08:51:31
Post #9





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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?
Go to the top of the page
+Quote Post
com
post 2.07.2019, 08:56:57
Post #10





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


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
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 08:59:45
Post #11





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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?
Go to the top of the page
+Quote Post
com
post 2.07.2019, 09:03:18
Post #12





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


te id do których porównujesz skąd są pobierane?
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 09:09:59
Post #13





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


id?
Chyba wid_miasto.
To jest na stałe miejscowość ma stałą wartość ma swoje wid
Go to the top of the page
+Quote Post
viking
post 2.07.2019, 09:17:55
Post #14





Grupa: Zarejestrowani
Postów: 6 365
Pomógł: 1114
Dołączył: 30.08.2006

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


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


--------------------
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 09:26:41
Post #15





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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.
Go to the top of the page
+Quote Post
com
post 2.07.2019, 09:43:03
Post #16





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


no to pobierz dane z obu tabel w 1 zapytaniu, łącząc je za pomocą relacji w oparciu o klucz wid_miasto
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 09:53:34
Post #17





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


coś takiego?
  1. $result = $mysqli->query("SELECT * FROM prognoza AS t, email AS zt WHERE t.wtemperatureMax BETWEEN 20 AND 28 AND wtime =$tm");
Go to the top of the page
+Quote Post
com
post 2.07.2019, 09:56:35
Post #18





Grupa: Zarejestrowani
Postów: 3 033
Pomógł: 366
Dołączył: 24.05.2012

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


poczytaj o łączeniu tabel np tu
Kod
https://www.samouczekprogramisty.pl/klauzula-join-w-zapytaniach-sql/


Ten post edytował com 2.07.2019, 09:59:17
Go to the top of the page
+Quote Post
brzanek
post 2.07.2019, 10:13:20
Post #19





Grupa: Zarejestrowani
Postów: 427
Pomógł: 0
Dołączył: 8.11.2012

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


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");
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 Wersja Lo-Fi Aktualny czas: 20.04.2024 - 02:18