Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Powiadomienie o nowej wiadomości
stefik4
post
Post #1





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


Witam. Mam zrobiona pocztę, która opreuje na tabeli `poczta` w bazie i tam zapisywane są wszystkie wiadomosci. Struktura bazy wygląd nastepująco:

Kod
CREATE TABLE `poczta` (
  `id` int(11) NOT NULL auto_increment,
  `nadawca` varchar(50) NOT NULL,
  `odbiorca` varchar(50) NOT NULL,
  `data` varchar(55) NOT NULL,
  `tytul` varchar(55) NOT NULL,
  `tresc` varchar(200) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin2 AUTO_INCREMENT=86;


I teraz jak zrobić, że gdy dojdzie nowa wiadomość do usera tego ktory jest zalogowany to pokazywlo sie jakies powiadomienie, że jest nowa wiadomośc (IMG:http://forum.php.pl/style_emoticons/default/questionmark.gif)
Go to the top of the page
+Quote Post
batman
post
Post #2





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Sposobów jest kilka.
1. Przy każdym odświeżeniu strony, trzeba sprawdzić, czy są jakieś nowe wiadomości dla danego użytkownika.
2. Jeśli użytkownik znajduje się na jakiejś stronie dłuższy czas, w tle może działać ajax, który co kilka minut sprawdzi, czy są jakieś nowe wiadomości.
3. W cronie chodzi skrypt, który sprawdza, czy są nowe wiadomości i wysyła maila z informacją, że pojawiała się nowa wiadomość.
Go to the top of the page
+Quote Post
phpion
post
Post #3





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Dodaj kolumnę, która będzie obrazowała to czy wiadomość została przeczytana. Kolumna powinna przyjmować wartości 0 (nieprzeczytana) oraz 1 (przeczytana). Aby wyświetlić powiadomienie o nowej wiadomości pobierasz dane (np. liczbę rekordów), dla których wartość tej kolumny to 0. Przy odczytywaniu wiadomości wykonujesz update ustawiający wartość kolumny na 1. Tyle.

batman:
Odnośnie punktu nr 3 to wydaje mi się, że lepiej wysyłać takowego maila w momencie "wysyłania" wiadomości przez jednego użytkownika do drugiego. Po co babrać się do tego z cronem?

Ten post edytował phpion 17.02.2009, 10:10:29
Go to the top of the page
+Quote Post
stefik4
post
Post #4





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


Phpion dzieki za podpowiedz zaraz zobaczę.
A takie pytanka:
1. Wartosc domyslną w bazie mam ustawić jako 0 (nieprzeczytana) czy przy wysylaniu lepiej?
2. i ta wartosc zmieniała by sie na 1 czyli przeczytana po otwarciu tego maila przez strone czytaj.php ?
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(stefik4 @ 17.02.2009, 12:14:09 ) *
1. Wartosc domyslną w bazie mam ustawić jako 0 (nieprzeczytana) czy przy wysylaniu lepiej?

Tak, wartość domyślną daj na 0. No chyba że chcesz aby zaraz po wysłaniu wiadomość została oznaczona jako przeczytana (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) hehe.

Cytat(stefik4 @ 17.02.2009, 12:14:09 ) *
2. i ta wartosc zmieniała by sie na 1 czyli przeczytana po otwarciu tego maila przez strone czytaj.php ?

Tak, w momencie gdy użytkownik czyta wiadomość (wyświetla ją na ekranie) dokonujesz aktualizacji statusu przeczytana/nieprzeczytana.
Go to the top of the page
+Quote Post
batman
post
Post #6





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat(phpion @ 17.02.2009, 10:09:02 ) *
batman:
Odnośnie punktu nr 3 to wydaje mi się, że lepiej wysyłać takowego maila w momencie "wysyłania" wiadomości przez jednego użytkownika do drugiego. Po co babrać się do tego z cronem?

Po to, by nie zarzynać strony serwisu, by wykonać wszystkie niezbędne operacje. Poza tym należy pamiętać o ustawieniach powiadomień, np wysyłanie maila raz dziennie ze zbiorczym raportem, lub wysyłanie maila z każdą nową wiadomością. Mimo, że w chwili obecnej może się to nie przydać, w przyszłości będzie znacznie prościej rozbudować serwis.
Go to the top of the page
+Quote Post
stefik4
post
Post #7





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


Ok dzięki.

Potem jak bedzie to robie "SELECT poczta WHERE username=zalogowanemu AND status=1(przeczytana)

I zwykly if ? Tylko jak to zapisac tego ifa z SELECTem ?

Czy bedzie to tak wygladac ?

  1. <?php
  2. $odbiorca = $_SESSION['username'];
  3. $zap = "SELECT * FROM `poczta` WHERE odbiorca='$odbiorca' ORDER BY `data` DESC";
  4. $wynik = mysql_query($wynik);
  5. $poka = mysql_fetch_array($wynik);
  6.  
  7. if ($poka['status'] = 0){echo ''; }
  8. if ($poka['status'] > 1){echo 'Masz nową wiadomość!!'; }
  9. ?>


Ten post edytował stefik4 17.02.2009, 10:23:55
Go to the top of the page
+Quote Post
phpion
post
Post #8





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




batman:
Tylko w takim przypadku potrzebujemy jeszcze jednego pola w tabeli, które by informowało o tym czy powiadomienie mailem zostało już wysłane czy nie (żeby nie wysyłać X razy tego samego powiadomienia).

stefik4:
Nie rozumiem. Jaki if?
Go to the top of the page
+Quote Post
batman
post
Post #9





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat(phpion @ 17.02.2009, 10:20:30 ) *
batman:
Tylko w takim przypadku potrzebujemy jeszcze jednego pola w tabeli, które by informowało o tym czy powiadomienie mailem zostało już wysłane czy nie (żeby nie wysyłać X razy tego samego powiadomienia).

Tak, tego samego, które podałeś w jednym z poprzednich postów. To pole i tak musi się znaleźć w tabeli.
Go to the top of the page
+Quote Post
stefik4
post
Post #10





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


Dwa posty wyżej napisałem taki szybki przykład. Tak to może wyglądąc w najprostszej postaci ?

Kurde nie moge sobie z tym poradzić;/

Plik wyswietlania wiadomosci:
  1. <?php
  2. error_reporting(E_ERROR | E_PARSE);
  3. include 'header.php';
  4. include "menu.html";
  5. include "config.php";
  6.  
  7. $get = $_GET['id'];
  8. if ($get == 'wyslane'){
  9.    
  10. $id = $_SESSION['userid'];
  11. $odbiorca = $_SESSION['username'];
  12.  
  13. $query = "SELECT * FROM `poczta` WHERE nadawca='$odbiorca' ORDER BY `data` DESC";
  14. $result = mysql_query($query);
  15.  
  16. if(isset($_GET['del']))
  17.        {
  18.        $del=$_GET['id'];
  19.        mysql_query("DELETE FROM poczta WHERE id='$del'");
  20.        echo '<center><b><font color=green>Wiadomość usunięta pomyślnie!</font></b></center>';
  21.        include "poczta.php";
  22.        }
  23.        
  24.  
  25.  
  26. echo '<table border=0><tr>
  27. <td width="150"><center>Data:</center></td>
  28. <td width="120"><center>Nadawca:</center></td>
  29. <td width="180"><center>Tytuł:</center></td>
  30. <td width="60"><center>Opcje:</center></td></tr>';
  31.  
  32. while ($row = mysql_fetch_array($result)){
  33.  
  34.    echo '<tr><td>'.$row['data'].'</td><td>'.$row['nadawca'].'</td><td><a href="czytaj.php?id='.$row['id'].'" style="text-decoration: none; color: #000000;"><b>'.$row['tytul'].'</a></b></td><td><input type=button value="Usuń" onClick=window.location="poczta.php?del='.$row['id'].'"></td></tr>';
  35.    
  36.    
  37. }
  38. echo '</table>';
  39. echo '<br><br><input type=button value=Napisz wiadomość onClick=window.location="poczta_napisz.php">';
  40.    }
  41.    
  42.  
  43.  
  44. $id = $_SESSION['userid'];
  45. $odbiorca = $_SESSION['username'];
  46.  
  47. $query = "SELECT * FROM `poczta` WHERE odbiorca='$odbiorca' ORDER BY `data` DESC";
  48. $result = mysql_query($query);
  49.  
  50.  
  51. $get = $_GET['id'];
  52. if ($get == 'sprawdz'){
  53.  
  54. $zap = "SELECT * FROM `poczta` WHERE odbiorca='$odbiorca'";
  55. $wynik = mysql_query($wynik);
  56. $poka = mysql_fetch_array($wynik);
  57.  
  58. if ($poka['status'] = 0){echo ''; }
  59. if ($poka['status'] > 1){echo 'Masz nową wiadomość!!'; }
  60.  
  61. }
  62.  
  63.  
  64.  
  65.  
  66. if(isset($_GET['del']))
  67.        {
  68.        $del=$_GET['del'];
  69.        mysql_query("DELETE FROM poczta WHERE id='$del'");
  70. header('Location: poczta.php');
  71.        }
  72. include "poczta.php?id=sprawdz";
  73. echo '<table border=0><tr>
  74. <td width="150"><center>Data:</center></td>
  75. <td width="120"><center>Nadawca:</center></td>
  76. <td width="180"><center>Tytuł:</center></td>
  77. <td width="60"><center>Opcje:</center></td></tr>
  78.  
  79.  
  80. ';
  81. while ($row = mysql_fetch_array($result)){
  82.  
  83.    echo '<tr><td>'.$row['data'].'</td><td>'.$row['nadawca'].'</td><td><a href="czytaj.php?id='.$row['id'].'" style="text-decoration: none; color: #000000;"><b>'.$row['tytul'].'</a></b></td><td><input type=button value="Usuń" onClick=window.location="poczta.php?del='.$row['id'].'"></td></tr>';
  84.    
  85.    
  86. }
  87. echo '</table>';
  88. echo '<br><br><input type=button value=Napisz wiadomość onClick=window.location="poczta_napisz.php">';
  89. ?>


Funkcje do pisania wiadomosci:
  1. <?PHP
  2. include "header.php";
  3. include "menu.html";
  4. include "config.php";
  5.  
  6. $nadawca = $_SESSION['username'];
  7. $odbiorca = $_POST['odbiorca'];    
  8. $tytul = $_POST['tytul'];
  9. $tresc = $_POST['text'];
  10. $data=date("Y-m-d H:i:s");
  11.  
  12.  
  13. $query = "INSERT INTO poczta (nadawca, odbiorca, tytul, tresc, data)
  14. VALUES('$nadawca', '$odbiorca', '$tytul', '$tresc', '$data')";
  15. mysql_query($query) or die(mysql_error());
  16.  
  17. echo '<center><b><font color=green>';
  18. echo 'Wiadomość wysłana pomyślnie!';
  19. echo '</font></b></center>';
  20.  
  21. $query = "UPDATE `poczta` SET `status`=1 WHERE ( i co tutaj ? ) ";
  22. mysql_query($query) or die(mysql_error());
  23. ?>


Ten post edytował stefik4 17.02.2009, 10:30:54
Go to the top of the page
+Quote Post
phpion
post
Post #11





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




batman:
No nie do końca bo co jeśli ktoś nie odbierze wiadomości w ciągu X dni? Wówczas otrzyma X razy to samo powiadomienie (przy założeniu, że wysyłka powiadomień odpalana jest raz na dobę).

stefik4:
Rozumiem, że nadal problemem jest wyświetlenie (lub nie) komunikatu o tym, czy użytkownik ma nową wiadomość. Jeśli tak to użyj czegoś takiego:
  1. <?php
  2. $q = 'SELECT COUNT(*) FROM `poczta` WHERE odbiorca="'.$odbiorca.'" AND `status`=0';
  3. $q = mysql_query($q);
  4.  
  5. if (mysql_result($q, 0) > 0) {
  6.    echo 'Masz nowa wiadomosc';
  7. }
  8. else {
  9.    // brak nowych wiadomosci
  10. }
  11. ?>

Nie sprawdzałem ale powinno działać. Pamiętaj tylko o odpowiednim zabezpieczeniu zmiennej $odbiorca (mysql_real_escape_string" title="Zobacz w manualu PHP" target="_manual). Ponadto powinieneś w tym polu trzymać ID użytkownika odwołujące się do tabeli z użytkownikami, a nie jego login.

PS: stefik4 - nie pomagam przez PW.

Ten post edytował phpion 17.02.2009, 10:41:37
Go to the top of the page
+Quote Post
batman
post
Post #12





Grupa: Moderatorzy
Postów: 2 921
Pomógł: 269
Dołączył: 11.08.2005
Skąd: 127.0.0.1




Cytat(phpion @ 17.02.2009, 10:39:29 ) *
batman:
No nie do końca bo co jeśli ktoś nie odbierze wiadomości w ciągu X dni? Wówczas otrzyma X razy to samo powiadomienie (przy założeniu, że wysyłka powiadomień odpalana jest raz na dobę).

Nie otrzyma wielu powiadomień, tylko jedno. Jednak należałoby dodać nową kolumnę, która określałaby status wysłania powiadomienia o wiadomości. Jeśli wiadomość nie została jeszcze przeczytana oraz nie wysłano powiadomienia, wówczas skrypt w cronie, wysyłałby maila z informacją o nowej wiadomości i zmieniałby status nowej kolumny, na wysłano.
Go to the top of the page
+Quote Post
phpion
post
Post #13





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(batman @ 17.02.2009, 12:45:02 ) *
Jednak należałoby dodać nową kolumnę, która określałaby status wysłania powiadomienia o wiadomości.

Właśnie o tym "mówię" (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg) Możnaby wręcz utworzyć osobną tabelę, w której byłaby przechowywana historia wysłanych powiadomień (ID wiadomości oraz data wysłania). Jednak wówczas zapytanie wybierające rekrody, do których należy wysłać powiadomienie troszkę by się skomplikowało (NOT EXISTS).
Go to the top of the page
+Quote Post
stefik4
post
Post #14





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


PHPion problem mam bardziej w zmianie statusu po wyslaniu od nadawcy i przy zmianie statusu przy odczyatniu wiaodmosci.

Edit:
Ze zmiana po wysalniu już sobie poradziłem, ale kod który napisałeś chyba nie działa bo w bazie sprawdzalem i ta wiadomosc wyslana do mnie ma wartość 1 czyli nie przeczytana a nie pisze nic ze masz nowa widomosc ;/

Zrobiłem wszystko, ładnie pieknie, ale... napis ze jes nowa wiadomosc pokazuje się ciągle, mim, że w bazie mamwszytkie odznaczone jako przeczytane ;/

użyłem takiego kodu:
  1. <?php
  2. $id = $_SESSION['userid'];
  3. $odbiorca = $_SESSION['username'];
  4.  
  5. $q = 'SELECT COUNT(*) FROM `poczta` WHERE odbiorca=\"'.$odbiorca.'\" AND `status`=0';
  6. $q = mysql_query($q);
  7.  
  8. if (mysql_result($q, 0) > 0) {
  9.   echo ' (!)';
  10. }
  11. else {
  12.   echo'  ';
  13.   }
  14. ?>


Dopiero jak usune wiadomośc za pomoca buttonu w poczcie to znika wykrzyknik ;/

jak to zrobić, żeby nawet jak ta wiadomośc będzie istniec i bedzie przeczytana to wykrzyknik o nowej znikał!

Ten post edytował stefik4 17.02.2009, 11:36:55
Go to the top of the page
+Quote Post
phpion
post
Post #15





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




A co Ci wyświetli:
  1. <?php
  2. ?>

?
Go to the top of the page
+Quote Post
stefik4
post
Post #16





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


To mi wyświetla:
Kod
string(1) "1"


Ponadto skrypt działa odwrotnie!
Jak wiadomosci sa przeczytane to wyswietla sie wykrzyknik a jak jets jakas nie przeczytana to nie ;/
Go to the top of the page
+Quote Post
phpion
post
Post #17





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(stefik4 @ 17.02.2009, 13:45:42 ) *
To mi wyświetla:
Kod
string(1) "1"

Czyli masz 1 wiadomość o statusie 0.

Cytat(stefik4 @ 17.02.2009, 13:45:42 ) *
Ponadto skrypt działa odwrotnie!
Jak wiadomosci sa przeczytane to wyswietla sie wykrzyknik a jak jets jakas nie przeczytana to nie ;/

To może zamieniłeś wartości? 0 = przeczytana, 1 = nieprzeczytana? Nie wiem, kombinuj.
Go to the top of the page
+Quote Post
stefik4
post
Post #18





Grupa: Zarejestrowani
Postów: 176
Pomógł: 1
Dołączył: 18.11.2007

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


0 - przeczytana
1 - nieprzeczytana.

Ok dzieku juz sobie poradziłem. Wklejam gotowy kod pokazywania ;]

  1. <?
  2.    $id = $_SESSION['userid'];
  3. $odbiorca = $_SESSION['username'];
  4.  
  5. $q = 'SELECT COUNT(*) FROM `poczta` WHERE odbiorca="'.$odbiorca.'" AND `status`=1';
  6. $q = mysql_query($q);
  7.  
  8. if (mysql_result($q, 0) > 0) {
  9.   echo '<font color="red"><b> (!)</b></font>';
  10. }
  11. else {
  12.   echo '';
  13.   }
  14. ?>


Ten post edytował stefik4 17.02.2009, 13:37:25
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.09.2025 - 16:47