WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




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


Прислал: 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. Ах да, чуть не забыл, закройте всё это тэгом </table>. Скрипт скачать можите по этому адресу: //coding.dyn.ee/solid/projects/comments/.


 :::::  error пишет 21.02.2002 @ 16:25 
А почему бы не использовать str_replace вместо ereg_replace?
 :::::  Solid пишет 21.02.2002 @ 18:33 
Просто в некотрых случаях мне больше нравится str_replace, в некоторых ereg_replace.
 :::::  banderlog пишет 22.02.2002 @ 17:15 
Не работает:( Скрипт выдает в командную строку id с пустым значением. На ошибки скрипт реагирует, а вот комментарий не пишет. Код без изменений "сдернут" со статьи
 :::::  Solid пишет 22.02.2002 @ 17:43 
Походу NAS немного не правильно всё сделал, в коде всмысле, у меня <pre> был, он всё блокирует, а он всё мануально сделал и наверное кое-где ошибка какая то. Оригинал статьи находится здесь: http://coding.dyn.ee/articles/php/18/ , там код работает, а лучше всего не сдирать код, а почитать его, а скачать можно уже версию 1.1 с http://coding.dyn.ee/solid/projects/comments/ - отсюда короче ..
 :::::  acorp пишет 22.02.2002 @ 17:51 
Как ПРАВИЛЬНО вложить результат в страницу? Пробовал php include - не хочет, а в чистогане - работает....
 :::::  banderlog пишет 22.02.2002 @ 17:57 
У меня странится грузиться по пронципу:
index.php?main. Не будет проблем со скриптом? И еще - у тебя на сайте - ЧПУ? В смысле articles/18/ Если да - как ты это сделал, а то spectator не внятно разъяснил
 :::::  Solid пишет 22.02.2002 @ 18:10 
По принципу спектатора, правдо я тоже спектатора не очень то и понял, пришлось на english'е читать, в итоге получилось. Наверное следующий раз напишу статью про articles скрипт, просто парой слов не объяснить как я это сделал, там большенство из-за скрипта такая штука вышла.

Короче в index.php есть 2 переменные: 1) link (/php/); 2) id (20);
Ну вот, теперь в htaccess идаем как было рассказанно на сайте, ошибка ссылается на index.php, который берёт линк, который введён, например /articles/php/1/, извлекаем эти данный с помощью разных функций, и далее просто делаем include.

Насчёт скрипта, он везде может работать где есть php, главное уметь правильно установить (я из эстонии, так что иногда могу говорить как эстонец, привычка выработалась), ну так вот, у тебя когда query_string == "main" у тебя что за опперация, если include то вставляешь в тот include файл comments.php и далее в этом скрипте комментавиев изменяешь post="comments.php?id=какой то" на post="index.php?main" и всё работает. Хотя я думал что этот скрипт больше подходит к бяду статей, к которым можно оставлять комментарии, а получается гостевуха какая то ... ;)
 :::::  Артем Акатов пишет 22.02.2002 @ 19:44 
У меня несколько вопросов к автору:
1. Зачем было делать вроде ereg_replace("<", "<", $id); и т.д., когда можно было просто $id = htmlspecialchars($id); (я так понимаю, ты пытаешься сделать то же самое)?
2. Зачем посылать три куки, кодга можно было послать одну в виде $name."|".$email."|".$web;, а потом это расчленить функцией explode()?
3. Зачем устраивать такую мурню с выводами ошибок, когда можно написать спец. функцию для вывода ошибок?
и т.д.
И вообще скрипт достаточно сырой. Лучше было оформить все в виде функций, например, функция по выводу формы, по выводу комментариев, сохранению, проверки и т.д. А когда логические блоки разбросаны по всему скрипту, то это выглядит очень некрасиво.
--------------
MyPHP - Все для изучения PHP
http://www.myphp.dem.ru
 :::::  Solid пишет 22.02.2002 @ 20:35 
Спасибо за критикизацию ... Теперь буду иметь ввиду что народу больше нарвится скрипты видеть ввиде блоков. Следующая версия скрипта будет состоять из блоков. А вот насчёт другого, сорри, я не очень то давно на пхп программлю, просто захотелось статью написать по принципу - "Дело было вечером, делать было нечего ...".
 :::::  Dimka пишет 23.02.2002 @ 05:05 
Помойму, куски кода взяты из скриптов прогер-команды Manlix SW (www.manliks.ru/manlix)
 :::::  Solid пишет 23.02.2002 @ 13:39 
str_replace в отличии от eregi_replace не поддерживает регулярные выражения ;)
Куки взяты с www.php.net, всё только оттуда ;)
 :::::  Сергей пишет 23.02.2002 @ 19:52 
$name = ereg_replace(">", ">", $name);
что-то не понял смысл этой записи.... > запеняется на >а толку от этого?
 :::::  Solid пишет 23.02.2002 @ 20:22 
Просто этот скрипт комментариев автоматом заменяет html версию на обычную .. lt; всмысле
 :::::  Евгений пишет 01.03.2002 @ 20:19 
str_replace работает намного быстрее, чем регулярные выражения POSIX (ereg)
 :::::  Solid пишет 01.03.2002 @ 22:50 
А зачем вообще нужны регулярные выражения?? Вот, мне и понадобились и нужно вообще эту статью изменить, всмысле код, да и слова можно было бы ... Написал очень быстро, вот и получился такой "сырой код" ;)
 :::::  Zmey пишет 06.03.2002 @ 23:26 
А я считаю что скрипт нормальный, потому как доступно показывает начинающему пользователю что и где и как делается, и привычными методами, пусть мусорно может быть пусть не совсем идеально, но зато человек глядя на этот скрипт сможет из него выбрать для себя что либо полезное
 :::::  Solid пишет 06.03.2002 @ 23:32 
Спасибо за добрые слова. Теперь у меня есть настроение продолжать писать статьи ;) Думаю скоро ещё какую нибудь напишу.
 :::::  Dan пишет 17.03.2002 @ 16:13 
Tak ne proshe li vmest regexpov striptags i stripslashes postavit
 :::::  AlieN пишет 27.03.2002 @ 20:19 
Ну некрасивый и безграмотный код!
Смотри меняю вот это:
$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);
На
$search=array("\t","\n");
$replace=array(" ","");
$web=preg_replace($search,$replace,$web);
$id=preg_replace($search,$replace,$id);
$email=preg_replace($search,$replace,$email);
$name=preg_replace($search,$replace,$name);

PS Есть смысл задуматься для чего нужны функции htmlspecialchars
И что за человек кидает в своём имени символ новой строки
Я бы его просто забанил


 :::::  Solid пишет 27.03.2002 @ 23:07 
Спасибо за совет.

А вот насчёт челов, которые в имени новую строку делают ... всё может быть, много идиотов в этом мире. Так что защитится некогда не помешает ;)
 :::::  NexuS пишет 29.03.2002 @ 05:05 
Да не, вообще хорошая заметка. Я вот только седня занялся PHP и нахожу эту статью полезной для себя... А вообще, не надо говорить плохой код и т.п. Все в мире относительно... Скорей всего любой самый крутой ваш код создатели PHP сочтут достаточно тривиальным... А вот за добавления спасибо - тоже очень помогают. : ) Продолжайте в том же духе!
 :::::  JustLook пишет 06.04.2002 @ 19:01 
Любой код тривиален :) Зависит только от квалификации читающего код человека.
Мне тоже не все нравится. Но давайте подойдем конструктивно. Человек _написал_ статью. И я думаю что найдется пара сотен новичков, которые возьмут отсюда идеи и примеры. А кому не нравится - пожалуйста, пишите статьи. Пишите правильный код.
Только не просто критикуйте а _пишите_ статьи :)
 :::::  Майк пишет 08.11.2002 @ 05:07 
А я поставил, настроил, запустил - сижу и радуюсь :)
 :::::  Vadim Sk. пишет 03.05.2003 @ 01:03 
Народ, скажите пожалуйста, с чего начать изучать PHP, вот научился добавлять данные в файл, научился читать их оттудава, ну конечно без всяких там проверок и т.д., что вы можете дальше посоветовать, сижу и не знаю что придумать :( Где найти инфо о том, как проверять введенный данные, читать из файла текст с разбиением на блоки и т.д. Помогите плиз, могу помочь в дизайне кому, если надо.
 :::::  decoder пишет 03.07.2003 @ 18:36 
Объясните пожалуйста синтаксис
$name = ereg_replace("\n", "", $name);
Я понимаю так: читается переменная $name, проверяется, встречается ли символ \n(1-ый параметр), если да, то заменяется на ничего(2-ой параметр) и результат сохраняется в переменной $name(3-ий параметр). Правильно?
 :::::  fx пишет 08.08.2003 @ 01:01 
я тоже начал изучать PHP и вот моя первая работа и как не странно это тоже форма комментариев!
я прочитал много кодов гостевых книг выбрал самое простое и написал очень легко - понятно будет всем! хочу поделится готовой формой http://www.forex.strana.de/images/Comments.zip она со смайликами и HTML включён но можно выключить в коде - там увидете есть комментарий
короче всё очень доступно и ничего лишнего
буду рад если кому то будет полезен!
 :::::  Dj Power пишет 23.03.2004 @ 22:43 
А че прикольно !
 :::::  Dima пишет 11.09.2004 @ 21:44 
Битая у тебя ссылка. Не скачивается скрипт.
 :::::  fx пишет 12.09.2004 @ 08:17 
Извиняюсь за ссылку 2 комментария выше, но мы давно уже переехали и скрипт не сохранился, так что ссылка битая, удалить я её не могу, если есть возможность у кого-то из админов, то удалите не рабочую ссылку пожалуста
 :::::  Yuy пишет 23.03.2009 @ 01:36 
Хорошая статья. Но..скрипт добавления комментариев лучше делать с премодерацией через емаил. Подробно это описано здесь http://acvarif.info/wbsphp/longphp/commphp.html
 :::::  Irinda пишет 10.12.2009 @ 15:18 
Solid, спасибо за скрипт!!! 3 суток юзала всякие разные скрипты комментов из инета - все зазря!!! а твой заработал, без ошибок! скрипт отличный! рекомендую!!!
 :::::  вып пишет 21.03.2010 @ 18:14 
ып
 :::::  dvs пишет 16.04.2010 @ 01:51 
Сколтко лет прошло, а тема всё актуальна
 :::::  gigi пишет 04.11.2010 @ 17:44 
Потому, что многим она интересна!
Имя:
Email:
URL

Введите сумму двух чисел девять и шесть (девять+шесть=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0233200