| 
	
		
		
			| Мини форум на 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 |  |  |  |  |  
 |