Главная » Полезные статьи » Язык PHP » Форум без базы данных за 15 минут
Распечатать статью

Форум без базы данных за 15 минут

<?
/*
Полноценный форум без базы данных.

Версия 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% 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.’ не найден';
?>

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

Источник:  i-faq.ru

Вы можете оставить комментарий, или обратную ссылку на Ваш сайт.

Оставить комментарий

Похожие статьи