DataLife Engine > PHP > Форум без базы данных за 15 минут
Форум без базы данных за 15 минут28 сентября 2007. Разместил: podpole |
<? /* Полноценный форум без базы данных. Версия 1.0 Автор: StagnantIce aka Loser Этой статьей я хочу показать, что можно обойтись без баз данных, написав неплохой форум. Это статья является как бы продолжением двух предыдущих. И так, поехали: forum.htm Этот файл вставляется в файл index.php, который будет описан позже. Можно вставить уже готовый дизайн в этот файл при помощи include. Как это делается, читайте в статье “Свой движок за 15 минут” часть 1. Сначала описываем форму для ввода нового сообщения, при нажатии кнопки методом GET будет передано в скрипт addtext.php значения наших переменных */ ?> <form method="GET" action="addtext.php"> <? /* Если global constans в PHP равен false, то берем переменную list из массива, это переменная поможет нам показывать страницы форума */ $list=$_GET['list']; //Если сессии этого пользователя нет, то выводим поле для ввода логина if (empty($_SESSION['username'])) echo 'Имя: <input type=text name="nik"><br>'; else $log=' от '.$_SESSION['username']; ?> <br><br>Сообщение<?echo $log;?>: <br><table cellpadding=5 width=100%><tr> <td width=20% style="border:1px #CCCCCC solid" align=center> </td> <td style="border:1px #CCCCCC solid" width=80% class="text" valign=top> <textarea cols=60 rows=6 name="text"></textarea><br><br> <input type="submit" value="Добавить" align=right></td></tr></table> </form> <? /* Выше мы объявили нашу таблицу для ввода сообщения, style="border:1px #CCCCCC solid" - текст CSS, чтобы рамочка была серой, шириной 1, и была solid, то есть сплошной линией, можно установить dashed - пунктиром, смотрите в любом мануале по CSS в первом столбце ничего не буден написано, на самом деле, в сообщения мы будем туда заносить аватор и другую информацию. Теперь откроем наш файл форума, и присоединим к нашему файлу файл config.php В нем ничего можно не писать кроме параметров подключения к базе данных. Дело в том, что пользователей мы как бы регистрировали в базе данных, и мы можем доставать их URL к аваторам и другую информацию о них. Там будут находиться и их статусы. Если не хотите писать с базами данных, то не создавайте файл config.php. Ничего страшного не произойдет. /* config.php <? /* Статусы пользователей */ $stat[0]='Гость'; $stat[1]='Пользователь'; $stat[2]='Модератор'; $stat[3]='Администратор'; /* Параметры подключения к базе данных Если флаг $hh=0, то мы находимся на localhost, если на $hh=1 то на сервере. Когда вы загрузите форум на сайт, $hh должно быть =1 /* $hh=0; if ($hh==1) { $dbase="****"; // Имя базы данных $host="database"; // Хост базы, database для holm $login="****"; // Логин $passw="****"; //Пароль } else { $dbase="base"; //Имя базы данных на вашем компьютере $host="localhost"; $login="root"; $passw=""; } ?> */ if (file_exists("forum.txt")) $f=file('forum.txt'); else {$r=fopen('forum.txt','w');fclose($r);} if (file_exists("config.php")) require_once("config.php"); //Если не знаем страницу, считаем, что открываем первую if (empty($list)) $list=1; for($i=sizeof($f)-1-($list-1)*8*3;($i>sizeof($f)-1-$list*8*3)&&($i>0);$i=$i-3) { //Достаем из файла 8 последних сообщений $text=substr($f[$i],0,strlen($f[$i])-2); $nik2=substr($f[$i-1],0,strlen($f[$i-1])-2); $date=substr($f[$i-2],0,strlen($f[$i-2])-2); /* Ищем пользователей в базе Если переменной $host нет, то есть вы не создали config.php то пользователей мы не будем искать. Они будут все Гости. */ if (isset($host)) { $db = mysql_connect($host, $login, $passw); mysql_select_db($dbase,$db) or error(3); $res = mysql_query("SELECT * FROM users WHERE logi='$nik2'",$db); if (mysql_num_rows($res)>0) {$file=mysql_result($res,0,"avat"); $st=mysql_result($res,0,"stat"); } else {$file="images/none.jpg";$st=0;} } /* Создайте картинку для всех пользователей, кто Гость в папке images с именем none.jpg */ if (empty($file)) $file="images/none.jpg"; // Ну а теперь выводим список наших сообщений в файле. ?> <table cellpadding=5 width=100%><tr> <td width=20% bgcolor="#dde1f3" style="border:1px #CCCCCC solid" align=center> <img width=100 height=100 style="border:1px #CCCCCC solid" src="<?echo $file;?>"> <br> <? /* вставили картинку, теперь добавим автора в сообщение. Сделаем это ссылкой на скрипт. Скрипт дает информацию о пользователе. */ ?> <a href="getinfo.php?nik=<?echo $nik2;?>"><?echo $nik2.'</a> <br> <? /* Выводим сообщение пользователя и его статус. */ ?> Статус: '.$stat[$st].'<br><br>Был(а) здесь<br> '.$date;?></td> <td style="border:1px #CCCCCC solid" width=80% valign=top> <?echo $text;?><br><br> <? /* Выводим ссылку “ответить”, при нажатии которой, появляется форма для добавления ответа на сообщение. Вызывается скрипт otvet.php */ ?> <a onClick="document.getElementById('f<? echo $i;?>').style.display='block';">Ответить</a> <form style="display:none" method="POST" id="f<? echo $i;?>" action="otvet.php?id=<? echo $i;?>"> <textarea name="t" cols=40 rows=3></textarea> <br><input type=submit value="Ответить"></form> </td></tr></table> <? } /* Выводим список URL к другим страницам. */ echo 'Страница '; $k=1; for ($i=sizeof($f)-1;$i>0;$i=$i-3*8,$k=$k+1) if ($list!=$k)echo '<a href="index.php?go=forum&list='.$k.'">'.$k.'</a> '; else echo '<u>'.$k.'</u> '; ?> <br> Теперь приведу Пример файла index.php. И главных скриптов addtext.php otvet.php для добавления нового сообщения и ответа на сообщение соответственно. Если у вас возникнут вопросы, рекомендую прочитать статью “Свой движок за 15 минут”. addtext.php Скрипт добавляет, ник, сообщение и дату, после каждого поля ставит Enter <? $text=$_GET['text']; $nik=$_GET['nik']; $br=chr(13).chr(10); session_start(); if (isset($_SESSION['username'])) $nik=$_SESSION['username']; else $nik="Гость ".$nik; $text=stripslashes($text); $text=ereg_replace('\\\"',""",$text); $text=ereg_replace("!","!",$text); $text=ereg_replace("\r","",$text); $text=ereg_replace("%","%",$text); $text=ereg_replace("^ +","",$text); $text=ereg_replace(" +$","",$text); $text=ereg_replace(" +"," ",$text); $text=ereg_replace("\n","<br>",$text); $dd=date('d M в h:i',time()); $fe=fopen('forum.txt','a'); fputs($fe,$dd.$br.$nik.$br.$text.$br); fclose($fe); Header ("Location: index.php?go=forum"); ?> otvet.php Этот скрипт прибавляет к существующему уже сообщению еще строчку с тегами, получается как бы ответ на это сообщение, хотя по правде это одно и тоже сообщение в строчке. <? session_start(); $id=intval($_GET['id']); $t=$_POST['t']; $dd=date('d M в G:i',time()); $br=chr(13).chr(10); if (isset($_SESSION['username'])) $nik=$_SESSION['username']; else $nik="Гость "; $f=file("forum.txt"); $rr=substr($f[$id],0,strlen($f[$id])-2); $l=$rr.'<br><span style="color: #000000; font-family: Verdana, Arial, Helvetica; font-size: 10px;"><b>'.$nik.'</b> ('.$dd.'): '.$t.'</span>'.$br; $temp = tmpfile(); //Создание временного файла for ($i=0;$i<sizeof($f);$i++) if ($i!=$id) fwrite($temp, $f[$i]); else fwrite($temp, $l); //Если это наше сообщение пишем ответ, а теперь пишем новый forum.txt $fe=fopen('forum.txt','w+'); fseek($temp, 0); while (!feof($temp)) { $k=fgets($temp); fwrite($fe,$k); } fclose($fe); Header ("Location: index.php?go=forum"); ?> Сразу оговорюсь, при вводе сообщений нет проверки на ввод скрипта, а не текста, нужно проверить, что не вводятся символы <,> например, можно написать функцию для проверки каждого поля, назовем ее correct(). function correct($f) { for ($i=0;$i<strlen($f);$i++) if (substr($f,$i,1)=="<" || substr($f,$i,1)==">") die('ошибка ввода'); } addtext.php версия 2 <? function correct($f) { for ($i=0;$i<strlen($f);$i++) if (substr($f,$i,1)=="<" || substr($f,$i,1)==">") die('ошибка ввода'); } $text=$_GET['text']; $nik=$_GET['nik']; correct($text); correct($nik); $br=chr(13).chr(10); session_start(); if (isset($_SESSION['username'])) $nik=$_SESSION['username']; else $nik="Гость ".$nik; $text=stripslashes($text); $text=ereg_replace('\\\"',""",$text); $text=ereg_replace("!","!",$text); $text=ereg_replace("\r","",$text); $text=ereg_replace("%","%",$text); $text=ereg_replace("^ +","",$text); $text=ereg_replace(" +$","",$text); $text=ereg_replace(" +"," ",$text); $text=ereg_replace("\n","<br>",$text); $dd=date('d M в h:i',time()); $fe=fopen('forum.txt','a'); fputs($fe,$dd.$br.$nik.$br.$text.$br); fclose($fe); Header ("Location: index.php?go=forum"); ?> index.php <? session_start(); echo '<a href="index.php?go=forum">Форум</a>'; $go=$_GET['go']; if ($go=="") $go="main"; $file='htm/'.$go.'.htm'; if (file_exists($file)) include($file); else echo 'Файл '.$file.' не найден'; ?> Все файлы работают, было проверено. Вот и все что я хотел поведать, спасибо за внимание. |