Вот захотелось написать свою статейку, про что нибудь связанное с 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 = "Пожалуйста впишите имя. "; } if($comments == "") { $error2 = "Пожалуйста впишите коментарии. "; } }
// проверка указанны ли комментарии и имя if ($name != "" and $comments != "" and $id != "") {
// Замена недоброжелательных знаков в имени, емайле, комментариях и номере комментариев
$name = ereg_replace(" ", "", $name); $name = ereg_replace(" ", "", $name); $name = ereg_replace("<", "<", $name); $name = ereg_replace(">", ">", $name); $email = ereg_replace(" ", "", $email); $email = ereg_replace(" ", "", $email); $email = ereg_replace("<", "<", $email); $email = ereg_replace(">", ">", $email); $id = ereg_replace(" ", "", $id); $id = ereg_replace(" ", "", $id); $id = ereg_replace("<", "<", $id); $id = ereg_replace(">", ">", $id); $web = ereg_replace("<", "<", $web); $web = ereg_replace(">", ">", $web); $web = ereg_replace(" ", " ", $web); $web = ereg_replace(" ", "", $web); $comments = ereg_replace("<", "<", $comments); $comments = ereg_replace(">", ">", $comments); $comments = ereg_replace(" ", " ", $comments); $comments = ereg_replace(" ", " ", $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, если нет, то просто ip if($HTTP_X_FORWARDED_FOR=="") { $ip = $REMOTE_ADDR; } else { $ip = $HTTP_X_FORWARDED_FOR; }
// Устанавливаем вид записи в базу данных $text = "$id $name $date $email $web $ip $comments "; $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 = ">> Напишите меньше, слишком много слов. "; }
} // отправить } 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(" ",$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("([ ]|^)www.", " http://www.", $commentsa); $commentsa = eregi_replace("([ ]|^)ftp.", " ftp://ftp.", $commentsa); $commentsa = eregi_replace("(http://[^ ) "?>]+)", "<a href="1" target="_blank">1</a>", $commentsa); $commentsa = eregi_replace("(ftp://[^ ) "?>]+)", "<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, " ", 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/.
Автор: solid Источник: web-student
|