Вот захотелось
написать свою статейку, про что нибудь связанное
с 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/. |