Jak napisać księgę gości?

ksiegaBezpieczna oraz prosta w instalacji księga gości to jeden z najczęstszych obiektów poszukiwań młodych webmasterów, którzy z powodu braku doświadczenia i wiedzy (może też chęci) nie mogą takowej napisać samodzielnie. Postanowiłem wyjść na przeciw ich wątpliwości i napisać mały poradnik na temat tworzenia księgi gości za pomocą PHP.

Skrypt oparty o pliki tekstowe sobie podarujemy, gdyż takowy już raz publikowałem

<?php
/*
Autor: Komeniusz
Plik ksiega.txt nalezy utworzyc recznie nadajac mu uprawnienia do odczytu i zapisu
*/
echo'
<form action="" method="post">
<table border="2">
<tr><td>Nick:</td><td><input type="text" name="tytul" size="40" /></td></tr>
<tr><td>Wpis:</td><td>
   <textarea name="wpis" cols=60 rows=10 wrap="virtual"></textarea>
</td></tr>
</table>
<input type="submit" value="Wpisz sie!" />
</form>
';
 
$tytul = $_POST['tytul'];
$wpis = $_POST['wpis'];
 
if($tytul && $wpis) { // są informacje do wpisania
 
 // skomplikowany wpis
 $ksiega[0] = "<h3>".$tytul."</h3><p>".$wpis."</p>rn";
 
 if (file_exists("ksiega.txt")) { // już jest założony plik
  $i = 1;
  $plik = fopen ("ksiega.txt", "r+"); //odczyt danych
  flock ($plik, 2);
  while (!(feof($plik))) {
   $ksiega[$i++] = fgets ($plik, 2048);
  }
  $ilosc=$i;
  fseek ($plik, 0);                 // powrót do początku pliku
  for ($i=0; $i<$ilosc; $i++) {         // i zapis
   fputs ($plik, "$ksiega[$i]");
  }
 flock ($plik, 3);
 fclose ($plik);
 }
 else {                     // nie ma pliku, więc tworzymy nowy
  $plik = fopen ("ksiega.txt", "w+");
  flock ($plik, 2);
  fputs ($plik, "$ksiega[0]");
  flock ($plik, 3);
  fclose ($plik);
 }
}
 
echo'<h2>Ksiega gosci</h2><hr />';
if(file_exists("ksiega.txt")) {  //jesli plik istnieje
 $plik = fopen ("ksiega.txt", "r");
 while(!(feof($plik))) {
  echo(fgets ($plik, 2048));
 }
}
?>

Zajmiemy się zatem napisaniem księgi gości w oparciu o bazę danych MySQL.

Przed przystąpieniem do pisania jakiegokolwiek kodu należy w pierwszej kolejności przemyśleć co tak naprawdę chcemy osiągnąć. Naszym celem jest stworzenie księgi gości w oparciu o bazę danych MySQL. Do księgi może wpisać się każdy użytkownik, który musi podać swój nick oraz treść wpisu. Całość ma znajdować się w jednym pliku *.php.

Zacznijmy od stworzenia zrzutu bazy danych z kilkoma przykładowymi wpisami, których użyjemy do przetestowania wyświetlania danych. Dodawaniem wpisów zajmiemy się na końcu.

--
-- Struktura tabeli dla  `ksiega`
--
CREATE TABLE IF NOT EXISTS `ksiega` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nick` varchar(50) NOT NULL,
`wpis` text NOT NULL,
`data` datetime NOT NULL,
`ip` varchar(30) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
--
-- Zrzut danych tabeli `ksiega`
--
INSERT INTO `ksiega` (`id`, `nick`, `wpis`, `data`, `ip`) VALUES
(1, 'komeniusz', 'test', '2010-03-08 12:09:42', '127.0.0.1'),
(2, 'komeniusz', 'drugi test', '2010-03-08 12:09:57', '127.0.0.1');

W wyeksportowanej tabeli umieściłem dwa testowe wpisy, które zaraz wyświetlimy.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 		<meta name="Author" content="Hubert Grabowski" />
		<title>Księga gości Huberta Grabowskiego - www.HubertGrabowski.pl</title>
	</head>
	<body>
<?php
mysql_connect("localhost", "root", "") or
	die("Blad podczas polaczenia z MySQL. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
mysql_select_db("ksiega") or
 	die("Blad podczas wybierania bazy. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
?>
<?php
$zapytanie = mysql_query("SELECT * FROM `ksiega` ORDER BY `id` DESC;");
while($zapytanie && $rekord = mysql_fetch_assoc($zapytanie)) {
	echo'Nick: <b>'.stripslashes($rekord['nick']).'</b> - '.$rekord['data'].'<br />';
	echo'Wpis: <b>'.stripslashes($rekord['wpis']).'</b><hr />';
}
?>
	</body>
</html>

W standardowym dokumencie (x)HTML łączymy się z bazą danych, a następnie pobieramy z tabeli ksiega pola nick, data oraz wpis. Każdy wpis wyświetlany jest nad linią <hr />. Ponadto nick i wpis potraktowane są funkcją stripslashes(), która usuwa znak sprzed – odwrotność funkcji addslashes(). Stosuje się je ze względu na ryzyko ataku typu SQLInjection.

Za dodawanie wpisów będzie odpowiadać poniższy formularz

<form action="" method="post">
	<input type="text" name="nick" value="Nick" /><br />
	<textarea name="wpis" cols="35" rows="5" maxlength="200">Treść wpisu</textarea><br />
	<input type="submit" name="submit" value="Wyślij" /><hr />
</form>

Oraz tenże skrawek kodu

<?php
$nick = addslashes(htmlspecialchars($_POST['nick'])); //filtrujemy dane
$wpis = addslashes(htmlspecialchars($_POST['wpis'])); //filtrujemy dane
$ip = $_SERVER['REMOTE_ADDR'];
 
	mysql_query("INSERT INTO ksiega (nick, wpis, data, ip)
	VALUES ('$nick', '$wpis', now(), '$ip');");
 
	echo'Dziękujemy za dodanie wpisu<hr />';
?>

Nick i wpis przed dodaniem do bazy danych należy przefiltrować. Addslashes() pomaga zabezpieczyć przed atakiem SQLInjection, a htmlspecjalchars() przed XSS. Połączmy wszystko w jedną, spójną całość dodając instrukcje warunkową, która wyświetli informacje po dodaniu wpisu usuwając formularz.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="pl" lang="pl">
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
 		<meta name="Author" content="Hubert Grabowski" />
		<title>Księga gości Huberta Grabowskiego - www.HubertGrabowski.pl</title>
	</head>
	<body>
<?php
mysql_connect("localhost", "root", "haslo") or
	die("Blad podczas polaczenia z MySQL. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
mysql_select_db("ksiega") or
 	die("Blad podczas wybierania bazy. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
?>
 
<?php
/*
 * Autor: Komeniusz
 * Page: www.HubertGrabowski.pl
 */
if(isset($_POST['submit'])) {
$nick = addslashes(htmlspecialchars($_POST['nick'])); //filtrujemy dane
$wpis = addslashes(htmlspecialchars($_POST['wpis'])); //filtrujemy dane
$ip = $_SERVER['REMOTE_ADDR'];
 
	mysql_query("INSERT INTO ksiega (nick, wpis, data, ip)
	VALUES ('$nick', '$wpis', now(), '$ip');");
 
	echo'Dziękujemy za dodanie wpisu<hr />';
} else {
	echo'
	<form action="" method="post">
		<input type="text" name="nick" value="Nick" /><br />
		<textarea name="wpis" cols="35" rows="5" maxlength="200">Treść wpisu</textarea><br />
		<input type="submit" name="submit" value="Wyślij" /><hr />
	</form>
	';
}
?>
 
<?php
$zapytanie = mysql_query("SELECT * FROM `ksiega` ORDER BY `id` DESC;");
while($zapytanie && $rekord = mysql_fetch_assoc($zapytanie)) {
	echo'Nick: <b>'.stripslashes($rekord['nick']).'</b> - '.$rekord['data'].'<br />';
	echo'Wpis: <b>'.stripslashes($rekord['wpis']).'</b><hr />';
}
?>
	</body>
</html>

Powyższy kod jest gotowcem księgi gości opartym o bazę danych. Skrypt można zastosować też do systemu komentarzy. Wszelkie modyfikacje pozostawiam w rękach i klawiaturze Czytelnika.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *