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>&nbsp;</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>&nbsp;&nbsp;&nbsp;

<?
/*
Выводим ссылку “ответить”, при нажатии которой, появляется форма
для добавления ответа на сообщение. Вызывается скрипт 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('\\\"',"&quot;",$text);
$text=ereg_replace("!","&#33;",$text);
$text=ereg_replace("\r","",$text);
$text=ereg_replace("%","&#37;",$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('\\\"',"&quot;",$text);
$text=ereg_replace("!","&#33;",$text);
$text=ereg_replace("\r","",$text);
$text=ereg_replace("%","&#37;",$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.' не найден';
?>

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