Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Powiadomienie o nowej wiadomości
Forum PHP.pl > Forum > Przedszkole
stefik4
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 questionmark.gif
batman
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ść.
phpion
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?
stefik4
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 ?
phpion
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 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.
batman
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.
stefik4
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. ?>
phpion
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?
batman
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.
stefik4
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. ?>
phpion
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.
batman
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.
phpion
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ę" 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).
stefik4
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ł!
phpion
A co Ci wyświetli:
  1. <?php
  2. ?>

?
stefik4
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 ;/
phpion
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.
stefik4
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. ?>
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.