Статьи,обзоры,справочники по PHP

Скрипт комментариев


Прислал: Solid [ 21.02.2002 @ 13:01 ]
Раздел:: [ Статьи по PHP ]

Вот захотелось написать свою статейку, про что нибудь связанное с PHP. Думаю, вам будет очень интересно узнать, как сделать самую простую систему комментариев с использованием под базу данных всего лишь одного текстового файла.

И так, начнём с самого простого, а если точнее сказать с самой идеи. Идея очень проста, как и все идеи. База данных будет иметь следующий вид:

id date name e-mail web ip comments

Надеюсь здесь всё понятно, для не понятливых объясняю, что в файле будет шесть колонок, разделяются они клавишей “tab” и каждый новый комментарий будет писаться выше предыдущего.

Всегда нужно помнить – чем безопасней скрипт и чем больше в скрипте с умом продуманных «фитчей», тем ценнее скрипт!

Например, нам нужно будет сделать так, если у человека нет сайта, то мы выводим на экран пустую строку, а если есть то выводим адрес. Ещё пример, если человек написал в строке сайта www.my_site.com, то нужно дописать в начале http:// что бы ссылка работала. Если её не будет, то ссылка будет плохой, и выскачет ошиПка. Надеюсь, вы это тоже поняли …

Теперь приступим к самому главному – написанию скрипта.

Если вы впервой столкнулись с PHP, то вы, скорее всего, не поймёте в чём дело, но тут я постараюсь вам объяснить что к чему. Перед моими комментариями будут стоять вот такие вот слеши «//». И так поехали …

Первая часть это будет запись, проверка на всякие недоброжелательные знаки, кукисы и т.д., а вот и сам код:

<? // файл который будем использовать под базу данных $comfile = "file.txt";

// Запись куки имя и e-mail, хранить до 1.01.2003 if($name != "") { setcookie("name", "$name", mktime(0,0,0,1,1,2003)); } if($email != "") { setcookie("email", "$email", mktime(0,0,0,1,1,2003)); } if($web != "") { setcookie("web", "$web", mktime(0,0,0,1,1,2003)); }

if(id != "") { // Проверка на "отправить" и выведение ошибок, если таковые есть if($submit == 'отправить') { if($name == "") { $error1 = "Пожалуйста впишите имя.<hr>"; } if($comments == "") { $error2 = "Пожалуйста впишите коментарии.<hr>"; } }


// проверка указанны ли комментарии и имя if ($name != "" and $comments != "" and $id != "") {
// Замена недоброжелательных знаков в имени, емайле, комментариях и номере комемментариев $name = ereg_replace("\n", "", $name); $name = ereg_replace("\t", "", $name); $name = ereg_replace("<", "<", $name); $name = ereg_replace(">", ">", $name); $email = ereg_replace("\n", "", $email); $email = ereg_replace("\t", "", $email); $email = ereg_replace("<", "<", $email); $email = ereg_replace(">", ">", $email); $id = ereg_replace("\n", "", $id); $id = ereg_replace("\t", "", $id); $id = ereg_replace("<", "<", $id); $id = ereg_replace(">", ">", $id); $web = ereg_replace("<", "<", $web); $web = ereg_replace(">", ">", $web); $web = ereg_replace("\t", " ", $web); $web = ereg_replace("\n", "", $web); $comments = ereg_replace("<", "<", $comments); $comments = ereg_replace(">", ">", $comments); $comments = ereg_replace("\n", "<br>", $comments); $comments = ereg_replace("\t", " ", $comments);
// Чтение из файла старых записей, если нету файла, то создаём и считываем пустую строку if(file_exists($comfile)) { $read_old = fopen($comfile, "r"); $old = fread($read_old, filesize($comfile)); fclose($read_old); } else { $read_old = fopen($comfile, "w"); $old = ""; fclose($read_old); }
// Настройка даты $date = date("j.m.Y");
// Вычисление есть ли ип проходимый через cache, если нет, то просто ип if($HTTP_X_FORWARDED_FOR=="") { $ip = $REMOTE_ADDR; } else { $ip = $HTTP_X_FORWARDED_FOR; }




// Устанавливаем вид записи в базу данных $text = "$id\t$name\t$date\t$email\t$web\t$ip\t$comments\n"; $text .= "$old";
// Проверка максимального колличества слов // напротив $ no_of_words вставте максимальное колличество слов $no_of_words = 100; $words_array = split(" ", $comments, $no_of_words++); if(count($words_array) <= $no_of_words) { $fp = fopen($comfile, "w"); fputs($fp, $text); fclose($fp); } else { $error3 = "<b>>> Напишите чуть меньше, слишком много слов.</b><hr>"; }
} // отправить } else { $error4 = "Комментарии для пустого значения id нельзя слать."; } // Если id это пустое значение. ?>
Зетем делаем форму, откуда будут отправляться данные:
<table border='0' cellspacing='4' cellpadding='0' width='100%'>
<tr><form method='post' action='demo.php?id=<? echo $id; ?>'><td>
имя : <input type='text' name='name' value='<? echo $HTTP_COOKIE_VARS["name"]; ?>' style="width=70">
 : мыло : <input type='text' name='email' value='<? echo $HTTP_COOKIE_VARS["email"]; ?>' style="width=100">
 : сайт : <input type='text' name='web' value='<? echo $HTTP_COOKIE_VARS["web"]; ?>' style="width=169"><br>
<textarea name="comments" style="height=60; width=480"></textarea><br>
<input style="cursor:hand" type="submit" name="submit" value="отправить">
<hr size=1 color=#1d2f49>
А теперь делаем вывод комментариев:
<?
// Вывод ошибок echo "$error1$error2$error3$error4</td></tr>";
//открываем файл и считываем его $file = @file($comfile);
for ($i=0; $i<count($file); $i++) {
// Разделяем строку на столбцы $row = explode("\t",$file[$i]); list($ida, $namea, $datea, $emaila, $weba, $ipa, $commentsa) = $row; // Определям, принадлежит ли эта комментса к этой серии комментариев if($ida == $id) {


// Если в строке email нету @, то не выводим емайл if(eregi("@", $emaila)) { $emaila = "<a href='mailto:$emaila'>$namea</a>"; } else { $emaila = $namea; }
// Всякие примочки с коментариями $commentsa = eregi_replace("([ \t]|^)www\.", " http://www.", $commentsa); $commentsa = eregi_replace("([ \t]|^)ftp\.", " ftp://ftp.", $commentsa); $commentsa = eregi_replace("(http://[^ )\r\n\"\'>]+)", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $commentsa); $commentsa = eregi_replace("(ftp://[^ )\r\n\"\'>]+)", "<a href=\"\\1\" target=\"_blank\">\\1</a>", $commentsa); $commentsa = eregi_replace("([-a-z0-9_]+(\.[_a-z0-9-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)+))", "<a href=\"mailto:\\1\">\\1</a>", $commentsa); $commentsa = str_replace("\\\"", "\"", $commentsa); // Разделяем большие слова пробелом, макс длинна слова 20 симолов $commentsa = wordwrap($commentsa, 20, "\n", 1); // Работаем с "сайтом" if(substr(trim(strtolower($weba)), 0, 7) != "http://" and $weba != "") { $weba = " - <small><i>(<a href='http://$weba'>http://$weba</a>)</i></small>"; } else if(substr(trim(strtolower($weba)), 0, 7) == "http://") { $weba = " - <small><i>(<a href='$weba'>$weba</a>)</i></small>"; } echo "<tr><td bgcolor='#ffe7ce'><small>[$datea]</small> $emaila $weba</td></tr><tr><td>$commentsa</td></tr>"; } } ?>
Ну вот собсвенно и всё о чём я вам хотел рассказать. Будут воросы/дополнения/комментарии, мыльте мне на e-mail: solid@email.ee. Ах да, чуть не забыл, закройте всё это тэгом </table>. Скрипт скачать можите по этому адресу: http://coding.dyn.ee/solid/projects/comments/.

Содержание раздела