CompZone.Org :: Artykuły :: PHP
Jaki jest Twój wiek?
40 - 59
26 - 39
19 - 25
13 - 18
12 i mniej
60 i więcej
Sonda Wyniki

Add to Google

System komentarzy wraz z administracją w php

Zapewne każdy z was chciałby mieć na stronie możliwość komentowania newsów lub artykułów. Wbrew pozorom nie jest to takie trudne zadanie jak się wydaje. W artykule będę korzystał z bazy danych MySQL. Skrypt wyposażymy również w dość wygodne narzędzie do administrowania komentarzami (z możliwością usunięcia bądź akceptacji).

Najpierw stworzymy skrypt, który automatycznie utworzy nam tabelę komentarze i umieści w niej 5 pól: nr, nick, tresc, data oraz zatwierdz.

tabele.php

 <?php
mysql_connect ("hostbazydanych", "użytkownik", "hasło") or //staramy połączyć się z bazą danych
die ("Nie można połączyć się z bazą MySQL"); //jeżeli to się nie uda wyświetlamy stosowny komunikat
mysql_select_db ("komentarze") or //wybieramy bazę
die ("Nie można połączyć się z bazą komentarze");
mysql_query("CREATE TABLE 'komentarze' ('nr' TINYINT NOT NULL AUTO_INCREMENT, 'nick' TEXT NOT NULL, 'tresc' TEXT NOT NULL, 'data' TEXT NOT NULL, 'zatwierdz' TINYINT DEFAULT '0' NOT NULL, PRIMARY KEY ('nr')"); //tworzymy tabelę komentarze a w niej pola nr z atrybutem AUTO_INCREMENT, nick, data oraz pole zatwierdz z domyślną wartością 0 (czyli nie pokazuj komentarza)
mysql_query("ALTER TABLE 'komentarze' ADD UNIQUE ('nr')"); //ustawiamy atrybut unikalny przy polu nr
?>

komentarze.php

 <HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-2">
<TITLE>System komentarzy oparty na bazie MySQL</TITLE>
</HEAD>
<BODY>
<H2>Komentarze</H2>
<?php
mysql_connect ("hostbazydanych", "użytkownik", "hasło") or //staramy połączyć się z bazą danych
die ("Nie można połączyć się z bazą MySQL"); //jeżeli to się nie uda wyświetlamy
mysql_select_db ("komentarze") or //wybieramy bazę
die ("Nie można połączyć się z bazą komentarze");

if(!isset($id)) { //odbieramy wartość zmiennej id
print"<A HREF=\"komentarze.php?id=nowy\">Dodaj nowy komentarz</A><HR>"; //jeżeli zmienna id nie ma przypisanej wartości
$wynik = mysql_query ("SELECT * FROM komentarze WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone komentarze i segregujemy według pola nr od wartości największej do najmniejszej
print"<UL>";
while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3]."</LI>"; //w pętli while wyświetlamy po kolei wszytskie komentarze w kolejności treść, pseudonim (nick), data
}
print"</UL>";
}else if ($id=='nowy') { //jeżeli zmienna id zawiera wyraz nowy
print "<HR>"; //wyświetlamy formularz do wpisania komentarza
print "<H3>Nowy komentarz:</H3>";
print "<FORM METHOD=POST><INPUT TYPE=\"hidden\" NAME=\"id\" VALUE=\"dodaj\">";
print "<B>Pseudonim:</B><BR><INPUT TYPE=\"text\" NAME=\"nick\" VALUE=\"$nick\" SIZE=60><BR>n ";
print "<B>Treść:</B><BR><TEXTAREA NAME=\"tresc\" ";
print "ROWS=10 COLS=60>$tresc</TEXTAREA><BR>n";
print "<INPUT TYPE=\"submit\" VALUE=\"Wyslij\">";
print "</FORM>";
print "<a href=\"komentarze.php\">Powrót</a>";
}else if ($id=='dodaj') { // jeżeli zmienna id zawiera wartość dodaj
//dodajemy komentarz do bazy
$tresc = addslashes(nl2br(htmlentities ($tresc))); \ponieważ nie można ufać danym wprowadzanym przez użytkowników funkcją addslashes dodajemy ukośniki () w miejscach gdzie napotkanym na apostrof (&#8216;), usuwamy je potem funkcją stripslahes przy wypisywaniu komentarzy, dodatkowo funkcja nl2br zamienia znaki końca linii na tag br
$nick = addslashes(htmlentities ($nick));

if ($tresc && $nick) { //jeżeli pola treść i pseudonim są uzupełnione
$zapytanie = "INSERT INTO komentarze (tresc, nick, "." data) VALUES ('$tresc', '$nick', "." now());";
$wynik = mysql_query ($zapytanie); //dodajemy wtedy dane do bazy wraz z aktualną datą i godziną &#8211; funkcja now()
print "<HR>";
print"<H4>Twój komentarz został dodany do bazy. Ukaże się, gdy administrator go zatwierdzi</h4><br>"; //jeżeli wszystko przebiegnie bez problemów wyświetlamy komunikat
print"<a href=\"komentarze.php\">Powrót</a>";
}else{ //jeżeli jednak nie wyświetlamy stosowną informację
print "<HR>";
print"<h4>Pola pseudonim i treść muszą być wypełnione ! Kliknij wstecz w swojej przeglądarce i popraw te dane !</h4>";
}
}
else { //jeżeli zmienna id zawiera inną wartość niż dodaj lub nowy wyświetlamy wszystkie zatwierdzone komentarze
print"<A HREF=\"komentarze.php?id=nowy\">Dodaj nowy komentarz</A><HR>";
$wynik = mysql_query ("SELECT * FROM komentarze WHERE zatwierdz=1 order by nr desc;"); //wybieramy zatwierdzone komentarze i segregujemy według pola nr od wartości największej do najmniejszej
print"<UL>";
while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM)
print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3]."</LI>"; //za pomocą pętli while wyświetlamy wszystkie rekordy, które zostały zatwierdzone (wartość pola zatwierdz wynosi 1)
}
print"</UL>";
}
?>
</
BODY>
</
HTML>

Dobrze użytkownicy mogą już teraz dodawać własne komentarze. Teraz pora zająć się skryptem administracji z poziomu, którego będziemy mogli kasować lub zatwierdzać nowe komentarze. Główny skrypt administracji wygląda następująco:

admin.php

 <HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=iso-8859-2">
<TITLE>Administracja komentarzami</TITLE>
</HEAD>
<BODY>
<?
print "<b>Komentarze oczekujące zatwierdzenia:</b>";
mysql_connect ("hostbazydanych", "użytkownik", "hasło") or
die ("Nie można połączyć się z bazą MySQL");
mysql_select_db ("komentarze") or
die ("Nie można połączyć się z bazą komentarze");
$wynik = mysql_query ("SELECT * FROM komentarze WHERE zatwierdz=0;");
while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) {
$nr=$rekord[0]; //przypisujemy zmiennej nr wartość pierwszego pola z bazy komentarze
print "<p>".$rekord[2].", <B> ".$rekord[1]."</B>, ".$rekord[3]." <a href=\"usun.php?id=$nr\"> usuń </a> <a href=\"zatwierdz.php?id=$nr\"> zatwierdź </a><br>";
} //w pętli while wyświetlamy jeszcze nie zatwierdzone komentarze (te, które w polu zatwierdz mają domyślną wartość 0
?>
</BODY>
</HTML>

Właściwie nie ma czego tutaj komentować. Zasada skryptu jest prosta. W pętli while pobieramy komentarze, które nie są zatwierdzone i wyświetlamy je.
Teraz utworzymy dwa skrypty do zatwierdzania (zatwierdz.php) i usuwania (usun.php).

zatwierdz.php

 <HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=iso-8859-2">
<TITLE>Administracja komentarzami - zatwierdz komentarz</TITLE>
</HEAD>
<BODY>
<?
mysql_connect ("hostbazydanych", "użytkownik", "hasło") or
die ("Nie można połączyć się z bazą MySQL");
mysql_select_db ("komentarze") or
die ("Nie można połączyć się z bazą komentarze");
if($id<>""){ //sprawdzamy czy przesłano zmienną id
mysql_query("UPDATE komentarze SET zatwierdz='1' WHERE nr = '$id'") or
die("error".mysql_error());//jeżeli tak to zatwierdzamy (zmieniamy wartość pola zatwierdz z 0 na 1) komentarz z bazy o określonym numerze
}
print "<h4>Komentarz został zatwierdzony !<br>";
print "<a href=\"admin.php\">Powrót</a></h4>";
?>
</BODY>
</HTML>

usun.php

 <HTML>
<HEAD>
<META HTTP-EQUIV="Content-type" CONTENT="text/html; charset=iso-8859-2">
<TITLE>Administracja komentarzami - usun komentarz</TITLE>
</HEAD>
<BODY>
<?
mysql_connect ("hostbazydanych", "użytkownik", "hasło") or
die ("Nie można połączyć się z bazą MySQL");
mysql_select_db ("komentarze") or
die ("Nie można połączyć się z bazą komentarze");
if($id<>""){ //sprawdzamy czy przesłano zmienną id
mysql_query("Delete from komentarze where nr=$id;") or die("error".mysql_error()); //jeżeli tak usuwamy komentarz z bazy o określonym numerze
}
print "<h4>Komentarz został usunięty !<br>";
print "<a href=\"admin.php\">Powrót</a></h4>";
?>
</BODY>
</HTML>

No i to by właściwie było na tyle. Wątpię żeby ktokolwiek miał problem z tym skryptem. Jest on niezwykle prosty i nieskomplikowany.

Gall Anonim @ 11-07-2006 15:43

#1

a czy wykorzystuje aspekty związane z bezpieczeństwem ? czy jest podatny na ataki sql injection i inne. Po za tym fajny i prosty.

@ 23-07-2006 22:47

#2

komentarze.php - Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ble/ble/ble on line 18 Troche szukalem po Guglu, na jednym z forumów powiedzieli, zeby dać @ przed tą funkcją. Wtedy warning sie nie pojawia, ale nie pojawia sie tez zaden textfield, submit, nic. Jestem bezpojęciowcem, wiec prosze o wyrozumialosc. Co trzeba zmienic zeby bylo dobrze? A artykul jak dla mnie zrozumialy, prosty i przejrzysty. Gratulacje.

roberto @ 23-06-2007 14:39

#3

komentarze.php - Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in ble/ble/ble on line 18 Troche szukalem po Guglu, na jednym z forumów powiedzieli, zeby dać @ przed tą funkcją. Wtedy warning sie nie pojawia, ale nie pojawia sie tez zaden textfield, submit, nic. Jestem bezpojęciowcem, wiec prosze o wyrozumialosc. Co trzeba zmienic zeby bylo dobrze? A artykul jak dla mnie zrozumialy, prosty i przejrzysty. Gratulacje.

roberto @ 23-06-2007 14:44

#4

Żeby problem ominąć trzeba wpakować mysql_num_rows między query a while. Mniej więcej tak:(przy okazji dodałem prostą funkcje) $wynik = mysql_query ("SELECT * FROM komentarze WHERE zatwierdz=1 order by nr desc;"); if (num_rows($result)) { //wybieramy zatwierdzone komentarze i segregujemy według pola nr od wartości największej do najmniejszej print"<UL>"; while ($rekord = mysql_fetch_array ($wynik, MYSQL_NUM)) { //mysql_fetch_array() zwraca nam tablicę indeksowaną numerycznie, gdzie indeks zaczyna się od 0 (MYSQL_NUM) print "<LI>".$rekord[2] = stripslashes($rekord[2]).", <B> ".$rekord[1] = stripslashes($rekord[1])."</B>, ".$rekord[3]."</LI>"; //w pętli while wyświetlamy po kolei wszytskie komentarze w kolejności treść, pseudonim (nick), data } } No i oczywiście gdzieś wpakować tą funkcje function num_rows($query_id = 0) { return ($query_id) ? @mysql_num_rows($query_id) : false; } Poza tym przy filtrowaniu danych przesłanych przez usera nie lepiej było posłużyć się funkcją mysql_real_escape_string a nie wałkować z addslashes itd. Przy okazji skrypt działa tylko z register_globals ON.

Tajga88 @ 28-06-2007 20:31

#5

Witam Mam maly problem z tym skryptem. Gdy dodaje tabele (zapytanie SQL z pliku tabele.php) otrzymuje komunikat: #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''komentarze' ('nr' TINYINT NOT NULL AUTO_INCREMENT, 'nick' TEXT NOT NULL, 'tresc' at line 1 Co z tym zrobic? Po drugie, mam rowniez ten sam blad co kolega wczesniej komentarze.php - Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource.... i nie pomaga rozwiazanie podane w komentarzu, otrzymuej wtedy kolejny blad. Prosze o pomoc. Dziekuje

ignaczakk @ 05-07-2007 20:08
Copyright © 2005-2006 Compzone.Org. Kopiowanie i wykorzystywanie materiałów zawartych na tej stronie bez zgody autora zabronione!