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


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


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

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

id date name e-mail web ip comments

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

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

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

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

Если вы впервой столкнулись с 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\.", "
//www.", $commentsa);
$commentsa = eregi_replace("([ \t]|^)ftp\.", "
ftp://ftp.", $commentsa);
$commentsa = eregi_replace("(//[^ )\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) != "//"
and $weba != "") {
$weba = " - <small><i>(<a
href='//$weba'>//$weba</a>)</i></small>";
}
else if(substr(trim(strtolower($weba)), 0, 7) ==
"//") {
$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( mailto:solid@email.ee ). Ах да, чуть не забыл, закройте всё это тэгом </table>. Скрипт скачать можите по этому адресу: //coding.dyn.ee/solid/projects/comments/ ( http://webscript.ru///coding.dyn.ee/solid/projects/comments/ ).