Мини форум на PHP
| |
Andrew01 | Дата: Пятница, 27 Февраля 2015, 19:04 | Сообщение # 1 |
почетный гость
Сейчас нет на сайте
| Привет всем! искал в интернете скрипты форумов, нашел только готовые, а само описание как писать скрипты нет((( мне на сайт с игрой нужен форум без всяких прибомбасов, только основные функции создание тем и переписка в них... решил сам написать и выложить может кому пригодится... вот что получилось, если я где-то не то написал то исправляйте меня (пхп изучаю в общей сложности пол года) , и по возможности подскажите как может его улучшить, особенно с бд там вообще сами увидите.
БД 4 таблицы (вот так вот вышло))))) forum_user(id, login, password, reg) - пользователи; forum_section(id, name, total, reg) - таблица с заголовками; forum_topic(id, name, section, total, data) - таблица с темами; forum_reply(id, section, topic, text, login, data) - таблица с ответами;
name - название раздела или темы total - количество тем в разделе или ответов в теме остальное думаю понятно)))
на комментарии в выводе ошибок не обращайте внимания это черновой вариант, на localhost все работает нормально вроде))))))))) Код <?php session_start(); require_once "../config/db.php"; [b]require_once "text_replace.php";[/b] ?>
<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Форум </title> </head> <body id="body_game"> <header id="page_heder"><h1>Форум</h1> </header> <?php if($_POST['go']){ $sql = "SELECT * FROM `forum_user` WHERE `login` = '{$_POST['login']}' AND `password` = '{$_POST['password']}' "; $res = mysql_query($sql); $num = mysql_num_rows($res); if($num > 0){ $_SESSION['forum_login'] = $_POST['login']; }else{ echo "Неправильный логин или пароль"; } } echo '<section id="enter_forum">'; if($_SESSION['forum_login'] == ""){ echo '<form action="" method="POST"> <table> <tr><td>Логин:</td><td><input type="text" name="login" /></td><td>Пароль:</td><td><input type="password" name="password"/></td><td><input type="submit" name="go" value="Вход"/></td><td><a href = "">Регистрация</a></td></tr> </table> </form>'; }else{ echo "Добро пожаловать ".$_SESSION['forum_login']; } echo "</section>"; if($_POST['addtopic']){ [b]$topic = trim(replacer($_POST['name_topic'])) ; $text = trim(replacer($_POST['text_topic'])) ; if($topic != "" && $text != ""){[/b] $sqlup = "SELECT `total` FROM `forum_section` WHERE `name` = '{$_GET['section']}' "; $resup = mysql_query($sqlup) or die("Не выбирается из разделов"); $tot = mysql_fetch_assoc($resup); $total = $tot['total'] + 1; $sql = "UPDATE `forum_section` SET `total` = '{$total}', `reg` = NOW() WHERE `name` = '{$_GET['section']}' "; mysql_query($sql) or die("не обновляется раздел"); $sql = "INSERT INTO `forum_topic` (`name`, `section`, `login`, `total`, `data`) VALUES ('{$topic}', '{$_GET['section']}', '{$_SESSION['forum_login']}', '0', NOW())"; mysql_query($sql) or die("не вставляется в топик"); $sql = "INSERT INTO `forum_reply` (`section`, `topic`, `text`, `login`, `data`) VALUES ('{$_GET['section']}', '{$topic}', '{$text}', '{$_SESSION['forum_login']}', NOW())"; mysql_query($sql) or die("не добавляется в коменты"); }else{ echo "Вы не заполнили одно из полей!!!"; } }
if($_POST['addreply']){ [b]$text = trim(replacer($_POST['text_topic'])) ; if($text != ""){[/b] $sqlup = "SELECT `total` FROM `forum_topic` WHERE `name` = '{$_GET['reply']}' "; $resup = mysql_query($sqlup) or die("неправильный запрос в топик"); $tot = mysql_fetch_assoc($resup); $sql = "UPDATE `forum_section` SET `reg` = NOW() WHERE `name` = '{$_POST['section']}' "; mysql_query($sql) or die("не обновляется раздел"); $total = $tot['total'] + 1; $sql = "UPDATE `forum_topic` SET `total` = '{$total}', `data` = NOW() WHERE `name` = '{$_GET['reply']}' "; mysql_query($sql) or die("не обнвляется топик"); $sql = "INSERT INTO `forum_reply` (`section`, `topic`, `text`, `login`, `data`) VALUES ('{$_POST['section']}', '{$_GET['reply']}', '{$text}', '{$_SESSION['forum_login']}', NOW())"; mysql_query($sql) or die("не вставляется ответ"); }else{ echo "Вы ничего не написали!!!"; } } ?> <section id="content"> <nav id="nav_bar"> <table> <?php if(!$_GET){ echo "<tr><th><a href='index.php'>Главная >></a></th></tr> </table></nav> <table> <tr><th id='text'>Раздел</th><th>Кол-во тем</th><th>Последняя запись</th></tr>"; $sql = "SELECT * FROM `forum_section`"; $res = mysql_query($sql); while($row = mysql_fetch_assoc($res)){ echo "<tr><td><a href='?section={$row['name']}&page=1'>{$row['name']}</a></td><td>{$row['total']}</td><td id='data'>{$row['reg']}</td></tr>"; } } if($_GET['section']){ echo "<tr><th><a href='index.php'>Главная >></a></th><th>{$_GET['section']}</th></tr> </table></nav> <table><tr><th id='text'>Тема</th><th>Автор</th><th>Ответы</th><th>Последняя запись</th></tr>"; $sql = "SELECT * FROM `forum_topic` WHERE `section` = '{$_GET['section']}' ORDER BY `data` DESC"; $res = mysql_query($sql); $num = mysql_num_rows($res); $arr = array(); if($num > 0){ while($row = mysql_fetch_assoc($res)){ $echo = "<tr><td><a href='?reply={$row['name']}&page=1'>{$row['name']}</a></td><td>{$row['login']}</td><td>{$row['total']}</td><td id='data'>{$row['data']}</td></tr>"; array_push($arr, $echo); } for($i = 30 * ($_GET['page'] - 1); $i < (30 * $_GET['page']); $i++){ echo $arr[$i]; } $page = ceil($num / 30) + 1; echo "<tr><td colspan = '3'>Страницы: "; for($a = 1; $a < $page; $a++ ){ echo "<a href='?section={$_GET['section']}&page={$a}'>{$a} </a>"; } echo "</td></tr>"; }else{ echo "В данном разделе еще не создано тем<br/><a href='?page=newtopic§={$_GET['section']}'>Создать тему</a>"; } } if($_GET['reply']){ $sql = "SELECT * FROM `forum_reply` WHERE `topic` = '{$_GET['reply']}' ORDER BY `data` ASC"; $res = mysql_query($sql); $num = mysql_num_rows($res); $arr = array(); $section; while($row = mysql_fetch_assoc($res)){ $echo = "<tr><td id='autor'>{$row['login']}</td><td>{$row['text']}<hr/><span id='data'>{$row['data']}</span></td></tr>"; $section = $row['section']; array_push($arr, $echo); } echo "<tr><th><a href='index.php'>Главная </a>>></th><th><a href='?section={$section}&page=1'>{$section}</a> >></th><th>{$_GET['reply']}</th></tr> </table></nav> <table><tr><th id='autor'>Автор</th><th id='text'>Ответ</th></tr>"; for($i = 30 * ($_GET['page'] - 1); $i < (30 * $_GET['page']); $i++){ echo $arr[$i]; } $page = ceil($num / 30) + 1; echo "<tr><td colspan = '2'>Страницы: "; for($a = 1; $a < $page; $a++ ){ echo "<a href='?reply={$_GET['reply']}&page={$a}'>{$a} </a>"; } echo "</td></tr></table><br/><br/>"; if($_SESSION['forum_login'] != ""){ echo "<form action='?reply={$_GET['reply']}&page={$_GET['page']}' method='POST'>"; echo '<table> <tr><th id="autor">Сообщение:</th> <th id="text"><textarea cols="120" rows="10" name="text_topic"></textarea></th></tr> <tr><th><input type="submit" name="addreply" value="Добавить отзыв"/></th></tr> </table>'; echo "<input type='hidden' name='section' value='{$section}' /></form>"; }else{ echo "Вы не можете оставлять коментарии, пожалуйста войдите или <a href = ''>зарегистрируйтесь!</a>"; } } if($_GET['page'] == "newtopic"){ if($_SESSION['forum_login'] != ""){ echo "<form action='?section={$_GET['sect']}&page=1' method='POST'>"; echo '<table> <tr><td>Название темы:</td></tr> <tr><td><input type="text" name="name_topic"/></td></tr> <tr><td>Сообщение:</td></tr> <tr><td><textarea cols="60" rows="20" name="text_topic"></textarea></td></tr> <tr><td><input type="submit" name="addtopic" value="Добавить тему"/></td></tr> </table> </form>'; }else{ echo "Вы не можете создавать темы, пожалуйста войдите или <a href = ''>зарегистрируйтесь!</a>"; } } ?> </table>
</section> </body> </html>
добавил файл text_replace.php
Сообщение отредактировал Andrew01 - Суббота, 28 Февраля 2015, 15:57 |
|
| |
dima9595 | Дата: Пятница, 27 Февраля 2015, 19:24 | Сообщение # 2 |
почти ветеран
Сейчас нет на сайте
| MVC в помощь!
Сообщение отредактировал dima9595 - Пятница, 27 Февраля 2015, 19:25 |
|
| |
staconik | Дата: Пятница, 27 Февраля 2015, 20:15 | Сообщение # 3 |
участник
Сейчас нет на сайте
| HTML и PHP в одном файле не есть хорошо. Как сказал dima9595, изучи хотя бы основы MVC и тогда сможешь написать нормальный форум. Если будут какие-нибудь вопросы, можешь написать мне в ЛС.
|
|
| |
Andrew01 | Дата: Пятница, 27 Февраля 2015, 20:28 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| Ясно, спасибо за советы, буду дальше учить))))))) или лучше подключить уже готовый форум? исходник есть но разбираться там не очень хочется....
Сообщение отредактировал Andrew01 - Пятница, 27 Февраля 2015, 20:34 |
|
| |
Xakep | Дата: Пятница, 27 Февраля 2015, 23:14 | Сообщение # 5 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата staconik ( ) HTML и PHP в одном файле не есть хорошо. почему? для шаблонов по мне так лучший вариант вместо своих непонятных костылей, для реализации по сути того же самого?
|
|
| |
uberchel | Дата: Суббота, 28 Февраля 2015, 05:29 | Сообщение # 6 |
частый гость
Сейчас нет на сайте
| Для простенького форума и так сойдет, чем писать MVC или юзать готовые и таскать несколько мигабайт не использованного кода, имхо ТС, прошу обратить ваше внимание на то, что у вас все запросы не фильтруются, а сразу попадают в БД, Любой школьник навернет ваш форум.
// скоро тут что нибудь появится )
|
|
| |
staconik | Дата: Суббота, 28 Февраля 2015, 09:16 | Сообщение # 7 |
участник
Сейчас нет на сайте
| Цитата Xakep ( ) почему? для шаблонов по мне так лучший вариант вместо своих непонятных костылей, для реализации по сути того же самого? Если страница достаточно больших размеров, то разобраться потом в этом говнокоде будет очень сложно. Лучше в начале немного пострадать, за то потом не будет проблем с поддержкой этого кода.
|
|
| |
Xakep | Дата: Суббота, 28 Февраля 2015, 11:38 | Сообщение # 8 |
めちゃくちゃちゃ
Сейчас нет на сайте
| Цитата staconik ( ) Если страница достаточно больших размеров, то разобраться потом в этом говнокоде будет очень сложно. Лучше в начале немного пострадать, за то потом не будет проблем с поддержкой этого кода. а что мешает тебе часть реализацию вытащить в отдельные файлы, а шаблоны делать отдельными?? Просто напросто не нужно быть говнокодером, чтобы не было говно кода. В WordPress именно так шаблоны и реализованы, там нет своих шаблонизаторов, и это хорошо!
|
|
| |
Andrew01 | Дата: Суббота, 28 Февраля 2015, 16:00 | Сообщение # 9 |
почетный гость
Сейчас нет на сайте
| Цитата uberchel ( ) прошу обратить ваше внимание на то, что у вас все запросы не фильтруются, а сразу попадают в БД
вы это имели ввиду? добавил проверку на замену символов в отдельном файле Код <?php function replacer ($text) { // ФУНКЦИЯ очистки кода $text=str_replace(" ",' ',$text); $text=str_replace(">",'>',$text); $text=str_replace("<",'<',$text); $text=str_replace("\"",'"',$text); $text=str_replace("\'",''',$text); $text=preg_replace("/\n\n/",'<p>',$text); $text=preg_replace("/\n/",'<br>',$text); $text=preg_replace("/\\\$/",'$',$text); $text=preg_replace("/\r/",'',$text); $text=preg_replace("/\\\/",'\',$text); if (get_magic_quotes_gpc()) { // если magic_quotes включена - чистим СЛЭШи: одиночные (') и двойные кавычки ("), обратный слеш (\) $text=str_replace("\"",'"',$text); $text=str_replace("\'",'\'',$text); $text=str_replace("\\",'\',$text);} $text=str_replace("\r\n","<br> ",$text); $text=str_replace("\n\n",'<p>',$text); $text=str_replace("\n",'<br> ',$text); $text=str_replace("\t",'',$text); $text=str_replace("\r",'',$text); $text=str_replace(' ',' ',$text); do {$text=str_replace("<br><br><br>","<br>",$text);} while (preg_match("/<br><br><br><br>/i",$text)); do {$text=str_replace(" "," ",$text);} while (preg_match("/ /i",$text)); $text=str_replace("\t",' ',$text); $text=str_replace("\r",' ',$text); $text=str_replace(' ',' ',$text); $text=rtrim($text); return $text; } ?> правда не сам придумал нашел в интернете
Сообщение отредактировал Andrew01 - Суббота, 28 Февраля 2015, 16:05 |
|
| |
uberchel | Дата: Суббота, 28 Февраля 2015, 21:48 | Сообщение # 10 |
частый гость
Сейчас нет на сайте
| Нэ, у вас страх какой то просто ) вот так лучше будет:
Код function filter($query, $html = false, $decode = false, $admin = false) { if (empty(query)) { header('location:/'); exit; } if (empty($decode)) { $query = preg_replace ('/x27|x22|x25|x60|x3C|x3E|' .(empty($admin) ? '<\/?[scr|obj|emb|a\shr|img|ifra].+>' : ''). '/isU', '', $query); $query = empty($html) ? preg_replace('/[^a-z0-9-_]{1,50}/is', '', $query) : htmlspecialchars($query, ENT_QUOTES); } else { $query = nl2br(html_entity_decode($query)); } return trim($query); }
$query - запрос $html - приобразовывать html в сущности / удалять html код, кроме перевода строки (true/false) $decode - преобразовывать сушьности в html код, если $admin = false, то теги a,img, embed,script,object,iframe, будут удалены. $admin - если true, про при входе теги a,img, embed,script,object,iframe остаются.
// скоро тут что нибудь появится )
Сообщение отредактировал uberchel - Суббота, 28 Февраля 2015, 21:52 |
|
| |
dima9595 | Дата: Воскресенье, 01 Марта 2015, 12:05 | Сообщение # 11 |
почти ветеран
Сейчас нет на сайте
| Цитата uberchel ( ) if (empty(query)) возможно показалось, но не должно ли быть вот так: Цитата uberchel ( ) if (empty($query))
|
|
| |
Andrew01 | Дата: Воскресенье, 01 Марта 2015, 23:09 | Сообщение # 12 |
почетный гость
Сейчас нет на сайте
| uberchel, видимо я еще только в начале пути изучения PHP не очень понял назначение функции и как её ипользовать ....
|
|
| |
uberchel | Дата: Понедельник, 02 Марта 2015, 01:23 | Сообщение # 13 |
частый гость
Сейчас нет на сайте
| dima9595, Да, обсолютно прав, писал на скорую руку )
// скоро тут что нибудь появится )
Сообщение отредактировал uberchel - Понедельник, 02 Марта 2015, 01:24 |
|
| |
|