Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MySQL] Nieprzeczytane posty
Forum PHP.pl > Forum > Przedszkole
hejo
Witam, potrzebuje pomocy. Próbuję napisać skrypt, który będzie informował o nowych, nieprzeczytanych postach/tematach (tematy będą lepszym rozwiązaniem na mojej stronie). Krótki opis jak ona wygląda: na stronie głównej znajduję się 110 obrazków - każdy z nich jest linkiem i prowadzi do wybranej podstrony. Na każdej z tych stron zainstalowany jest skrypt komentarzy.

1. Głównym moim celem jest taki skrypt, żeby po napisaniu nowych postów obrazek na stronie głównej zmieniał np. obramowanie albo jakiś inny efekt informujący użytkownika o nowym poście. Jednak na razie nie będę się porywał na głęboką wodę.

2. To, co chciałbym osiągnąć teraz: aby wyświetliła się lista tematów, w których zostały dodane nieprzeczytane posty (w moim przypadku z tabeli MySQl będą to urly)


Oczywiście szukałem na google, ale jak wiadomo gotowca nigdzie się nie znajdzie bo trzeba dostosować taki skrypt do swojej strony/forum. Na pewnym forum udało mi się znaleźć taką wskazówkę:

Cytat
"Tabela 'nieprzeczytane':
- userID
- msgID albo topicID (co niesie za sobą pewne wady, ale też uproszczenia)

Przy odświeżaniu strony przez użytkownika, sprawdzamy datę jego ost. odświeżenia strony i pobieramy z tabeli postów ID tych wiadomości, które mają datę > niż data użytkownika. Uzupełniamy tabelę tymi wpisami. Aby zapobiec przepełnieniu, możemy przy dodawaniu rekordów do tabeli sprawdzić jeszcze, czy np. ten użytkownik nie ma już 1000 nieprzeczytanych postów/tematów. Wtedy tabelę odpowiednio czyścimy smile.gif


Mam 3 tabele w bazie danych:

  1. CREATE TABLE `uzytkownicy` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `nick` varchar(15) COLLATE utf8_polish_ci NOT NULL,
  4. `haslo` varchar(40) COLLATE utf8_polish_ci NOT NULL,
  5. `email` varchar(255) COLLATE utf8_polish_ci NOT NULL,
  6. `rejestracja` datetime NOT NULL,
  7. `logowanie` datetime NOT NULL,
  8. `ip` char(15) COLLATE utf8_polish_ci NOT NULL,
  9. `ranga` tinyint(1) NOT NULL DEFAULT '0',
  10. `ban` tinyint(1) NOT NULL DEFAULT '0',
  11. `aktywny` tinyint(1) NOT NULL DEFAULT '0',
  12. `kod_aktywacyjny` varchar(40) NOT NULL,
  13. `zalogowani` datetime NOT NULL DEFAULT '0000-00-00 00-00-00',
  14. PRIMARY KEY (`id`)
  15. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='zarejestrowani użytkownicy' AUTO_INCREMENT=1;
  16.  
  17. CREATE TABLE `komentarze` (
  18. `id` int(7) UNSIGNED NOT NULL AUTO_INCREMENT,
  19. `url` char(45) COLLATE utf8_polish_ci NOT NULL,
  20. `nick` char(35) COLLATE utf8_polish_ci NOT NULL,
  21. `data` datetime NOT NULL,
  22. `ip` char(15) COLLATE utf8_polish_ci NOT NULL,
  23. `komentarz` text COLLATE utf8_polish_ci NOT NULL,
  24. PRIMARY KEY (`id`),
  25. KEY `url` (`url`)
  26. ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_polish_ci COMMENT='komentarze do artykułów' AUTO_INCREMENT=1;
  27.  
  28. CREATE TABLE `nieprzeczytane` (
  29. `user_id` int(255),
  30. `msg_id` int(255)
  31. ) ENGINE=MyISAM;


A teraz kod, który jak na razie udało mi się napisać ... tak wiem, że to niewiele, ale raczkuje w tym temacie.
logowanie = ostatnie logowanie użytkownika
zalogowani = ostatnia aktywność użytkownika na stronie
$_SESSION['nick'] = nick zalogowanego już użytkownika

Trochę chaotyczne mam te nazwy, ale to moja pierwsza strona i jeszcze się trochę gubię w tym wszystkim smile.gif

  1. // sprawdzamy date jego ostatniego odswiezenia strony
  2. $sql_zalogowani = "SELECT `zalogowani` FROM `uzytkownicy` WHERE `nick` = '{$_SESSION['nick']}'";
  3. $sql =mysql_query($sql_zalogowani);
  4.  
  5. $wynik = $sql['zalogowani'];
  6.  
  7.  
  8. // pobieramy z tabeli komentarzy ID tych wiadomosci, ktore maja date > data uzytkownika
  9. $result2 = "SELECT id FROM komentarze where data > '$wynik' ";
  10. $row2 = mysql_query ($result2);
  11.  
  12. $wiadomosc = $row2['id'];
SmokAnalog
Nie lepiej przechowywać przeczytane tematy? smile.gif Większość użytkowników przeczyta znacznie mniej niż połowę.
hejo
Właściwie racja, ale jak miałby wyglądać kod do tego co tu wstawiłem?
NickOver
Calego skryptu Ci teraz nie napisze bo na tablecie byla by to masakra, ale w skrocie o tak:
Tworzysz tabelke readed a wniej pola:
-readed_id
-user_nick
-topic_id
Teraz pobierasz wszystkie tematy ktore maja sie pokazac userowi. Teraz, foreach po kazdym poscie aby je wyswietlic, a w miejscu gdzie masz klase jakiegos diva to:
<div class="topic <?php if (!isReaded($topicId, $userNick)) echo 'not-readed'; ?>">TRESC</div>
funkcja isReaded:
function isReaded($topicId, $userNick){
$query = "SELECT readed_id FROM readed WHERE topic_id = '$topicId' AND usr_nick = '$userNick";
if (count(mysql_query($query)) >= 1) return TRUE;
else rreturnFALSE;
}

Powinno to dzialac tongue.gif
hejo
Dzięki za funkcję do diva, to na pewno się przyda smile.gif Jednak moja strona nie ma czegoś takiego jak tematy, mój skrypt komentarzy jest na wzór księgi gości, więc jak mam pobrać tematy? W tym przypadku tematem mógłby być url, czyli jakis-artykul.php, jakis-artykul2.php itp. Na podstronach można dodać komentarz (jeśli jest się zalogowanym) i tylko dodane komentarze w takim przypadku się wyświetlają bez tematu.

Do pełniejszego zrozumienia problemu wkleję kawałek index.php oraz skryptu, którego używam do komentarzy (jest prosty i jeszcze niezabezpieczony).


plik wyslij.php

  1. <?php
  2.  
  3. // Pobieramy adres IP komentującego
  4. $IP = $_SERVER['REMOTE_ADDR'];
  5. // Pobieramy pełny adres strony na której wysyłany jest komentarz
  6. $lokalizacja = 'http://'.$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI'];
  7. // Pobieramy adres aktualnej strony bez nazwy domeny, czyli np.: "jakis-artykul.php", do bazy danych
  8. $adres = $_SERVER['REQUEST_URI'];
  9.  
  10.  
  11. require_once('../baza_danych/baza.php');
  12.  
  13.  
  14. // Jeżeli został wciśnięty przycisk "wyślij"
  15. if (isset ($_POST['wys_kom'])) {
  16.  
  17. $nick = ($_SESSION['nick']);
  18.  
  19. // Jeżeli komentarz jest pusty
  20. if (empty($_POST['komentarz']) ) {
  21. $komunikat .= '<p>Napisz komentarz.</p>';
  22. } else {
  23. $koment = stripslashes($_POST['komentarz']);
  24. }
  25.  
  26.  
  27. //Jeżeli nie ma żadnego błędu
  28. if (!isset($komunikat)) {
  29. $zapytanie = "INSERT INTO komentarze (url, nick, data, ip, komentarz) VALUES ('$adres', '$nick', NOW(), '$IP', '$koment')";
  30. mysql_query("set names utf8;");
  31. if ($rezultat = mysql_query ($zapytanie)) {
  32. header ("Location: http://" . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF']);
  33. exit();
  34. } else {
  35. $komunikat = '<p>Przepraszamy za chwilowe usterki. Wysłanie komentarza nie było możliwe. Spróbuj później.</p>';
  36. }
  37. }
  38. }
  39.  
  40. ?>


plik formularz.php

  1. <?php
  2. // Wyświetla wszystkie komentarze do tego artykułu
  3.  
  4. $zapytanie2 = "SELECT * FROM komentarze WHERE url = '$adres' ORDER BY id";
  5. mysql_query("set names utf8;");
  6. $rezultat2 = mysql_query ($zapytanie2);
  7. while ($dane = @mysql_fetch_array ($rezultat2, MYSQL_ASSOC)) {
  8. <div class="koment">
  9. <p class="koment_nag"><b>',$dane['nick'],'</b> (',$dane['data'],')</p>
  10. <p>',nl2br($dane['komentarz']),'</p>
  11. </div>';
  12. }
  13.  
  14. // Jeżeli są jakieś komunikaty - wyświetl je
  15. if (isset($komunikat)) {
  16. echo '<div class="komunikat">'.$komunikat.'</div>';
  17. }
  18.  
  19.  
  20.  
  21. <div class="box">
  22. <form action="'.$lokalizacja.'" method="post">
  23.  
  24.  
  25. <label>
  26. <span>Wiadomość :</span>';
  27.  
  28. if ($_SESSION['ranga'] == '0' or $_SESSION['ranga'] == '2')
  29. {
  30. <textarea class="wiadomosc" name="komentarz" id="tresc" placeholder="..."></textarea>
  31. <input type="submit" name="wys_kom" value="Wyślij" class="przycisk"/>
  32. </label>
  33. </div>
  34. </form> ';
  35.  
  36.  
  37. }
  38. else
  39. {
  40. echo' <a href="../administracja/login.php" style="color: white" > Musisz być zalogowany jeśli chcesz dodać komentarz. </a>';
  41. };
  42.  
  43.  
  44. ?>


plik index.php, który zawiera obrazki i przekierowuje na podstronę np. sven.php (a w nim includowany jest wyżej wymieniony skrypt komentarzy).

  1. <a href="biblioteka/earthshaker.php" class="tip" tooltip="Earthshaker" ><img src="hero/earthshaker.png" border="2" alt="obrazek" ></a>
  2. <a href="biblioteka/sven.php" class="tip" tooltip="Sven" ><img src="hero/sven.png" border="2" alt="obrazek"></a>
  3. <a href="biblioteka/tiny.php" class="tip" tooltip="Tiny" ><img src="hero/tiny.png" border="2" alt="obrazek"></a>
  4. <a href="biblioteka/kunkka.php" class="tip" tooltip="Kunkka" ><img src="hero/kunkka.png" border="2" alt="obrazek"></a>


Mógłbym Cię prosić o napisanie reszty skryptu w takim przypadku jak to wygląda u mnie na stronie?

Odświeżam temat, proszę o pomoc smile.gif
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.