Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP, MYSQL] System komentarzy z moderacją
Forum PHP.pl > Forum > PHP
Joachim Peters
Przeszukałem już wiele tematów ale w żadnym nie znalazłem nic co by mnie zainteresowało dostatecznie.
Przechodząc do meritum, chcę stworzyć system komentarzy z opcją ich wcześniejszego zaakceptowania przez „moderatora”. Komentarze mają być dla wielu elementów tzn. aktualności, plików, artykułów, blogów.
Problem polega na tym, że chce mieć możliwość wyświetlenia ilości zaakceptowanych komentarzy dla danej pozycji (np. dla danego pliku), ale nie za bardzo wiem jak to zgrać, aby po zaakceptowaniu komentarzy wartość w odpowiedniej kolumnie elementu nadrzędnego (tabeli z plikami, artykułami) była inkrementowana.

Tabela komentarzy wygląda tak:
  1. comment_id
  2. author
  3. time
  4. ip
  5. approved
  6. message
  7. object_id
  8. object_page


Można to prosto rozwiązać, kiedy akceptowanie odbywa się poprzez kliknięcie w link "Akceptuj" przy danym komentarzu, jednak ja chciałbym aby odbywało się to na osobnej stronie z listą pól typu checkbox.
Z góry dziękuję za propozycje i sugestie.

Pozdrawiam
thek
A po co przechowywać ilość zaakceptowanych komentarzy gdziekolwiek?
Wystarczy wysłać do bazy zapytanie odpowiednie i tyle
  1. SELECT count(comment_id) AS zaakceptowane FROM komentarze WHERE object_id = x AND object_page = y

Jak mniemam object_id tyczy się numeru pozycji w danym dziale, a object_page oznacza konkretny dział. Bo nie ma sensu przecież tworzyć osobnej tabeli która przechowywała by te dane. Jeśli jednak chcesz, to musiałbyś podczas akceptacji komentarza w tabeli statystycznej znaleźć wiersz posiadający konkretną wartość object_id i object_page i zwiększyć licznik o 1, dodatkowo podczas usuwania komentarza ten sam wiersz dekrementować. Ogólnie jakiekolwiek działanie związane ze zmianą tej statystyki musiałoby być uwzględnione w owej tabeli. Ja nie sadze by było to bardzo optymalne dla mniejszych i średnich serwisów.
Joachim Peters
Można i tak ale czy tworzenie JOINów i dodatkowych zapytań będzie bardziej optymalne niż kolumna poszczególnej pozycji z inkrementowaną/dekrementowaną ilością komentarzy?
zzeus
Możesz dodać pole z liczbą komentarzy, tabele postawić na silniku InnoDB i napisać odpowiednie triggery.
Wtedy baza sama będzie dbała o to żeby przy dodaniu lub usunięciu komentarza zwiększyć lub zmniejszyć licznik komentarzy.
thek
Można i pisać wyzwalacze, co jest dobrym pomysłem, ale z drugiej strony trzeba o jednym pamiętać: InnoDB ma jedna istotna dla wielu wadę - brak możliwości nałożenia na pola w tym typie bazy indeksu typu FULLTEXT, co przy komentarzach może mieć dla wielu osób znaczenie.
Tak więc decyzja czy tworzyć tabelę przechowującą informacje o ilości komentarzy oraz robić obsługe in- i dekrementacji dla niej czy moze tylko zapytania z ilością wyciągać jest decyzja związana raczej z ilością odwiedzin na stronie i tym samym ewentualnymi gardłami w wydajności.
erix
Cytat
brak możliwości nałożenia na pola w tym typie bazy indeksu typu FULLTEXT, co przy komentarzach może mieć dla wielu osób znaczenie.
Tak więc decyzja czy tworzyć tabelę przechowującą informacje o ilości komentarzy oraz robić obsługe in- i dekrementacji dla niej czy moze tylko

A kto broni zrobić osobnej tabeli składającej się z pól commentID, content i wykonać tylko złączenie...? Wszystko pięknie się zaindeksuje, fulltext też będzie.
Fixus
Hmm problem wydaje mi się dość prosty - chyba, że coś źle zrozumiałem.

Na osobnej stronie - tak jak chcesz - wykonujesz proste zapytanie do bazy i generujesz tabelę

  1. $sql = "select * from tabela where approved = '0'"; // tu wyszedłem z założenia że 1 to zatwierdzone a 0 to niezatwierdzone
  2. $resutl = myswql_query($sql);
  3. $i = 0;
  4. while($item = mysql_fetch_array($result) {
  5.  
  6. // renderowanie tabeli
  7. echo '<td><input type="checkbox" name="$i" value="'.$item['comment_id'].'" />';
  8. $i++;
  9. }
  10. echo '<input type="hidden" name="comment_count" value="$" />';


następnie zaznaczasz które komentarze chcesz zatwierdzić i wysyłasz formularz. Zatwierdzenie powinno wyglądać tak

  1. $comment_count = $_POST['comment_count'];
  2. for($i = 0; $i < $comment_count; $i++) {
  3. if(isset($_POST[$i])) {
  4. $id = $_POST[$i];
  5. $sql = "update tabela set approved = '1' where comment_id = '$id'";
  6. $result = mysql_query($sql);
  7. }
  8. }


co do zwiększania wartości. Możesz po prostu dostawić pole ilości komentarzy do tabeli gdzie trzymasz tematy (tzn. np. artykuły które są komentowane) i powyższego kodu (ten z update) dopisać linię która będzie dodatkowo zwiększać wartość pola o 1. można to na 100% zrobić przed 2 proste zapytania select i update, a czy przez jedno to nie jeste pewien bo aż tak dobry z sql nie jestem tongue.gif

thek
Cytat(erix @ 29.08.2009, 20:51:53 ) *
A kto broni zrobić osobnej tabeli składającej się z pól commentID, content i wykonać tylko złączenie...? Wszystko pięknie się zaindeksuje, fulltext też będzie.
Owszem. To jest obejście problemu, ale tworzy dodatkową tabelę. A przecież nie po to są bazy danych byśmy przechowywali nadmiarowe informacje winksmiley.jpg W ostateczności można użyć ale czy to już nie byłoby rozwiązanie z zakresu "sztuka dla sztuki"? winksmiley.jpg
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.