Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [skrypt] system wiadomości prywatnych
Forum PHP.pl > Inne > Oceny
samuello
Proszę o ocenę prostego systemu wiadomości prywatnych wykorzystującego bazę danych.

Struktura tabeli mysql:
Kod
CREATE TABLE `msg` (
  `msg_id` int(11) NOT NULL auto_increment,
  `msg_temat` varchar(30),
  `msg_tresc` text,
  `msg_nadawca` int(11),
  `msg_odbiorca` int(11),
  `msg_przeczytane` tinyint(1),  -- czy wiadomość została przeczytana
  `msg_data` datetime,
  `msg_czyja` tinyint(1),
  PRIMARY KEY  (`msg_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

Pole msg_czyja pozwala zidentyfikować kto napisał wiadomość. Przy wysłaniu wiadomości powstają dwa wpisy do bazy... msg_czyja = 1 - wiadomość wyświetlana w skrzynce nadawczej nadawcy, msg_czyja = 0 - wiadomość wyświetlana w skrzynce odbiorczej odbiorcy.

Skrypt wysyłający wiadomość:

  1. <?php
  2. session_start(); //start sesji
  3. require_once('connect.php');
  4. require_once('funkcje/skrypty.php');
  5. ?>
  6.  
  7. <html>
  8. <head>
  9. <title>wylij wiadomoć</title>
  10. <?php include('tpl/head.php') ?>
  11. </head>
  12. <body>
  13. <?php include('tpl/naglowek.php') ?>
  14.  
  15. <div id="srodek">
  16.  
  17. <?
  18. if (isset($_SESSION['login']) & isset($_SESSION['user_id']))
  19. { //jeżeli użytkownik jest zalogowany:
  20. $nadawca = mysql_real_escape_string(htmlspecialchars($_SESSION['login']));
  21. //sprawdzenie czy zmienna w GET jest liczba:
  22. $fotoid = intval($_GET['id']);
  23. //sprawdzenie czy istnieje taki odbiorca:
  24. list($records) = mysql_fetch_row(mysql_query("SELECT count(*) FROM users WHERE login='$odbiorca'"));
  25.  
  26. if ($fotoid == '0' or $records == '0' or $fotoid == NULL)
  27. {
  28. echo "Błędny adres strony.";
  29. }
  30. else
  31. {
  32. if ($_POST['wiadomosc'])
  33. { //sprawdzenie wprowadzonych przez uzytkownika danych do formularza wiadomosci:
  34. if ($_POST['tresc'] == NULL)
  35. {
  36. $error1 = "Wpisz tresc wiadomosci";
  37. }
  38. else
  39. {
  40. $wyslij ="OK";
  41. }
  42. }
  43.  
  44. if (isset($wyslij))
  45. { //jeżeli wszystko jest OK to wiadomosc jest dodawana do bazy:
  46. $wiadomosc = mysql_real_escape_string(strip_tags(htmlspecialchars($_POST['tresc'])));
  47.  
  48. //Wiadomoć do skrzynki odbiorczej odbiorcy -> czyja=0, wiadomoć do skrzynki nadawczej nadawcy -> czyja =1
  49. $dodaj_nad = "INSERT INTO `msg`(`msg_id`, `msg_temat`, `msg_tresc`, `msg_nadawca`, `msg_odbiorca`, `msg_przeczytane`, `msg_data`, `msg_czyja`)
  50. VALUES ('', 'Wiadomość prywatna', '$wiadomosc', '$nadawca', '$odbiorca', '0', DATE_ADD(NOW(),INTERVAL 6 HOUR), '1')";
  51. $dodaj_odb = "INSERT INTO `msg`(`msg_id`, `msg_temat`, `msg_tresc`, `msg_nadawca`, `msg_odbiorca`, `msg_przeczytane`, `msg_data`, `msg_czyja`)
  52. VALUES ('', 'Wiadomość prywatna', '$wiadomosc', '$nadawca', '$odbiorca', '0', DATE_ADD(NOW(),INTERVAL 6 HOUR), '0')";
  53.  
  54. //Dodanie wiadomoci do BD:
  55. mysql_query($dodaj_nad) or die("Dodanie wiadomoci -nadanej- nie powiodło się.");
  56. mysql_query($dodaj_odb) or die("Dodanie wiadomoci -odebranej- nie powiodło się.");
  57.  
  58. //komunikat o powodzeniu i przekierowanie do profilu uzytkownika do ktorego poszla wiadomosc
  59. echo 'Wiadomosc zostala pomylnie wyslana do uzytkownika <b>', $odbiorca, '</b>';
  60. header ("refresh:1;url=index.php?share=".$fotoid."");
  61.  
  62. }
  63. else
  64. { //jeżeli są błędy w formularzu lub pierwszy raz formularz został wywietlony:
  65. //komunikat dot. kont premium
  66. $premium = mysql_fetch_array(mysql_query("SELECT `premium` FROM `users` WHERE `login`='$odbiorca'"));
  67. if ($premium['premium'] == '0') echo '<br /><br /><br /><div id="alert">Próbujesz wysłać wiadomość do użytkownika, który nie posiada konta premium.<br />
  68. Będzie on widział otrzymaną od Ciebie wiadomość, jednakże nie będzie mógł jej przeczytać dopóki nie uaktywni usługi premium.</div><br /><br />';
  69. ?>
  70.  
  71. <center>
  72. <form action="wiadomosc.php?who=<? echo $odbiorca; ?>&id=<? echo $fotoid; ?>" method="post">
  73. <table>
  74. <tr>
  75. <td>Wyslij wiadomosc do uzytkownika <? echo $odbiorca; ?></td>
  76. </tr>
  77. <tr>
  78. <td><textarea name="tresc" rows="4" cols="80"></textarea></td>
  79. </tr>
  80. <tr>
  81. <td><? if (isset($error1)) echo '<img src="img/error.png"><font size="2" color="red">&nbsp;&nbsp;' , $error1 , '</font>'; ?></td>
  82. <tr>
  83. <td><input type="submit" name="wiadomosc" value="Wyślij" class="button" /></td>
  84. </tr>
  85. </table>
  86. </form>
  87. </center>
  88. <br /><br />
  89.  
  90. <?
  91. }
  92. }
  93. }
  94. else
  95. { //jeżeli użytkownik nie jest zalogowany:
  96. echo "Wiadomoci wysyłać mogą tylko zarejestrowani i zalogowani użytkownicy.";
  97. }
  98. ?>
  99.  
  100. </div>
  101.  
  102. <?php include('tpl/stopka.php'); ?>
  103.  
  104. </body>
  105. </html>
  106. <?php ob_end_flush(); ?>


Skrypt wyświetlający wiadomość w kolejnym poście, gdyż aktualne jest za długi... ->

Skrypt wyświetlający wiadomość:

  1. <?
  2. if ($_GET['box'] == "out")
  3. { //zmienna w GET wskazuje na skrzynkę nadawczą:
  4. //Tworzymy menu dla skrzynki wiadomosci wyslanych:
  5. echo '<div id="wiadomosci_menu"><ul>';
  6. echo '<li><a href="profil.php?set=messages&box=in" />Skrzynka odbiorcza</a></li>';
  7. echo '<li class="selected"><a href="profil.php?set=messages&box=out" />Wiadomoci wysłane</a></li>';
  8. echo '</ul></div>';
  9.  
  10. $nadawca = $users['login']; //tablica users tworzona jest w pliku php który includuje ten kod
  11.  
  12. if (isset($_GET['show']))
  13. { //jeżeli zmienna GET['show'] jest przesłana w linku to wyswietlamy wiadomosc o przesłanym id (jako wartoc GET[show]:
  14. $msgid = intval($_GET['show']);
  15. if ($msgid == '0')
  16. { //jezeli zmienna show nie jest liczba to komunikat o bledzie
  17. echo "Błędny identyfikator wiadomoci!";
  18. }
  19. else
  20. { //jezeli jest liczba to laczymy sie z baza i wyciagamy dane o wiadomosci
  21. $connect = mysql_query("SELECT * FROM `msg` WHERE `msg_id`='$msgid' AND `msg_nadawca`='$nadawca' AND `msg_czyja`='1'");
  22. $records = mysql_num_rows($connect);
  23. if ($records == '1')
  24. { //jezeli w bazie danych jest wiadomosc o przeslanym id i o okreslonym odbiorcy i ma zmienna czyja=0:
  25. $dane = mysql_fetch_array($connect);
  26. echo '<div id="show_msg"><div id="show_oddo">Wiadomoć od: ', $dane['msg_odbiorca'], '</div>';
  27. echo '<div id="show_tresc">', nl2br($dane['msg_tresc']), '</div></div>';
  28.  
  29. //oznaczenie wiadomoci jako przeczytana:
  30. mysql_query("UPDATE `msg` SET `msg_przeczytane`='1' WHERE `msg_id`='$msgid' AND `msg_nadawca`='$nadawca' AND `msg_czyja`='1'")
  31. or die("Błąd -oznaczenia- wiadomoci");
  32. }
  33. else
  34. { //jezeli nie ma takiej wiadomoci to komunikat o bledzie
  35. echo "Brak wiadomoci o podanym identyfikatorze!";
  36. }
  37. }
  38. }
  39. else
  40. { //jeżeli zmienna GET[show] jest pusta to wyswietlamy wiadomoci wysłane
  41. //Wyswietlanie wiadomosci wyslanych:
  42. echo '<div id="wiadomosci">';
  43. $temp = mysql_query("SELECT * FROM msg WHERE msg_nadawca='$nadawca' AND msg_czyja='1' ORDER BY msg_data DESC");
  44. $ile = mysql_num_rows($temp);
  45.  
  46. //pierwszy wiersz z oznaczeniami nazw kolumn:
  47. echo '<br /><br /><b><div class="msg">';
  48. echo '<div class="msg_id">ID</div>';
  49. echo '<div class="msg_oddo">Odbiorca</div>';
  50. echo '<div class="msg_temat">Temat</div>';
  51. echo '<div class="msg_data">Data</div>';
  52. echo '</div></b><div style="clear: both;"></div><br /><br />';
  53.  
  54. if ($users['premium'] == '0')
  55. { //jeżeli uztkownik nie ma premium to komunikat i zachęta do zakupu
  56. echo "Tylko użytkownicy premium mają dostęp do systemu wiadomoci.<br />Aktywuj usługę premium i korzystaj z systemu wiadomoci -link- !";
  57. }
  58. else
  59. { //jeżeli ma premium to wyswietlamy wiadomosci
  60. if ($ile == 0)
  61. {
  62. echo "<br /><br />Nie masz zadnych wyslanych wiadomosci.";
  63. }
  64. else
  65. {
  66. $x = 0;
  67. while ($msg = mysql_fetch_array($temp))
  68. {
  69. if ($msg['msg_przeczytane'] == '0') { $b = "<b>"; $bb = "</b>"; }
  70. echo '<div class="msg">', $b;
  71. echo '<a href="profil.php?set=messages&box=out&show=', $msg['msg_id'], '" />';
  72. echo '<div class="msg_id">', $x+1, '</div>';
  73. echo '<div class="msg_oddo">', $msg['msg_odbiorca'], '</div>';
  74. echo '<div class="msg_temat">', $msg['msg_temat'], '</div>';
  75. echo '<div class="msg_data">', $msg['msg_data'], '</div>', $bb;
  76. echo '</a>';
  77. echo '</div><div style="clear: both;"></div>';
  78. $x = $x+1;
  79. }
  80. }
  81. }
  82. echo '</div>';
  83. }
  84. }
  85. else
  86. { //tutaj skrzynka odbiorcza:
  87.  


  1. else
  2. {
  3. //Tworzymy menu dla skrzynki odbiorczej:
  4. echo '<div id="wiadomosci_menu"><ul>';
  5. echo '<li class="selected"><a href="profil.php?set=messages&box=in" />Skrzynka odbiorcza</a></li>';
  6. echo '<li><a href="profil.php?set=messages&box=out" />Wiadomoci wysłane</a></li>';
  7. echo '</ul></div>';
  8.  
  9. $odbiorca = $users['login'];
  10.  
  11. if (isset($_GET['show']))
  12. { //jeżeli zmienna GET['show'] jest przesłana w linku to wyswietlamy wiadomosc o przesłanym id:
  13. $msgid = intval($_GET['show']);
  14. if ($msgid == '0')
  15. { //jezeli zmienna show nie jest liczba to komunikat o bledzie
  16. echo "Błędny identyfikator wiadomoci!";
  17. }
  18. else
  19. { //jezeli jest liczba to laczymy sie z baza i wyciagamy dane o wiadomosci
  20. $connect = mysql_query("SELECT * FROM `msg` WHERE `msg_id`='$msgid' AND `msg_odbiorca`='$odbiorca' AND `msg_czyja`='0'");
  21. $records = mysql_num_rows($connect);
  22. if ($records == '1')
  23. { //jezeli w bazie danych jest wiadomosc o przeslanym id i o okreslonym odbiorcy i ma zmienna czyja=0:
  24. $dane = mysql_fetch_array($connect);
  25. echo '<div id="show_msg"><div id="show_oddo">Wiadomoć od: ', $dane['msg_nadawca'], '</div>';
  26. echo '<div id="show_tresc">', nl2br($dane['msg_tresc']), '</div></div>';
  27.  
  28. mysql_query("UPDATE `msg` SET `msg_przeczytane`='1' WHERE `msg_id`='$msgid' AND `msg_odbiorca`='$odbiorca' AND `msg_czyja`='0'")
  29. or die("Błąd -oznaczenia- wiadomoci");
  30. }
  31. else
  32. { //jezeli nie to komunikat o bledzie
  33. echo "Brak wiadomoci o podanym identyfikatorze!";
  34. }
  35. }
  36. }
  37. else
  38. {
  39. //Wyswietlanie wiadomosci w skrzynce odbiorczej:
  40. echo '<div id="wiadomosci">';
  41. $temp = mysql_query("SELECT * FROM msg WHERE msg_odbiorca='$odbiorca' AND msg_czyja='0' ORDER BY msg_data DESC");
  42. $temp_admin = mysql_query("SELECT * FROM msg WHERE msg_odbiorca='$odbiorca' AND msg_nadawca='Administracja' AND msg_czyja='0' ORDER BY msg_data DESC");
  43. $ile = mysql_num_rows($temp);
  44.  
  45. //pierwszy wiersz z oznaczeniami nazw kolumn:
  46. echo '<br /><br /><b><div class="msg">';
  47. echo '<div class="msg_id">ID</div>';
  48. echo '<div class="msg_oddo">Nadawca</div>';
  49. echo '<div class="msg_temat">Temat</div>';
  50. echo '<div class="msg_data">Data</div>';
  51. echo '</div></b><div style="clear: both;"></div><br /><br />';
  52.  
  53. if ($users['premium'] == '0')
  54. { //jeżeli uztkownik nie ma premium to wyswietlam wiadomosci od admina, komunikat i zachęta do zakupu
  55. $x = 0;
  56. while ($admin = mysql_fetch_array($temp_admin))
  57. {
  58. if ($admin['msg_przeczytane'] == '0') { $b = "<b>"; $bb = "</b>"; }
  59. echo '<div class="msg">', $b;
  60. echo '<a href="profil.php?set=messages&box=in&show=', $admin['msg_id'], '" />';
  61. echo '<div class="msg_id">', $x+1, '</div>';
  62. echo '<div class="msg_oddo">', $admin['msg_nadawca'], '</div>';
  63. echo '<div class="msg_temat">', $admin['msg_temat'], '</div>';
  64. echo '<div class="msg_data">', $admin['msg_data'], '</div>', $bb;
  65. echo '</a>';
  66. echo '</div><div style="clear: both;"></div>';
  67. $x = $x+1;
  68. }
  69. echo "<br /><br />Tylko użytkownicy premium mają dostęp do systemu wiadomoci.<br />Aktywuj usługę premium i korzystaj z systemu wiadomoci -link- !";
  70. }
  71. else
  72. { //jeżeli ma premium to wyswietlamy wiadomosci
  73. if ($ile == 0)
  74. {
  75. echo "<br /><br />Nie masz zadnych wiadomosci w skrzynce odbiorczej.";
  76. }
  77. else
  78. {
  79. $x = 0;
  80. while ($admin = mysql_fetch_array($temp_admin))
  81. { //wyswitla wiadomosci od administracji jako pierwsze
  82. if ($admin['msg_przeczytane'] == '0') { $b = "<b>"; $bb = "</b>"; }
  83. echo '<div class="msg">', $b;
  84. echo '<a href="profil.php?set=messages&box=in&show=', $admin['msg_id'], '" />';
  85. echo '<div class="msg_id">', $x+1, '</div>';
  86. echo '<div class="msg_oddo">', $admin['msg_nadawca'], '</div>';
  87. echo '<div class="msg_temat">', $admin['msg_temat'], '</div>';
  88. echo '<div class="msg_data">', $admin['msg_data'], '</div>', $bb;
  89. echo '</a>';
  90. echo '</div><div style="clear: both;"></div>';
  91. $x = $x+1;
  92. }
  93. $y = 0;
  94. while ($msg = mysql_fetch_array($temp))
  95. { //wyswietla wiadomosci od usytkowników
  96. if ($msg['msg_przeczytane'] == '0') { $b = "<b>"; $bb = "</b>"; }
  97. echo '<div class="msg">', $b;
  98. echo '<a href="profil.php?set=messages&box=in&show=', $msg['msg_id'], '" />';
  99. echo '<div class="msg_id">', $y+1, '</div>';
  100. echo '<div class="msg_oddo">', $msg['msg_nadawca'], '</div>';
  101. echo '<div class="msg_temat">', $msg['msg_temat'], '</div>';
  102. echo '<div class="msg_data">', $msg['msg_data'], '</div>', $bb;
  103. echo '</a>';
  104. echo '</div><div style="clear: both;"></div>';
  105. $y = $y+1;
  106. }
  107. }
  108. }
  109. echo '</div>';
  110. }
  111. }
  112. ?>
IceManSpy
Kilka błędów:
1. To się w ogóle nie nadaje do oceny. Masz już z góry określone jak ma się to wyświetlać. To się nadaje do działu PHP co najwyżej.
2. Zdecyduj się przy pisaniu skryptów, albo wszystko po angielsku, albo wszystko po polsku.
3. Błędne kodowanie - nie widzisz krzaków jak wrzuciłeś tutaj te skrypty?
4. Przy wysyłaniu nie sprawdzasz czy dany user ma dane id - sprawdzasz tylko czy istnieje taki wpis w sesji. Jak będzie np user maciek o id 2, to równie dobrze ten user maciek może być o id 3, chociaż to dwa zupełnie inne user'y. Tak samo w isset($wyslij) - wiesz do czego służy ta funkcja? Zamiast robić isset, to porównuj.
5. Podczas dodawania ID wiadomości nie wstawiaj jej w insercie, tylko niech to się dzieje automatycznie po stronie bazy -> patrz autoincrement który ma z resztą ustawiony.
6. Co robi jakieś
  1. $fotoid = intval($_GET['id']);
lub
  1. header ("refresh:1;url=index.php?share=".$fotoid."");
? To jest skrypt wysyłania wiadomości, czy coś związane ze zdjęciami?
7. mysql_query($dodaj_nad) or die("Dodanie wiadomoci -nadanej- nie powiodło się."); mysql_query($dodaj_odb) or die("Dodanie wiadomoci -odebranej- nie powiodło się.");
A jeśli dodanie wiadomości NADANEJ się nie uda, a ODEBRANEJ się uda, to co wtedy?
8. Dublujesz sobie dane. Musisz zrobić 2 inserty na tą samą wiadomość - dodaje sobie kolumnę, kto wysłał wiadomość a kto odebrał (numery id userów)
9. I po co jakiś premium, który bez dodatkowej implementacji nie zadziała?
samuello
@ up

3. Krzaki widnieją z powodu zastosowanego kodowania UTF-8.
4. Trzeba nieco dopracować zabezpieczenia sesji.

4.a. Jeżeli chodzi o isset($wyslij) to dotyczy to przesłania formularza wysyłania wiadomości. Jeżeli "submit" zostanie kliknięte to zmienna $wyślij nie będzie pusta. Czy zatem istnieje sens sprawdzania czy ma ona wartość taką jak button "submit"?

5. Autoincrement ustawione jest dla kolumny 'msg_id' i jest ono zwiększane automatycznie. W Insercie jest dla tej kolumny (' ', ...).
6. Ten system jest częścia mini serwisu, gdzie prowadzona jest ocena zdjęć. Przy wyświetlanym zdjęciu jest link do wysłania wiadomości użytkownikowi - autorowi zdjęcia. Link ten przekazuje id zdjęcia, przez co po wysłaniu wiadomości następuje automatyczne przekierowanie do poprzedniego zdjęcia - funkcją header.

7. Fakt... trafna uwaga. Czy zapis mysql_query($dodaj_odb, $dodaj_nad) or die(...) będzie poprawny?

8. Dodaje dwa wiersze różniące sie tylko jedną kolumną z tego względu, że jeżeli jedna ze stron (nadawca - odbiorca) skasuje wiadomość to druga strona, którą ją zachowa będzie wiadomość wciąż widzieć. Innym rozwiązaniem byłoby stworzenie dwóch tabel: na wiadomości wysłane i odebrane, jednakże nie jestem pewien, które jest wydajniejsze.
9. Informacje o premium przechowywane są w osobnej tabeli w bazie danych. Tutaj widnieje jedynie sprawdzenie czy premium jest aktywne i w zależności od wyniku istnieje możliwość "wstępu" do systemu wiadomości bądź też nie.
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.