Guest User

Untitled

a guest
Dec 19th, 2017
425
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 261.07 KB | None | 0 0
  1. <?php
  2.  
  3. setlocale(LC_CTYPE, "ru_RU.CP1251");
  4.  
  5. // "Прошить" формы сессией
  6. require 'config/connect.php';
  7. require 'config/config.php';
  8. require 'functions/functions.php';
  9. require 'geshi/geshi.php';
  10.  
  11. @mysql_connect ( DB_LOCATION, DB_USER, DB_PASSWORD ) or die( 'Сервер базы данных недоступен' );
  12. @mysql_query( 'SET NAMES cp1251' );
  13. @mysql_select_db ( DB_NAME ) or die( 'В настоящий момент база данных не доступна' );
  14.  
  15. session_start();
  16.  
  17. // Содержимое html-тега title
  18. $pageTitle = FORUM_TITLE;
  19.  
  20. // Если пользователь не авторизован, но выставлена
  21. // cookie-переменная autologin - входим на форум
  22. if ( !isset( $_SESSION['user'] ) and isset( $_COOKIE['autologin'] ) ) autoLogin();
  23.  
  24. // Эта функция выполняется при каждом просмотре страницы зарегистрированным
  25. // пользователем и устанавливает время последнего посещения форума
  26. if ( isset( $_SESSION['user'] ) ) setTimeVisit();
  27.  
  28. // Кто из зарегистрированных пользователей сейчас на сайте?
  29. getUsersOnLine();
  30.  
  31. // Этот небольшой код для проверки того, существует ли форум,
  32. // ID кторого передается методом GET
  33. if ( isset( $_GET['idForum'] ) ) {
  34. $_GET['idForum'] = (int)$_GET['idForum'];
  35. if ( $_GET['idForum'] < 1 ) {
  36. header( 'Location: '.$_SERVER['PHP_SELF'] );
  37. die();
  38. }
  39. // Проверяем, есть ли форум с таким ID
  40. $query = "SELECT name FROM ".TABLE_FORUMS." WHERE id_forum=".$_GET['idForum'];
  41. $res = mysql_query( $query );
  42. if ( !$res ) {
  43. $msg = 'Ошибка при формировании страницы';
  44. $err = 'Ошибка при выполнении запроса: <br/>'.
  45. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  46. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  47. return showErrorMessage( $msg, $err, true, '' );
  48. }
  49. // Такого форума не существует - редирект на главную страницу
  50. if ( mysql_num_rows( $res ) == 0 ) {
  51. header( 'Location: '.$_SERVER['PHP_SELF'] );
  52. die();
  53. }
  54. }
  55.  
  56. if ( !isset( $_GET['action'] ) ) $_GET['action'] = 'showMainPage';
  57. $actions = array( 'showMainPage',
  58. 'showForum',
  59. 'showTheme',
  60. 'addForumForm',
  61. 'addForum',
  62. 'editForumForm',
  63. 'updateForum',
  64. 'forumUp',
  65. 'forumDown',
  66. 'deleteForum',
  67. 'addThemeForm',
  68. 'addTheme',
  69. 'editThemeForm',
  70. 'updateTheme',
  71. 'deleteTheme',
  72. 'lockTheme',
  73. 'unlockTheme',
  74. 'addPostForm',
  75. 'addPost',
  76. 'quickReply',
  77. 'editPostForm',
  78. 'updatePost',
  79. 'deletePost',
  80. 'loginForm',
  81. 'login',
  82. 'logout',
  83. 'addNewUserForm',
  84. 'addNewUser',
  85. 'activateUser',
  86. 'newPasswordForm',
  87. 'sendNewPassword',
  88. 'activatePassword',
  89. 'editUserForm',
  90. 'updateUser',
  91. 'editUserFormByAdmin',
  92. 'updateUserByAdmin',
  93. 'showUsersList',
  94. 'showUserInfo',
  95. 'sendMsgForm',
  96. 'sendMessage',
  97. 'deleteMsg',
  98. 'showMsgBox',
  99. 'showInBox',
  100. 'showOutBox',
  101. 'showMsg',
  102. 'sendMailForm',
  103. 'sendMail',
  104. 'searchForm',
  105. 'searchResult' );
  106. if ( !in_array( $_GET['action'], $actions ) ) $_GET['action'] = 'showMainPage';
  107.  
  108. switch ( $_GET['action'] )
  109. {
  110. case 'showMainPage': // главная страница форума
  111. $content = getMainPage( $pageTitle );
  112. break;
  113. case 'showForum': // список тем форума
  114. $content = getForum( $pageTitle );
  115. break;
  116. case 'showTheme': // список сообщений темы
  117. $content = getTheme( $pageTitle );
  118. break;
  119. case 'addForumForm': // форма для добавления нового форума
  120. $content = getAddForumForm();
  121. break;
  122. case 'addForum': // добавить новый форум
  123. $content = addForum();
  124. break;
  125. case 'editForumForm': // форма для редактирования форума
  126. $content = getEditForumForm();
  127. break;
  128. case 'updateForum': // обновить запись в таблице БД TABLE_FORUMS
  129. $content = updateForum();
  130. break;
  131. case 'forumUp':
  132. $content = forumUp();
  133. break;
  134. case 'forumDown':
  135. $content = forumDown();
  136. break;
  137. case 'deleteForum': // удалить запись в таблице БД TABLE_FORUMS
  138. $content = deleteForum();
  139. break;
  140. case 'addThemeForm': // форма для добавления новой темы
  141. $content = getAddThemeForm();
  142. break;
  143. case 'addTheme': // добавить новую тему
  144. $content = addTheme();
  145. break;
  146. case 'editThemeForm': // форма для редактирования темы
  147. $content = getEditThemeForm();
  148. break;
  149. case 'updateTheme': // обновить запись в таблице БД TABLE_THEMES
  150. $content = updateTheme();
  151. break;
  152. case 'deleteTheme': // удалить тему
  153. $content = deleteTheme();
  154. break;
  155. case 'lockTheme': // закрыть тему
  156. $content = lockTheme();
  157. break;
  158. case 'unlockTheme': // открыть тему
  159. $content = unlockTheme();
  160. break;
  161. case 'addPostForm': // форма для добавления нового сообщения (поста)
  162. $content = getAddPostForm();
  163. break;
  164. case 'addPost': // добавить новую запись в таблицу БД TABLE_POSTS
  165. $content = addPost();
  166. break;
  167. case 'quickReply': // добавить новую запись в таблицу БД TABLE_POSTS
  168. $content = quickReply();
  169. break;
  170. case 'editPostForm': // форма для редактирования сообщения (поста)
  171. $content = getEditPostForm();
  172. break;
  173. case 'updatePost': // обновить запись в таблице БД TABLE_POSTS
  174. $content = updatePost();
  175. break;
  176. case 'deletePost': // удалить запись в таблице БД TABLE_POSTS
  177. $content = deletePost();
  178. break;
  179. case 'loginForm': // форма для входа на форум (авторизация)
  180. $content = getLoginForm();
  181. break;
  182. case 'login': // вход на форум (авторизация)
  183. $content = login();
  184. break;
  185. case 'logout': // выход
  186. $content = logout();
  187. break;
  188. case 'addNewUserForm': // форма для регистрации нового пользователя
  189. $content = getAddNewUserForm();
  190. break;
  191. case 'addNewUser': // добавить нового пользователя
  192. $content = addNewUser();
  193. break;
  194. case 'activateUser': // активация учетной записи нового пользователя
  195. $content = activateUser();
  196. break;
  197. case 'newPasswordForm': // форма для получения нового пароля
  198. $content = newPasswordForm();
  199. break;
  200. case 'sendNewPassword': // выслать пользователю новый пароль
  201. $content = sendNewPassword();
  202. break;
  203. case 'activatePassword': // активация нового пароля
  204. $content = activatePassword();
  205. break;
  206. case 'editUserForm': // форма для редактирования профиля
  207. $content = getEditUserForm();
  208. break;
  209. case 'updateUser': // обновить данные о пользователе
  210. $content = updateUser();
  211. break;
  212. case 'editUserFormByAdmin': // форма редактирования профиля (для администратора)
  213. $content = getEditUserFormByAdmin();
  214. break;
  215. case 'updateUserByAdmin': // обновить данные о пользователе (для администратора)
  216. $content = updateUserByAdmin();
  217. break;
  218. case 'showUsersList': // список пользователей форума
  219. $content = getUsersList();
  220. break;
  221. case 'showUserInfo': // информация о пользователе (profile)
  222. $content = showUserInfo();
  223. break;
  224. case 'sendMsgForm': // форма для отправки личного сообщения
  225. $content = getSendMsgForm();
  226. break;
  227. case 'sendMessage': // отправить личное сообщение
  228. $content = sendMessage();
  229. break;
  230. case 'deleteMsg': // удалить личное сообщение
  231. $content = deleteMessage();
  232. break;
  233. case 'showMsg': // показать сообщение
  234. $content = getMessage();
  235. break;
  236. case 'showInBox': // папка "Входящие"
  237. $content = getInMsgBox();
  238. break;
  239. case 'showOutBox': // папка "Исходящие"
  240. $content = getOutMsgBox();
  241. break;
  242. case 'sendMailForm': // форма для отправки письма пользователю
  243. $content = getSendMailForm();
  244. break;
  245. case 'sendMail': // отправка письма
  246. $content = sendMail();
  247. break;
  248. case 'searchForm': // форма для поиска по форуму
  249. $content = searchForm();
  250. break;
  251. case 'searchResult': // результаты поиска по форуму
  252. $content = searchResult();
  253. break;
  254. default:
  255. $content = getMainPage();
  256. }
  257.  
  258. $menu = getMainMenu();
  259. $html = file_get_contents( './templates/default.html' );
  260. $html = str_replace( '{title}', $pageTitle, $html );
  261. $html = str_replace( '{description}', FORUM_DESCRIPTION, $html );
  262. $html = str_replace( '{menu}', $menu, $html );
  263. $html = str_replace( '{content}', $content, $html );
  264.  
  265. echo $html;
  266.  
  267. // Функция возвращает html главного меню форума
  268. function getMainMenu()
  269. {
  270. $html = '';
  271. // if ( isset( $_SESSION['user'] ) ) $html = $html.'<p>Вы вошли как: '.$_SESSION['user']['name'].'</p>'."\n";
  272.  
  273. $html = $html.'<div class="mainmenu">'."\n";
  274. $html = $html.'<table>'."\n";
  275. $html = $html.'<tr>'."\n";
  276. $html = $html.'<td><img src="./images/icon_mini_forums.gif" width="12" height="13"
  277. border="0" alt="Список форумов" align="bottom" />&nbsp;<a class="mainmenu" href="'.
  278. $_SERVER['PHP_SELF'].'">Список форумов</a>&nbsp;&nbsp;</td>'."\n";
  279. // Если пользователь не авторизован - выводим ссылки "Вход" и "Регистрация"
  280. if ( !isset( $_SESSION['user'] ) ) {
  281. $html = $html.'<td><img src="./images/icon_mini_login.gif" width="12" height="13"
  282. border="0" alt="Вход" align="bottom" />&nbsp;<a class="mainmenu"
  283. href="'.$_SERVER['PHP_SELF'].'?action=loginForm">Вход</a>&nbsp;&nbsp;</td>'."\n";
  284. $html = $html.'<td><img src="./images/icon_mini_register.gif" width="12" height="13"
  285. border="0" alt="Регистрация" align="bottom" />&nbsp;<a class="mainmenu"
  286. href="'.$_SERVER['PHP_SELF'].'?action=addNewUserForm">Регистрация</a>&nbsp;&nbsp;</td>'."\n";
  287. } else {
  288. $html = $html.'<td><img src="./images/icon_mini_login.gif" width="12" height="13"
  289. alt="Вход" align="bottom" />&nbsp;<a class="mainmenu"
  290. href="'.$_SERVER['PHP_SELF'].'?action=logout">Выход</a>&nbsp;&nbsp;</td>'."\n";
  291. $html = $html.'<td><img src="./images/icon_mini_profile.gif" width="12" height="13"
  292. alt="Профиль" align="bottom" />&nbsp;<a class="mainmenu"
  293. href="'.$_SERVER['PHP_SELF'].'?action=editUserForm">Профиль</a>&nbsp;&nbsp;</td>'."\n";
  294. }
  295. $html = $html.'<td><img src="./images/icon_mini_members.gif" width="12" height="13"
  296. alt="Пользователи" align="bottom" />&nbsp;<a class="mainmenu"
  297. href="'.$_SERVER['PHP_SELF'].'?action=showUsersList">Пользователи</a>&nbsp;&nbsp;</td>'."\n";
  298. $html = $html.'<td><img src="./images/icon_mini_search.gif" width="12" height="13"
  299. alt="Поиск" align="bottom" />&nbsp;<a class="mainmenu"
  300. href="'.$_SERVER['PHP_SELF'].'?action=searchForm">Поиск</a>&nbsp;&nbsp;</td>'."\n";
  301.  
  302. if ( isset( $_SESSION['user'] ) ) {
  303. // Есть ли непрочитанные сообщения в папке "Входящие"?
  304. $cntNewMsg = countNewMessages();
  305. if ( $cntNewMsg == 0 )
  306. $html = $html.'<td><img src="./images/icon_mini_message.gif" width="12" height="13"
  307. alt="Личные сообщения" align="bottom" />&nbsp;<a class="mainmenu"
  308. href="'.$_SERVER['PHP_SELF'].'?action=showInBox">Личные&nbsp;сообщения</a>&nbsp;&nbsp;</td>'."\n";
  309. else if ( $cntNewMsg == 1 )
  310. $html = $html.'<td><img src="./images/icon_mini_message.gif" width="12" height="13"
  311. alt="Новое сообщение" align="bottom" />&nbsp;<a class="newMessages"
  312. href="'.$_SERVER['PHP_SELF'].'?action=showInBox">Новое&nbsp;сообщение</a>&nbsp;&nbsp;</td>'."\n";
  313. else
  314. $html = $html.'<td><img src="./images/icon_mini_message.gif" width="12" height="13"
  315. alt="Новые сообщения" align="bottom" />&nbsp;<a class="newMessages"
  316. href="'.$_SERVER['PHP_SELF'].'?action=showInBox">Новые&nbsp;сообщения</a>&nbsp;&nbsp;</td>'."\n";
  317. }
  318. if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] == 'admin' ) {
  319. $html = $html.'<td><img src="./images/icon_mini_addforum.gif" width="12" height="13"
  320. border="0" alt="Добавить форум" align="bottom" />&nbsp;<a class="mainmenu"
  321. href="'.$_SERVER['PHP_SELF'].'?action=addForumForm">Добавить форум</a></td>'."\n";
  322. }
  323. $html = $html.'</tr>'."\n";
  324. $html = $html.'</table>'."\n";
  325. $html = $html.'</div>'."\n";
  326. return $html;
  327. }
  328.  
  329. // Функция возвращает html главной страница форума (список форумов)
  330. function getMainPage( &$pageTitle )
  331. {
  332. $pageTitle = $pageTitle.' / Список форумов';
  333. $query = "SELECT id_forum, name, description FROM ".TABLE_FORUMS." WHERE 1 ORDER BY pos";
  334. $res = mysql_query( $query );
  335. if ( !$res ) {
  336. $msg = 'Ошибка при получении списка форумов';
  337. $err = 'Ошибка при выполнении запроса: <br/>'.
  338. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  339. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  340. return showErrorMessage( $msg, $err, true, '' );
  341. }
  342. $html = '<h1>Список форумов</h1>'."\n";
  343. if ( mysql_num_rows( $res ) > 0 ) {
  344. while ( $forum = mysql_fetch_array( $res ) ) {
  345.  
  346. $html = $html.'<table width="100%" cellpadding="0" cellspacing="0">'."\n";
  347. $html = $html.'<tr>'."\n";
  348. // Выводим название форума
  349. $html = $html.'<td>';
  350. $html = $html.'<div><a class="header" href="'.
  351. $_SERVER['PHP_SELF'].'?action=showForum&idForum='.
  352. $forum['id_forum'].'">'.
  353. $forum['name'].'</a></div>'."\n";
  354. $html = $html.'<div style="font-size:smaller">'.$forum['description'].'</a></div>';
  355. // Выводим краткое описание форума
  356. $html = $html.'</td>'."\n";
  357. // Ссылка "Править форум"
  358. if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] == 'admin' ) {
  359. $html = $html.'<td align="right"><a href="'.$_SERVER['PHP_SELF'].
  360. '?action=forumUp&idForum='.$forum['id_forum'].'"><img
  361. src="./images/icon_up.gif"
  362. alt="Вверх" title="Вверх" /></a>&nbsp;'."\n";
  363. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].
  364. '?action=forumDown&idForum='.$forum['id_forum'].'"><img
  365. src="./images/icon_down.gif"
  366. alt="Вниз" title="Вниз" /></a>&nbsp;'."\n";
  367. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].
  368. '?action=editForumForm&idForum='.$forum['id_forum'].'"><img
  369. src="./images/icon_edit.gif"
  370. alt="Править" title="Править" /></a>&nbsp;'."\n";
  371. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].
  372. '?action=deleteForum&idForum='.$forum['id_forum'].'"><img
  373. src="./images/icon_delete.gif" alt="Удалить" title="Удалить" /></a></td>'."\n";
  374. }
  375. $html = $html.'</tr>'."\n";
  376. $html = $html.'</table>'."\n";
  377. /*
  378. // Выводим три темы форума, сортирируя их по последнему сообщению
  379. $q = "SELECT a.id_theme, a.name, a.time, a.locked,
  380. IFNULL(b.id_author, 0),
  381. IFNULL(b.name, '".NOT_REGISTERED_USER."'),
  382. (COUNT(*)-1),
  383. IFNULL(MAX(c.time), '0000-00-00 00:00:00') AS last_post,
  384. MAX(c.id_post)
  385. FROM ".TABLE_THEMES." a LEFT JOIN ".TABLE_USERS." b
  386. ON a.id_author=b.id_author
  387. LEFT JOIN ".TABLE_POSTS." c
  388. ON a.id_theme=c.id_theme
  389. WHERE id_forum=".$forum['id_forum']."
  390. GROUP BY a.id_theme, a.name, a.time, a.locked,
  391. IFNULL(b.id_author, 0),
  392. IFNULL(b.name, '".NOT_REGISTERED_USER."')
  393. ORDER BY last_post DESC
  394. LIMIT 2";
  395. */
  396. $q = "SELECT id_theme, name, id_author, author, time, id_last_author, last_author, last_post, locked
  397. FROM ".TABLE_THEMES."
  398. WHERE id_forum=".$forum['id_forum']."
  399. ORDER BY last_post DESC
  400. LIMIT 3";
  401.  
  402. $r = mysql_query( $q );
  403.  
  404. $html = $html.'<table class="showTable">'."\n";
  405. $html = $html.'<tr>'."\n";
  406. $html = $html.'<th width="23"><img src="./images/null.gif" width="23" height="1" alt="" /></th>'."\n";
  407. $html = $html.'<th width="50%">Тема</th>'."\n";
  408. $html = $html.'<th width="14%">Автор</th>'."\n";
  409. $html = $html.'<th width="14%">Добавлена</th>'."\n";
  410. // $html = $html.'<th width="6%">Ответов</th>'."\n";
  411. $html = $html.'<th width="20%">Последнее&nbsp;сообщение</th>'."\n";
  412. $html = $html.'</tr>'."\n";
  413.  
  414. if ( mysql_num_rows( $res ) == 0 ) {
  415. $html = $html.'<tr>'."\n";
  416. $html = $html.'<td colspan="6">'."\n";
  417. $html = $html.'В этом форуме пока нет сообщений';
  418. $html = $html.'</td>'."\n";
  419. $html = $html.'</tr>'."\n";
  420. $html = $html.'</table>'."\n";
  421. continue;
  422. }
  423.  
  424. while ( $theme = mysql_fetch_array( $res ) ) {
  425. $html = $html.'<tr>'."\n";
  426. if ( isset( $_SESSION['user'] ) ) { // это для зарегистрированного пользователя
  427. // Если есть новые сообщения (посты) - только для зарегистрированных пользователей
  428. if ( isset( $_SESSION['newThemes'] ) and in_array( $theme[0], $_SESSION['newThemes'] ) ) {
  429. if ( $theme['locked'] == 0 ) // тема открыта
  430. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_new.gif" width="19"
  431. height="18" alt="Новые сообщения" title="Новые сообщения" /></td>';
  432. else // тема закрыта
  433. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock_new.gif" width="19"
  434. height="18" alt="Новые сообщения" title="Новые сообщения" /></td>';
  435. } else {
  436. if ( $theme['locked'] == 0 ) // тема открыта
  437. $html = $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19"
  438. height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>';
  439. else // тема закрыта
  440. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19"
  441. height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>';
  442. }
  443. } else { // это для не зарегистрированного пользователя
  444. if ( $theme['locked'] == 0 ) // тема открыта
  445. $html = $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19"
  446. height="18" alt="" /></td>';
  447. else // тема закрыта
  448. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19"
  449. height="18" alt="" /></td>';
  450. }
  451. // Название темы
  452. $html = $html.'<td>';
  453. $html = $html.'<a class="topictitle" href="'.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
  454. $forum['id_forum'].'&id_theme='.$theme[0].'">'.$theme[1].'</a>';
  455. $html = $html.'</td>';
  456. $html = $html.'<td align="center" nowrap="nowrap">'."\n";
  457. // Автор темы
  458. if ( $theme['id_author'] )
  459. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
  460. $theme['id_author'].'">'.$theme['author'].'</a>';
  461. else
  462. $html = $html.$theme['author'];
  463. $html = $html.'</td>';
  464. // Дата добавления темы
  465. $html = $html.'<td align="center"><span class="details">';
  466. $html = $html.$theme['time'];
  467. $html = $html.'</span></td>'."\n";
  468. // Количество ответов
  469. // $html = $html.'<td align="center"><span class="details">';
  470. // $html = $html.$theme[6];
  471. // $html = $html.'</td></span>'."\n";
  472. // Дата последнего обновления
  473. $html = $html.'<td align="center"><span class="details">';
  474. $html = $html.$theme['last_post'];
  475. // Автор последнего сообщения (поста)
  476. if ( $theme['id_last_author'] )
  477. $html = $html.' <a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
  478. $theme['id_last_author'].'">'.$theme['last_author'].'</a>';
  479. else
  480. $html = $html.' '.$theme['last_author'];
  481. $html = $html.'</span></td>'."\n";
  482. $html = $html.'</tr>'."\n";
  483. }
  484. $html = $html.'</table>'."\n";
  485. }
  486. } else {
  487. $html = '<p>Не найдено ни одного форума</p>'."\n";
  488. }
  489.  
  490. $html = $html.getStat();
  491.  
  492. return $html;
  493. }
  494.  
  495. // Функция возвращает список тем форума; ID форума передается методом GET
  496. function getForum( &$pageTitle )
  497. {
  498. // Если не передан ID форума - функция вызвана по ошибке
  499. if ( !isset( $_GET['idForum'] ) ) {
  500. header( 'Location: '.$_SERVER['PHP_SELF'] );
  501. die();
  502. }
  503. // Получаем информацию о форуме
  504. $query = "SELECT name FROM ".TABLE_FORUMS." WHERE id_forum=".$_GET['idForum'];
  505. $res = mysql_query( $query );
  506. if ( !$res ) {
  507. $msg = 'Ошибка при получении списка тем форума';
  508. $err = 'Ошибка при выполнении запроса: <br/>'.
  509. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  510. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  511. return showErrorMessage( $msg, $err, true, '' );
  512. }
  513. $forum = mysql_result( $res, 0, 0 );
  514. // Заголовок страницы (содержимое тега title)
  515. $pageTitle = $pageTitle.' / '.$forum;
  516. // Выводим название форума
  517. $html = '<h1>'.$forum.'</h1>'."\n";
  518.  
  519. // Панель навигации
  520. $html = $html.'<div class="navDiv">'."\n";
  521. $html = $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'">Список форумов</a>&nbsp;&gt;'."\n";
  522. $html = $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
  523. $_GET['idForum'].'">'.$forum.'</a>'."\n";
  524. $html = $html.'</div>'."\n";
  525.  
  526. // Ссылка "Начать новую тему" - только для зарегистрированных пользователей
  527. if ( isset( $_SESSION['user'] ) ) {
  528. $addTheme = '<a href="'.$_SERVER['PHP_SELF'].'?action=addThemeForm&idForum='.
  529. $_GET['idForum'].'"><img src="./images/post.gif"
  530. alt="Начать новую тему" /></a>'."\n";
  531. }
  532. // Выбираем из БД количество тем форума - это нужно для
  533. // построения постраничной навигации
  534. $query = "SELECT COUNT(*) FROM ".TABLE_THEMES." WHERE id_forum=".$_GET['idForum'];
  535. $res = mysql_query( $query );
  536. if ( !$res ) {
  537. $msg = 'Ошибка при получении списка тем форума';
  538. $err = 'Ошибка при выполнении запроса: <br/>'.
  539. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  540. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  541. return showErrorMessage( $msg, $err, true, '' );
  542. }
  543. $total = mysql_result( $res, 0, 0 );
  544.  
  545. if ( $total == 0 ) {
  546. if ( isset( $_SESSION['user'] ) )
  547. return $html.$addTheme;
  548. else
  549. return $html.'<p>В этом форуме пока нет сообщений</p>'."\n";
  550. }
  551.  
  552. // Число страниц списка тем форума (постраничная навигация)
  553. $cntPages = ceil( $total / THEMES_PER_PAGE );
  554.  
  555. // Проверяем передан ли номер текущей страницы (постраничная навигация)
  556. if ( isset($_GET['page']) ) {
  557. $page = (int)$_GET['page'];
  558. if ( $page < 1 ) $page = 1;
  559. } else {
  560. $page = 1;
  561. }
  562.  
  563. if ( $page > $cntPages ) $page = $cntPages;
  564. // Начальная позиция (постраничная навигация)
  565. $start = ( $page - 1 ) * THEMES_PER_PAGE;
  566.  
  567. // Строим постраничную навигацию, если это необходимо
  568. if ( $cntPages > 1 ) {
  569. // Функция возвращает html меню для постраничной навигации
  570. $pages = pageIterator( $page, $cntPages, $_SERVER['PHP_SELF'].'?action=showForum&idForum='.
  571. $_GET['idForum'] );
  572. }
  573.  
  574. // Постраничную навигацию и ссылку "Начать новую тему" объединяем в один блок,
  575. // который выводится вверху и внизу страницы
  576. if ( isset( $pages ) or isset( $addTheme ) ) {
  577. $pagesAddTheme = '<table width="100%" cellpadding="0" cellspacing="0">'."\n";
  578. $pagesAddTheme = $pagesAddTheme.'<tr valign="middle">'."\n";
  579. if ( isset( $pages ) ) $pagesAddTheme = $pagesAddTheme.'<td>'.$pages.'</td>'."\n";
  580. if ( isset( $addTheme ) ) $pagesAddTheme = $pagesAddTheme.'<td align="right">'.$addTheme.'</td>'."\n";
  581. $pagesAddTheme = $pagesAddTheme.'</tr>'."\n";
  582. $pagesAddTheme = $pagesAddTheme.'</table>'."\n";
  583. }
  584.  
  585. // Постраничная навигация и ссылка "Начать новую тему"
  586. if ( isset( $pagesAddTheme ) ) $html = $html.$pagesAddTheme;
  587.  
  588. /*
  589. // Получаем список тем форума, сортирируя их по последнему сообщению
  590. $query = "SELECT a.id_theme, a.name, a.time, a.locked,
  591. IFNULL(b.id_author, 0), IFNULL(b.name, '".NOT_REGISTERED_USER."'),
  592. (COUNT(*)-1), IFNULL(MAX(c.time), '') AS last_post
  593. FROM ".TABLE_THEMES." a LEFT JOIN ".TABLE_USERS." b
  594. ON a.id_author=b.id_author
  595. LEFT JOIN ".TABLE_POSTS." c
  596. ON a.id_theme=c.id_theme
  597. WHERE id_forum=".$_GET['idForum']."
  598. GROUP BY a.id_theme, a.name, a.time,
  599. IFNULL(b.id_author, 0), IFNULL(b.name, '".NOT_REGISTERED_USER."')
  600. ORDER BY last_post DESC
  601. LIMIT ".$start.", ".THEMES_PER_PAGE;
  602. */
  603.  
  604. $query = "SELECT id_theme, name, id_author, author, time, id_last_author, last_author, last_post, locked
  605. FROM ".TABLE_THEMES."
  606. WHERE id_forum=".$_GET['idForum']."
  607. ORDER BY last_post DESC
  608. LIMIT ".$start.", ".THEMES_PER_PAGE;
  609. $res = mysql_query( $query );
  610. if ( !$res ) {
  611. $msg = 'Ошибка при получении списка тем форума';
  612. $err = 'Ошибка при выполнении запроса: <br/>'.
  613. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  614. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  615. return showErrorMessage( $msg, $err, true, '' );
  616. }
  617. if ( mysql_num_rows( $res ) > 0 ) {
  618. $html = $html.'<table class="showTable">'."\n";
  619. $html = $html.'<tr>'."\n";
  620. $html = $html.'<th>&nbsp;</th>';
  621. $html = $html.'<th width="50%">Темы</th>';
  622. $html = $html.'<th>Автор</th>';
  623. $html = $html.'<th>Добавлена</th>';
  624. // $html = $html.'<th>Ответов</th>';
  625. $html = $html.'<th>Последнее&nbsp;сообщение</th>'."\n";
  626. if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] != 'user' ) {
  627. $html = $html.'<th>Правка</th>'."\n";
  628. $html = $html.'<th>Блк.</th>'."\n";
  629. $html = $html.'<th>Удл.</th>'."\n";
  630. }
  631.  
  632. $html = $html.'</tr>'."\n";
  633. while ( $theme = mysql_fetch_array( $res ) ) {
  634. $html = $html.'<tr>'."\n";
  635. if ( isset( $_SESSION['user'] ) ) { // это для зарегистрированного пользователя
  636. // Если есть новые сообщения (посты) - только для зарегистрированных пользователей
  637. if ( isset( $_SESSION['newThemes'] ) and in_array( $theme['id_theme'], $_SESSION['newThemes'] ) ) {
  638. if ( $theme['locked'] == 0 ) // тема открыта
  639. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_new.gif" width="19"
  640. height="18" alt="Новые сообщения" title="Новые сообщения" /></td>';
  641. else // тема закрыта
  642. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock_new.gif" width="19"
  643. height="18" alt="Новые сообщения" title="Новые сообщения" /></td>';
  644. } else {
  645. if ( $theme['locked'] == 0 ) // тема открыта
  646. $html = $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19"
  647. height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>';
  648. else // тема закрыта
  649. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19"
  650. height="18" alt="Нет новых сообщений" title="Нет новых сообщений" /></td>';
  651. }
  652. } else { // это для не зарегистрированного пользователя
  653. if ( $theme['locked'] == 0 ) // тема открыта
  654. $html = $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19"
  655. height="18" alt="" /></td>';
  656. else // тема закрыта
  657. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_lock.gif" width="19"
  658. height="18" alt="" /></td>';
  659. }
  660.  
  661. // Название темы
  662. $html = $html.'<td>';
  663. $html = $html.'<a class="topictitle" href="'.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
  664. $_GET['idForum'].'&id_theme='.$theme['id_theme'].'">'.$theme['name'].'</a>';
  665. $html = $html.'</td>';
  666. $html = $html.'<td align="center">'."\n";
  667. // Автор темы
  668. if ( $theme['id_author'] ) {
  669. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
  670. $theme['id_author'].'">'.$theme['author'].'</a>';
  671. } else {
  672. $html = $html.$theme[5];
  673. }
  674. $html = $html.'</td>';
  675. // Дата добавления темы
  676. $html = $html.'<td align="center" nowrap="nowrap"><span class="details">';
  677. $html = $html.$theme['time'];
  678. $html = $html.'</span></td>'."\n";
  679. // Количество ответов
  680. // $html = $html.'<td align="center" nowrap="nowrap">';
  681. // $html = $html.$theme[6];
  682. // $html = $html.'</td>'."\n";
  683. // Дата последнего обновления
  684. $html = $html.'<td align="center"><span class="details">';
  685. $html = $html.$theme['last_post'];
  686. // Автор последнего сообщения (поста)
  687. if ( $theme['id_last_author'] )
  688. $html = $html.' <a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
  689. $theme['id_last_author'].'">'.$theme['last_author'].'</a>';
  690. else
  691. $html = $html.' '.$theme['last_author'];
  692. $html = $html.'</span></td>'."\n";
  693. // Ссылки "Редактировать", "Закрыть"/"Открыть" и "Удалить" -
  694. // только для администратора и модератора
  695. if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] != 'user' ) {
  696. $html = $html.'<td align="center" nowrap="nowrap">';
  697. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=editThemeForm&idForum='.
  698. $_GET['idForum'].'&id_theme='.$theme[0].'"><img src="./images/icon_edit.gif"
  699. alt="Править" title="Править" /></a>';
  700. $html = $html.'</td>'."\n";
  701. $html = $html.'<td align="center" nowrap="nowrap">';
  702. if ( $theme['locked'] == 0 ) { // заблокировать тему
  703. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=lockTheme&idForum='.
  704. $_GET['idForum'].'&id_theme='.$theme['id_theme'].'"><img src="./images/topic_lock.gif"
  705. alt="Закрыть" title="Закрыть" /></a>';
  706. } else { // разблокировать тему
  707. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=unlockTheme&idForum='.
  708. $_GET['idForum'].'&id_theme='.$theme['id_theme'].'"><img src="./images/topic_unlock.gif"
  709. alt="Открыть" title="Открыть" /></a>';
  710. }
  711. $html = $html.'</td>'."\n";
  712. $html = $html.'<td align="center" nowrap="nowrap">';
  713. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=deleteTheme&idForum='.
  714. $_GET['idForum'].'&id_theme='.$theme['id_theme'].'"><img src="./images/icon_delete.gif"
  715. alt="Удалить" title="Удалить" /></a>';
  716. $html = $html.'</td>'."\n";
  717.  
  718. }
  719. $html = $html.'</tr>'."\n";
  720. }
  721. $html = $html.'</table>'."\n";
  722.  
  723. // Постраничная навигация и ссылка "Начать новую тему"
  724. if ( isset( $pagesAddTheme ) ) $html = $html.$pagesAddTheme;
  725.  
  726. }
  727. return $html;
  728. }
  729.  
  730. // Функция возвращает список сообщений(постов) темы; ID темы передается методом GET
  731. function getTheme( &$pageTitle )
  732. {
  733. // Если не передан ID форума - функция вызвана по ошибке
  734. if ( !isset( $_GET['idForum'] ) ) {
  735. header( 'Location: '.$_SERVER['PHP_SELF'] );
  736. die();
  737. }
  738. // Если не передан ID темы - функция вызвана по ошибке
  739. if ( !isset( $_GET['id_theme'] ) ) {
  740. header( 'Location: '.$_SERVER['PHP_SELF'] );
  741. die();
  742. }
  743. $id_theme = (int)$_GET['id_theme'];
  744. if ( $id_theme < 1 ) {
  745. header( 'Location: '.$_SERVER['PHP_SELF'] );
  746. die();
  747. }
  748.  
  749. // Получаем из БД информацию о теме
  750. $query = "SELECT name, locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  751. $res = mysql_query( $query );
  752. if ( !$res ) {
  753. $msg = 'Ошибка при получении списка сообщений темы';
  754. $err = 'Ошибка при выполнении запроса: <br/>'.
  755. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  756. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  757. return showErrorMessage( $msg, $err, true,
  758. 'action=showForum&idForum='.$_GET['idForum'] );
  759. }
  760. // Если запрошенной темы не существует - возвращаемся на форум
  761. if ( mysql_num_rows( $res ) == 0 )
  762. return showInfoMessage( 'Запрошенная тема не найдена', 'action=showForum&idForum='.$_GET['idForum'] );
  763.  
  764. list( $theme, $locked ) = mysql_fetch_row( $res );
  765. // Заголовок страницы (содержимое тега title)
  766. $pageTitle = $pageTitle.' / '.$theme;
  767. // Название темы
  768. $html = '<h1>'.$theme.'</h1>'."\n";
  769.  
  770. // Получаем информацию о форуме - это нужно для построения панели навигации
  771. $query = "SELECT name FROM ".TABLE_FORUMS." WHERE id_forum=".$_GET['idForum'];
  772. $res = mysql_query( $query );
  773. if ( !$res ) {
  774. $msg = 'Ошибка при получении списка сообщений темы';
  775. $err = 'Ошибка при выполнении запроса: <br/>'.
  776. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  777. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  778. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.
  779. $_GET['idForum'] );
  780. }
  781. // Панель навигации
  782. $html = $html.'<div class="navDiv">'."\n";
  783. $html = $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'">Список форумов</a>&nbsp;&gt;'."\n";
  784. $html = $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
  785. $_GET['idForum'].'">'.mysql_result( $res, 0, 0 ).'</a>&nbsp;&gt;'."\n";
  786. $html = $html.'<a class="navigation" href="'.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
  787. $_GET['idForum'].'&id_theme='.$id_theme.'">'.$theme.'</a>'."\n";
  788. $html = $html.'</div>'."\n";
  789.  
  790. // Выбираем из БД количество сообщений - это нужно для
  791. // построения постраничной навигации
  792. $query = "SELECT COUNT(*) FROM ".TABLE_POSTS." WHERE id_theme=".$id_theme;
  793. $res = mysql_query( $query );
  794. if ( !$res ) {
  795. $msg = 'Ошибка при получении списка сообщений темы';
  796. $err = 'Ошибка при выполнении запроса: <br/>'.
  797. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  798. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  799. return showErrorMessage( $msg, $err, true,
  800. 'action=showForum&idForum='.$_GET['idForum'] );
  801. }
  802. $total = mysql_result( $res, 0, 0 );
  803. // Не может быть темы, в которой нет сообщений (постов) - надо ее удалить
  804. if ( $total == 0 ) {
  805. $q = "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  806. $r = mysql_query( $q );
  807. if ( !$r ) {
  808. $msg = 'Ошибка при получении списка сообщений темы';
  809. $err = 'Ошибка при выполнении запроса: <br/>'.
  810. $q.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  811. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  812. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  813. }
  814. return showInfoMessage( 'Запрошенная тема не найдена', 'action=showForum&idForum='.$_GET['idForum'] );
  815. }
  816.  
  817. // Число страниц списка сообщений (постов) темы (постраничная навигация)
  818. $cntPages = ceil( $total / POSTS_PER_PAGE );
  819.  
  820. // Проверяем передан ли номер текущей страницы (постраничная навигация)
  821. if ( isset($_GET['page']) ) {
  822. $page = (int)$_GET['page'];
  823. if ( $page < 1 ) $page = 1;
  824. } else {
  825. $page = $cntPages;
  826. }
  827.  
  828. if ( $page > $cntPages ) $page = $cntPages;
  829. // Начальная позиция (постраничная навигация)
  830. $start = ( $page - 1 ) * POSTS_PER_PAGE;
  831.  
  832. // Строим постраничную навигацию, если это необходимо
  833. if ( $cntPages > 1 ) {
  834. // Функция возвращает html меню для постраничной навигации
  835. $pages = pageIterator( $page, $cntPages, $_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
  836. $_GET['idForum'].'&id_theme='.$id_theme );
  837. } else {
  838. $pages = '&nbsp;';
  839. }
  840.  
  841. // Получаем из БД список сообщений (постов) темы
  842. $query = "SELECT a.id_post, a.name, a.id_author, a.time, a.putfile, a.locked, a.id_theme,
  843. DATE_FORMAT(a.edittime, '%d.%m.%Y') AS edittime, a.id_editor,
  844. IFNULL(b.name, '".NOT_REGISTERED_USER."') AS author, b.posts, b.url,
  845. DATE_FORMAT(b.puttime, '%d.%m.%Y') AS regtime, b.status AS status,
  846. IFNULL(b.signature, '') AS signature, IFNULL(b.locked, 0) AS blocked,
  847. IFNULL(c.name, '') AS editor, IFNULL(c.status, '') AS editor_status
  848. FROM ".TABLE_POSTS." a LEFT JOIN ".TABLE_USERS." b
  849. ON a.id_author=b.id_author
  850. LEFT JOIN ".TABLE_USERS." c
  851. ON a.id_editor=c.id_author
  852. WHERE id_theme=".$id_theme." ORDER BY time ASC
  853. LIMIT ".$start.", ".POSTS_PER_PAGE;
  854.  
  855. $res = mysql_query( $query );
  856. if ( !$res ) {
  857. $msg = 'Ошибка при получении списка сообщений темы';
  858. $err = 'Ошибка при выполнении запроса: <br/>'.
  859. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  860. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  861. return showErrorMessage( $msg, $err, true,
  862. 'action=showForum&idForum='.$_GET['idForum'] );
  863. }
  864. if ( mysql_num_rows( $res ) == 0 ) {
  865. // Не может быть темы, в которой нет сообщений (постов) - надо ее удалить
  866. $q = "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  867. $r = mysql_query( $q );
  868. if ( !$r ) {
  869. $msg = 'Ошибка при получении списка сообщений темы';
  870. $err = 'Ошибка при выполнении запроса: <br/>'.
  871. $q.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  872. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  873. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  874. }
  875. return showInfoMessage( 'Запрошенная тема не найдена', 'action=showForum&idForum='.$_GET['idForum'] );
  876. }
  877. // Ссылка "Ответить" (если тема закрыта - выводим сообщение "Тема закрыта")
  878. if ( $locked == 0 )
  879. $addPost = '<a href="'.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.$_GET['idForum'].
  880. '&id_theme='.$id_theme.'"><img src="./images/reply.gif"
  881. alt="Ответить" title="Ответить" /></a>'."\n";
  882. else
  883. $addPost = '<img src="./images/reply_locked.gif"
  884. alt="Тема закрыта" title="Тема закрыта" />'."\n";
  885.  
  886. // Постраничную навигацию и ссылку "Ответить" объединяем в один блок,
  887. // который выводится вверху и внизу страницы
  888. $pagesAddPost = '<table width="100%" cellpadding="0" cellspacing="0">'."\n";
  889. $pagesAddPost = $pagesAddPost.'<tr valign="middle">'."\n";
  890. $pagesAddPost = $pagesAddPost.'<td>'.$pages.'</td>'."\n";
  891. $pagesAddPost = $pagesAddPost.'<td align="right">'.$addPost.'</td>'."\n";
  892. $pagesAddPost = $pagesAddPost.'</tr>'."\n";
  893. $pagesAddPost = $pagesAddPost.'</table>'."\n";
  894.  
  895. $html = $html.$pagesAddPost;
  896. // Сообщения (посты) темы; каждое сообщение - отдельная таблица
  897. while ( $post = mysql_fetch_array( $res ) ) {
  898. $html = $html.'<table class="postTable">'."\n";
  899. $html = $html.'<tr class="postTop">'."\n";
  900. $html = $html.'<td width="120"><span class="postAuthor" onClick="javascript:putName(\''.
  901. $post['author'].'\')" onMouseOver="this.className=\'postAuthorOver\'"
  902. onMouseOut="this.className=\'postAuthor\'">'.$post['author'].
  903. '</span><br/><img src="./images/null.gif" alt="" width="120" height="1" /></td>'."\n";
  904. $html = $html.'<td width="45%"><span class="details">&nbsp;Добавлено '.$post['time'].'</span></td>'."\n";
  905. $html = $html.'<td width="45%" align="right">';
  906. // Если тема не заблокирована - выводим ссылку "Ответить с цитатой"
  907. if ( $locked == 0 ) {
  908. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.$_GET['idForum'].
  909. '&id_theme='.$id_theme.'"><img src="./images/icon_quote.gif"
  910. alt="Ответить с цитатой" title="Ответить с цитатой" border="0" /></a>&nbsp;&nbsp;';
  911. }
  912. // Определяем, нужно ли выводить ссылку "Редактировать"
  913. if ( hasRightEditPost( $post ) ) {
  914. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=editPostForm&idForum='.$_GET['idForum'].
  915. '&id_theme='.$id_theme.'&id_post='.$post['id_post'].'"><img src="./images/icon_edit.gif"
  916. alt="Править" title="Править" border="0" /></a>&nbsp;&nbsp;';
  917. }
  918. // Определяем, нужно ли выводить ссылку "Удалить"
  919. if ( hasRightDeletePost( $post ) ) {
  920. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=deletePost&idForum='.$_GET['idForum'].
  921. '&id_theme='.$id_theme.'&id_post='.$post['id_post'].'"><img src="./images/icon_delete.gif"
  922. alt="Удалить" title="Удалить" border="0" /></a>';
  923. }
  924. $html = $html.'</td>'."\n";
  925. $html = $html.'</tr>'."\n";
  926. $html = $html.'<tr class="postMiddle">'."\n";
  927. $html = $html.'<td>'."\n";
  928. // Если автор сообщения (поста) - зарегистрированный пользователь
  929. if ( $post['id_author'] ) {
  930. // Аватар
  931. if ( is_file( './photo/'.$post['id_author'] ) ) {
  932. $html = $html.'<img src="./photo/'.$post['id_author'].'" alt="'.$post['author'].'"
  933. title="'.$post['author'].'" /><br/>'."\n";
  934. } else {
  935. $html = $html.'<img src="./images/null.gif" alt="" width="100" height="100"
  936. style="border:1px solid #CCCCCC" /><br/>'."\n";
  937. }
  938. // Статус пользователя
  939. $status = array( 'user' => 'Пользователь',
  940. 'moderator' => 'Модератор',
  941. 'admin' => 'Администратор' );
  942. if ( $post['status'] == 'admin' )
  943. $html = $html.'<span class="adminStatus">'.$status[$post['status']].'</span><br/>'."\n";
  944. if ( $post['status'] == 'moderator' )
  945. $html = $html.'<span class="moderStatus">'.$status[$post['status']].'</span><br/>'."\n";
  946. /*
  947. if ( $post['status'] == 'user' )
  948. $html = $html.'<span class="userStatus">'.$status[$post['status']].'</span><br/>'."\n";
  949. */
  950. // Рейтинг пользователя (по количеству сообщений)
  951. $stars = '';
  952. $rating = $post['posts'];
  953. while( $rating > 0 ) {
  954. if ( $rating < 50 )
  955. $img = 'stars0.gif';
  956. else if ( $rating >= 50 and $rating < 100 )
  957. $img = 'stars1.gif';
  958. else if ( $rating >= 100 and $rating < 150 )
  959. $img = 'stars2.gif';
  960. else if ( $rating >= 150 and $rating < 200 )
  961. $img = 'stars3.gif';
  962. else if ( $rating >= 200 and $rating < 250 )
  963. $img = 'stars4.gif';
  964. else if ( $rating >= 250 and $rating < 300 )
  965. $img = 'stars5.gif';
  966. else if ( $rating >= 300 and $rating < 350 )
  967. $img = 'stars6.gif';
  968. else if ( $rating >= 350 and $rating < 400 )
  969. $img = 'stars7.gif';
  970. else if ( $rating >= 400 and $rating < 450 )
  971. $img = 'stars8.gif';
  972. else if ( $rating >= 450 and $rating < 500 )
  973. $img = 'stars9.gif';
  974. else
  975. $img = 'stars10.gif';
  976. $rating = $rating - 500;
  977. $stars = $stars.'<img src="./images/'.$img.'" alt="" /><br/>';
  978. }
  979. $html = $html.$stars.'<br/>'."\n";
  980. // Количество сообщений
  981. $html = $html.'<span class="details">Сообщений:&nbsp;'.$post['posts'].'</span><br/>'."\n";
  982. // Дата регистрации
  983. $html = $html.'<span class="details">Зарегистрирован: '.$post['regtime'].'</span><br/>'."\n";
  984.  
  985. // Если автор сообщения сейчас "на сайте"
  986. if ( isset( $_SESSION['usersOnLine'] ) ) {
  987. if ( isset( $_SESSION['usersOnLine'][$post['id_author']] ) )
  988. $html = $html.'<span class="details">Просматривает форум</span><br/>'."\n";
  989. else
  990. $html = $html.'<span class="details">Покинул форум</span><br/>'."\n";
  991. }
  992. // Если пользователь заблокирован
  993. if ( $post['blocked'] )
  994. $html = $html.'<span class="userLocked">[Заблокирован]</span><br/>'."\n";
  995.  
  996. } else { // Если автор сообщения - незарегистрированный пользователь
  997. $html = $html.'<img src="./images/null.gif" alt="" width="100" height="100"
  998. style="border:1px solid #CCCCCC" /><br/>'."\n";
  999. }
  1000.  
  1001. $html = $html.'<br/><span class="quoteAuthor" onClick=quoteSelection(\''.$post['author'].'\');
  1002. onMouseOver="catchSelection(); this.className=\'quoteAuthorOver\'"
  1003. onMouseOut="this.className=\'quoteAuthor\'">Цитировать</span>';
  1004.  
  1005. $html = $html.'</td>'."\n";
  1006. $html = $html.'<td colspan="2">'."\n";
  1007. $html = $html.print_page( $post['name'] )."\n";
  1008. // Если есть прикреплённый файл - формируем ссылку на него
  1009. if( !empty( $post['putfile'] ) and is_file( './files/'.$post['putfile'] ) ) {
  1010. $html = $html.'<div align="right"><img src="./images/file.gif" alt="Открыть файл"
  1011. title="Открыть файл" align="absmiddle" />&nbsp;<a target="_blank"
  1012. href="./files/'.$post['putfile'].'">'.
  1013. ( getFileSize( './files/'.$post['putfile'] ) ).' Кб</a></div>'."\n";
  1014. }
  1015. if ( !empty( $post['signature'] ) ) {
  1016. $html = $html.'<br/><br/><hr>'."\n".'<div class="details">'.$post['signature'].'</div>'."\n";
  1017. }
  1018. $html = $html.'</td>'."\n";
  1019.  
  1020. $html = $html.'</tr>'."\n";
  1021. $html = $html.'<tr class="postBottom">'."\n";
  1022. $html = $html.'<td><a class="navigation" href="#top">Наверх</a></td>'."\n";
  1023. // Если автор сообщения (поста) - зарегистрированный пользователь
  1024. if ( $post['id_author'] ) {
  1025. $html = $html.'<td>'."\n";
  1026. $html = $html.'&nbsp;<a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
  1027. $post['id_author'].'"><img src="./images/icon_profile.gif"
  1028. alt="Посмотреть профиль" title="Посмотреть профиль" /></a>';
  1029. $html = $html.'&nbsp;&nbsp;'."\n";
  1030. if ( isset( $_SESSION['user'] ) ) {
  1031. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=sendMailForm&idUser='.
  1032. $post['id_author'].'"><img src="./images/icon_email.gif"
  1033. alt="Написать письмо" title="Написать письмо" /></a>';
  1034. $html = $html.'&nbsp;&nbsp;'."\n";
  1035. $html = $html.'<a href="'.$_SERVER['PHP_SELF'].'?action=sendMsgForm&idUser='.
  1036. $post['id_author'].'"><img src="./images/icon_pm.gif"
  1037. alt="Личное сообщение" title="Личное сообщение" /></a>';
  1038. $html = $html.'&nbsp;&nbsp;'."\n";
  1039. }
  1040. if ( !empty( $post['url'] ) ) {
  1041. $html = $html.'<a href="'.$post['url'].'" target="_blank"><img src="./images/icon_www.gif"
  1042. alt="Сайт автора" title="Сайт автора" /></a>';
  1043. }
  1044. $html = $html.'</td>'."\n";
  1045. } else {
  1046. $html = $html.'<td><span class="details"><img src="./images/null.gif" alt="" width="1"
  1047. height="20" align="absmiddle" />Незарегистрированный пользователь</span></td>'."\n";
  1048. }
  1049. // Если сообщение редактировалось...
  1050. if ( !empty( $post['editor'] ) ) {
  1051. $html = $html.'<td align="right">';
  1052. if ( $post['id_author'] == $post['id_editor'] ) {
  1053. $html = $html.'<span class="editedByUser">Отредактировано автором '.$post['edittime'].'</span>'."\n";
  1054. } else {
  1055. if ( $post['editor_status'] == 'admin' )
  1056. $html = $html.'<span class="editedByAdmin">Отредактировано администратором '.
  1057. $post['editor'].' '.$post['edittime'].'</span>'."\n";
  1058. if ( $post['editor_status'] == 'moderator' )
  1059. $html = $html.'<span class="editedByModer">Отредактировано модератором '.
  1060. $post['editor'].' '.$post['edittime'].'</span>'."\n";
  1061. if ( $post['editor_status'] == 'user' )
  1062. $html = $html.'<span class="editedByUser">Отредактировано '.
  1063. $post['editor'].' '.$post['edittime'].'</span>'."\n";
  1064. }
  1065. $html = $html.'</td>'."\n";
  1066. } else {
  1067. $html = $html.'<td>&nbsp;</td>'."\n";
  1068. }
  1069. $html = $html.'</tr>'."\n";
  1070. $html = $html.'</table>'."\n";
  1071. }
  1072.  
  1073. // Постраничная навигация и ссылка "Ответить"
  1074. $html = $html.$pagesAddPost;
  1075.  
  1076. // Если тема не закрыта - выводим форму для быстрого ответа
  1077. if ( $locked == 0 ) $html = $html.getQuickReplyForm( $id_theme );
  1078.  
  1079. // Если страницу темы запросил зарегистрированный пользователь, значит он ее просмотрит
  1080. if ( isset( $_SESSION['user'] ) and isset( $_SESSION['newThemes'] ) ) {
  1081. if ( count( $_SESSION['newThemes'] ) > 0 ) {
  1082. if ( in_array( $id_theme, $_SESSION['newThemes'] ) ) {
  1083. unset( $_SESSION['newThemes'][$id_theme] );
  1084. }
  1085. } else {
  1086. unset( $_SESSION['newThemes'] );
  1087. }
  1088. }
  1089.  
  1090. return $html;
  1091. }
  1092.  
  1093. // Функция возвращает форму для добавления нового форума
  1094. function getAddForumForm()
  1095. {
  1096. // Если форум пытается создать не зарегистрированный пользователь
  1097. if ( !isset( $_SESSION['user'] ) ) {
  1098. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1099. die();
  1100. }
  1101. // Проверяем, иммет ли право этот пользователь создавать форумы
  1102. if ( $_SESSION['user']['status'] != 'admin' ) {
  1103. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1104. die();
  1105. }
  1106.  
  1107. $html = '';
  1108.  
  1109. $action = $_SERVER['PHP_SELF'].'?action=addForum';
  1110. $title = '';
  1111. $description = '';
  1112.  
  1113. // Если при заполнении формы были допущены ошибки
  1114. if ( isset( $_SESSION['addForumForm'] ) ) {
  1115. $info = file_get_contents( './templates/infoMessage.html' );
  1116. $info = str_replace( '{infoMessage}', $_SESSION['addForumForm']['error'], $info );
  1117. $html = $html.$info."\n";
  1118. $title = htmlspecialchars( $_SESSION['addForumForm']['title'] );
  1119. $description = htmlspecialchars( $_SESSION['addForumForm']['description'] );
  1120. unset( $_SESSION['addForumForm'] );
  1121. }
  1122.  
  1123. // Считываем в переменную содержимое файла,
  1124. // содержащего форму для добавления форума
  1125. $tpl = file_get_contents( './templates/addForumForm.html' );
  1126. $tpl = str_replace( '{action}', $action, $tpl );
  1127. $tpl = str_replace( '{title}', '', $tpl );
  1128. $tpl = str_replace( '{description}', '', $tpl );
  1129.  
  1130. $html = $html . $tpl;
  1131.  
  1132. return $html;
  1133. }
  1134.  
  1135. // Функция добавляет новый форум (новую запись в таблицу БД TABLE_FORUMS)
  1136. function addForum()
  1137. {
  1138. // Если форум пытается создать не зарегистрированный пользователь
  1139. if ( !isset( $_SESSION['user'] ) ) {
  1140. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1141. die();
  1142. }
  1143. // Проверяем, имеет ли право этот пользователь создавать форумы
  1144. if ( $_SESSION['user']['status'] != 'admin' ) {
  1145. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1146. die();
  1147. }
  1148.  
  1149. // Если не переданы данные формы - значит функция была вызвана по ошибке
  1150. if ( !isset( $_POST['title'] ) or
  1151. !isset( $_POST['description'] ) )
  1152. {
  1153. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1154. die();
  1155. }
  1156.  
  1157. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  1158. $title = substr( $_POST['title'], 0, 120 );
  1159. $description = substr( $_POST['description'], 0, 250 );
  1160. // Обрезаем лишние пробелы
  1161. $title = trim( $title );
  1162. $description = trim( $description );
  1163.  
  1164. // Проверяем, заполнены ли обязательные поля
  1165. $error = '';
  1166. if ( empty( $title ) ) $error = $error.'<li>не заполнено поле "Название форума"</li>'."\n";
  1167. if ( empty( $description ) ) $error = $error.'<li>не заполнено поле "Описание"</li>'."\n";
  1168. // Проверяем поля формы на недопустимые символы
  1169. if ( !empty( $title ) and !preg_match( "#^[-.;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $title ) )
  1170. $error = $error.'<li>поле "Название форума" содержит недопустимые символы</li>'."\n";
  1171. if ( !empty( $description ) and !preg_match( "#^[-.;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $description ) )
  1172. $error = $error.'<li>поле "Описание" содержит недопустимые символы</li>'."\n";
  1173.  
  1174. // Если были допущены ошибки при заполнении формы -
  1175. // перенаправляем посетителя для исправления ошибок
  1176. if ( !empty( $error ) ) {
  1177. $_SESSION['addForumForm'] = array();
  1178. $_SESSION['addForumForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  1179. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  1180. $_SESSION['addForumForm']['title'] = $title;
  1181. $_SESSION['addForumForm']['description'] = $description;
  1182. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addForumForm' );
  1183. die();
  1184. }
  1185. // Порядок следования - новый форум будет в конце списка
  1186. $query = "SELECT IFNULL(MAX(pos), 0) FROM ".TABLE_FORUMS;
  1187. $res = mysql_query( $query );
  1188. if ( !$res ) {
  1189. $msg = 'Ошибка при добавлении нового форума';
  1190. $err = 'Ошибка при выполнении запроса: <br/>'.
  1191. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1192. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1193. return showErrorMessage( $msg, $err, true, '' );
  1194. }
  1195. $order = mysql_result( $res, 0, 0 ) + 1;
  1196. $query = "INSERT INTO ".TABLE_FORUMS."
  1197. (
  1198. name,
  1199. description,
  1200. pos
  1201. )
  1202. VALUES
  1203. (
  1204. '".mysql_real_escape_string( $title )."',
  1205. '".mysql_real_escape_string( $description )."',
  1206. ".$order."
  1207. )";
  1208. $res = mysql_query( $query );
  1209. if ( !$res ) {
  1210. $msg = 'Ошибка при добавлении нового форума';
  1211. $err = 'Ошибка при выполнении запроса: <br/>'.
  1212. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1213. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1214. return showErrorMessage( $msg, $err, true, '' );
  1215. }
  1216.  
  1217. return showInfoMessage( 'Новый форум успешно добавлен', '' );
  1218. }
  1219.  
  1220. // Функция возвращает форму для редактирования форума;
  1221. // уникальный ID форума передается методом GET
  1222. function getEditForumForm()
  1223. {
  1224. // Если форум пытается редактировать не зарегистрированный пользователь
  1225. if ( !isset( $_SESSION['user'] ) ) {
  1226. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1227. die();
  1228. }
  1229. // Проверяем, имеет ли право этот пользователь редактировать форум
  1230. if ( $_SESSION['user']['status'] != 'admin' ) {
  1231. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1232. die();
  1233. }
  1234. // Если не передан ID форума - функция вызвана по ошибке
  1235. if ( !isset( $_GET['idForum'] ) ) {
  1236. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1237. die();
  1238. }
  1239.  
  1240. $html = '';
  1241.  
  1242. // Получаем из БД информацию о форуме
  1243. $query = "SELECT name, description FROM ".TABLE_FORUMS." WHERE id_forum=".$_GET['idForum'];
  1244. $res = mysql_query( $query );
  1245. if ( !$res ) {
  1246. $msg = 'Ошибка при формировании формы для редактирования форума';
  1247. $err = 'Ошибка при выполнении запроса: <br/>'.
  1248. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1249. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1250. return showErrorMessage( $msg, $err, true, '' );
  1251. }
  1252. $forum = mysql_fetch_array( $res );
  1253. $action = $_SERVER['PHP_SELF'].'?action=updateForum&idForum='.$_GET['idForum'];
  1254.  
  1255. // Если при заполнении формы были допущены ошибки
  1256. if ( isset( $_SESSION['editForumForm'] ) ) {
  1257. $info = file_get_contents( './templates/infoMessage.html' );
  1258. $info = str_replace( '{infoMessage}', $_SESSION['editForumForm']['error'], $info );
  1259. $html = $html.$info."\n";
  1260. $title = htmlspecialchars( $_SESSION['editForumForm']['title'] );
  1261. $description = htmlspecialchars( $_SESSION['editForumForm']['description'] );
  1262. unset( $_SESSION['editForumForm'] );
  1263. } else {
  1264. $title = htmlspecialchars( $forum['name'] );
  1265. $description = htmlspecialchars( $forum['description'] );
  1266. }
  1267. // Считываем в переменную содержимое файла,
  1268. // содержащего форму для редактирования форума
  1269. $tpl = file_get_contents( './templates/editForumForm.html' );
  1270. $tpl = str_replace( '{action}', $action, $tpl );
  1271. $tpl = str_replace( '{title}', $title, $tpl );
  1272. $tpl = str_replace( '{description}', $description, $tpl );
  1273.  
  1274. $html = $html . $tpl;
  1275.  
  1276. return $html;
  1277. }
  1278.  
  1279. // Функция обновляет информацию о форуме (запись в таблице БД TABLE_FORUMS);
  1280. // уникальный ID форума передается методом GET
  1281. function updateForum()
  1282. {
  1283. // Если форум пытается редактировать не зарегистрированный пользователь
  1284. if ( !isset( $_SESSION['user'] ) ) {
  1285. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1286. die();
  1287. }
  1288. // Проверяем, имеет ли право этот пользователь редактировать форум
  1289. if ( $_SESSION['user']['status'] != 'admin' ) {
  1290. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1291. die();
  1292. }
  1293. // Если не передан ID форума - функция вызвана по ошибке
  1294. if ( !isset( $_GET['idForum'] ) ) {
  1295. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1296. die();
  1297. }
  1298.  
  1299. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  1300. $title = substr( $_POST['title'], 0, 120 );
  1301. $description = substr( $_POST['description'], 0, 250 );
  1302. // Обрезаем лишние пробелы
  1303. $title = trim( $title );
  1304. $description = trim( $description );
  1305.  
  1306. // Проверяем, заполнены ли обязательные поля
  1307. $error = '';
  1308. if ( empty( $title ) ) $error = $error.'<li>не заполнено поле "Название форума"</li>'."\n";
  1309. if ( empty( $description ) ) $error = $error.'<li>не заполнено поле "Описание"</li>'."\n";
  1310. // Проверяем поля формы на недопустимые символы
  1311. if ( !empty( $title ) and !preg_match( "#^[-.;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $title ) )
  1312. $error = $error.'<li>поле "Название форума" содержит недопустимые символы</li>'."\n";
  1313. if ( !empty( $description ) and !preg_match( "#^[-.;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $description ) )
  1314. $error = $error.'<li>поле "Описание" содержит недопустимые символы</li>'."\n";
  1315.  
  1316. // Если были допущены ошибки при заполнении формы -
  1317. // перенаправляем посетителя для исправления ошибок
  1318. if ( !empty( $error ) )
  1319. {
  1320. $_SESSION['editForumForm'] = array();
  1321. $_SESSION['editForumForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  1322. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  1323. $_SESSION['editForumForm']['title'] = $title;
  1324. $_SESSION['editForumForm']['description'] = $description;
  1325. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editForumForm&idForum='.$_GET['idForum'] );
  1326. die();
  1327. }
  1328. // Все поля заполнены правильно - выполняем запрос
  1329. $query = "UPDATE ".TABLE_FORUMS."
  1330. SET
  1331. name='".mysql_real_escape_string( $title )."',
  1332. description='".mysql_real_escape_string( $description )."'
  1333. WHERE id_forum=".$_GET['idForum'];
  1334. $res = mysql_query( $query );
  1335. if ( !$res ) {
  1336. $msg = 'Ошибка при обновлении форума';
  1337. $err = 'Ошибка при выполнении запроса: <br/>'.
  1338. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1339. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1340. return showErrorMessage( $msg, $err, true, '' );
  1341. }
  1342.  
  1343. return showInfoMessage( 'Обновление форума прошло успешно', '' );
  1344. }
  1345.  
  1346. function forumUp()
  1347. {
  1348. // Если форум пытается редактировать не зарегистрированный пользователь
  1349. if ( !isset( $_SESSION['user'] ) ) {
  1350. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1351. die();
  1352. }
  1353. // Проверяем, имеет ли право этот пользователь редактировать форум
  1354. if ( $_SESSION['user']['status'] != 'admin' ) {
  1355. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1356. die();
  1357. }
  1358. // Если не передан ID форума - функция вызвана по ошибке
  1359. if ( !isset( $_GET['idForum'] ) ) {
  1360. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1361. die();
  1362. }
  1363. // Форум, который "поднимается" вверх
  1364. $id_forum_up = $_GET['idForum'];
  1365. $query = "SELECT pos FROM ".TABLE_FORUMS." WHERE id_forum=".$id_forum_up;
  1366. $res = mysql_query( $query );
  1367. // Порядок следования форума, который "поднимается" вверх
  1368. $order_up = mysql_result( $res, 0, 0 );
  1369. $query = "SELECT id_forum, pos
  1370. FROM ".TABLE_FORUMS."
  1371. WHERE pos<".$order_up."
  1372. ORDER BY pos DESC LIMIT 1";
  1373. $res = mysql_query( $query );
  1374. // Если форум, который "поднимается" вверх и так выше всех (первый в списке)
  1375. if ( mysql_num_rows( $res ) == 0 ) return true;
  1376. // Порядок следования и ID форума, который находится выше и будет "опущен" вниз
  1377. // ( поменявшись местами с форумом, который "поднимается" вверх )
  1378. list( $id_forum_down, $order_down ) = mysql_fetch_array( $res );
  1379. // Меняем местами форумы
  1380. $query1 = "UPDATE ".TABLE_FORUMS." SET pos=".$order_down." WHERE id_forum=".$id_forum_up;
  1381. $res1 = mysql_query( $query1 );
  1382. $query2 = "UPDATE ".TABLE_FORUMS." SET pos=".$order_up." WHERE id_forum=".$id_forum_down;
  1383. $res2 = mysql_query( $query2 );
  1384. if ( $res1 and $res2 )
  1385. return showInfoMessage( 'Операция прошла успешно', '' );
  1386. else
  1387. return showInfoMessage( 'Ошибка при выполнении операции', '' );
  1388. }
  1389.  
  1390. function forumDown()
  1391. {
  1392. // Если форум пытается редактировать не зарегистрированный пользователь
  1393. if ( !isset( $_SESSION['user'] ) ) {
  1394. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1395. die();
  1396. }
  1397. // Проверяем, имеет ли право этот пользователь редактировать форум
  1398. if ( $_SESSION['user']['status'] != 'admin' ) {
  1399. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1400. die();
  1401. }
  1402. // Если не передан ID форума - функция вызвана по ошибке
  1403. if ( !isset( $_GET['idForum'] ) ) {
  1404. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1405. die();
  1406. }
  1407. // Форум, который "опускается" вниз
  1408. $id_forum_down = $_GET['idForum'];
  1409. $query = "SELECT pos FROM ".TABLE_FORUMS." WHERE id_forum=".$id_forum_down;
  1410. $res = mysql_query( $query );
  1411. // Порядок следования форума, который "опускается" вниз
  1412. $order_down = mysql_result( $res, 0, 0 );
  1413. $query = "SELECT id_forum, pos
  1414. FROM ".TABLE_FORUMS."
  1415. WHERE pos>".$order_down."
  1416. ORDER BY pos LIMIT 1";
  1417. $res = mysql_query( $query );
  1418. // Если форум, который "опускается" вниз и так ниже всех (последний в списке)
  1419. if ( mysql_num_rows( $res ) == 0 ) return true;
  1420. // Порядок следования и ID форума, который находится ниже и будет "поднят" вверх
  1421. // ( поменявшись местами с форумом, который "опускается" вниз )
  1422. list( $id_forum_up, $order_up ) = mysql_fetch_array( $res );
  1423. // Меняем местами форумы
  1424. $query1 = "UPDATE ".TABLE_FORUMS." SET pos=".$order_down." WHERE id_forum=".$id_forum_up;
  1425. $res1 = mysql_query( $query1 );
  1426. $query2 = "UPDATE ".TABLE_FORUMS." SET pos=".$order_up." WHERE id_forum=".$id_forum_down;
  1427. $res2 = mysql_query( $query2 );
  1428. if ( $res1 and $res2 )
  1429. return showInfoMessage( 'Операция прошла успешно', '' );
  1430. else
  1431. return showInfoMessage( 'Ошибка при выполнении операции', '' );
  1432. }
  1433.  
  1434. // Функция удаляет форум (запись в таблице TABLE_FORUMS)
  1435. function deleteForum()
  1436. {
  1437. // Не зарегистрированный пользователь не может добавить тему
  1438. if ( !isset( $_SESSION['user'] ) ) {
  1439. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1440. die();
  1441. }
  1442. // Форум может удалить только администратор
  1443. if ( $_SESSION['user']['status'] != 'admin' ) {
  1444. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1445. die();
  1446. }
  1447. // Если не передан ID форума - значит функция вызвана по ошибке
  1448. if ( !isset( $_GET['idForum'] ) ) {
  1449. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1450. die();
  1451. }
  1452. // Можно удалить только форум, который не содержит тем (в целях безопасности)
  1453. $query = "SELECT COUNT(*) FROM ".TABLE_THEMES." WHERE id_forum=".$_GET['idForum'];
  1454. $res = mysql_query( $query );
  1455. if ( !$res ) {
  1456. $msg = 'Ошибка при удалении форума';
  1457. $err = 'Ошибка при выполнении запроса: <br/>'.
  1458. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1459. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1460. return showErrorMessage( $msg, $err, true, '' );
  1461. }
  1462. if ( mysql_result( $res, 0, 0 ) > 0 )
  1463. return showInfoMessage( 'Нельзя удалить форум, который содержит темы', '' );
  1464. else
  1465. return showInfoMessage( 'Форум успешно удален', '' );
  1466. }
  1467.  
  1468.  
  1469. // Функция возвращает форму для добавления новой темы;
  1470. // ID форума, куда добавляется тема передается методом GET
  1471. function getAddThemeForm()
  1472. {
  1473. // На зарегистрированный пользователь не может добавить тему
  1474. if ( !isset( $_SESSION['user'] ) ) {
  1475. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1476. die();
  1477. }
  1478. // Если не передан ID форума, куда будет добавлена тема -
  1479. // значит функция была вызвана по ошибке
  1480. if ( !isset( $_GET['idForum'] ) ) {
  1481. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1482. die();
  1483. }
  1484.  
  1485. $html = '';
  1486. $theme = '';
  1487. $message = '';
  1488.  
  1489. if ( isset( $_SESSION['viewMessage'] ) and !empty( $_SESSION['viewMessage']['message'] ) ) {
  1490. $view = file_get_contents( './templates/previewMessage.html' );
  1491. $view = str_replace( '{message}', print_page( $_SESSION['viewMessage']['message'] ), $view );
  1492. $html = $html.$view."\n";
  1493. $theme = htmlspecialchars( $_SESSION['viewMessage']['theme'] );
  1494. $message = htmlspecialchars( $_SESSION['viewMessage']['message'] );
  1495. unset( $_SESSION['viewMessage'] );
  1496. }
  1497.  
  1498. // Если при заполнении формы были допущены ошибки
  1499. if ( isset( $_SESSION['addThemeForm'] ) ) {
  1500. $info = file_get_contents( './templates/infoMessage.html' );
  1501. $info = str_replace( '{infoMessage}', $_SESSION['addThemeForm']['error'], $info );
  1502. $html = $html.$info."\n";
  1503. $theme = htmlspecialchars( $_SESSION['addThemeForm']['theme'] );
  1504. $message = htmlspecialchars( $_SESSION['addThemeForm']['message'] );
  1505. unset( $_SESSION['addThemeForm'] );
  1506. }
  1507.  
  1508. $action = $_SERVER['PHP_SELF'].'?action=addTheme&idForum='.$_GET['idForum'];
  1509. $html = $html.file_get_contents( './templates/addThemeForm.html' );
  1510. $html = str_replace( '{action}', $action, $html );
  1511. $html = str_replace( '{theme}', $theme, $html );
  1512. $html = str_replace( '{message}', $message, $html );
  1513. return $html;
  1514. }
  1515.  
  1516. // Функция добавляет новую тему (новую запись в таблицу БД TABLE_THEMES)
  1517. function addTheme()
  1518. {
  1519. // На зарегистрированный пользователь не может добавить тему
  1520. if ( !isset( $_SESSION['user'] ) ) {
  1521. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1522. die();
  1523. }
  1524. // Если не переданы данные формы - функция вызвана по ошибке
  1525. if ( !isset( $_GET['idForum'] ) or
  1526. !isset( $_POST['theme'] ) or
  1527. !isset( $_POST['message'] ) or
  1528. !isset( $_FILES['attach'] ) )
  1529. {
  1530. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1531. die();
  1532. }
  1533.  
  1534. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  1535. $theme = substr( $_POST['theme'], 0, 128 );
  1536. $message = substr( $_POST['message'], 0, MAX_POST_LENGTH );
  1537. // Обрезаем лишние пробелы
  1538. $theme = trim( $theme );
  1539. $message = trim( $message );
  1540.  
  1541. // Если пользователь хочет посмотреть на сообщение перед отправкой
  1542. if ( isset( $_POST['viewMessage'] ) ) {
  1543. $_SESSION['viewMessage']['theme'] = $theme;
  1544. $_SESSION['viewMessage']['message'] = $message;
  1545. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addThemeForm&idForum='.$_GET['idForum'] );
  1546. die();
  1547. }
  1548.  
  1549. // Проверяем, заполнены ли обязательные поля
  1550. $error = '';
  1551. if ( empty( $theme ) ) $error = $error.'<li>не заполнено поле "Тема"</li>'."\n";
  1552. if ( empty( $message ) ) $error = $error.'<li>не заполнено поле "Сообщение"</li>'."\n";
  1553. // Проверяем поля формы на недопустимые символы
  1554. if ( !empty( $theme ) and preg_match( "[А-Яа-яЁё]", $theme ) )
  1555. $error = $error.'<li>поле "Тема" содержит недопустимые символы</li>'."\n";
  1556. if ( $_FILES['attach']['size'] > MAX_FILE_SIZE )
  1557. $error = $error.'<li>Размер файла больше '.(MAX_FILE_SIZE/1024).' Кб</li>'."\n";
  1558.  
  1559. // Если были допущены ошибки при заполнении формы -
  1560. // перенаправляем посетителя для исправления ошибок
  1561. if ( !empty( $error ) )
  1562. {
  1563. $_SESSION['addThemeForm'] = array();
  1564. $_SESSION['addThemeForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  1565. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  1566. $_SESSION['addThemeForm']['theme'] = $theme;
  1567. $_SESSION['addThemeForm']['message'] = $message;
  1568. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addThemeForm&idForum='.$_GET['idForum'] );
  1569. die();
  1570. }
  1571. // Формируем SQL-запрос на добавление темы
  1572. $query_theme = "INSERT INTO ".TABLE_THEMES."
  1573. VALUES
  1574. (
  1575. NULL,
  1576. '".mysql_real_escape_string( $theme )."',
  1577. '".mysql_real_escape_string( $_SESSION['user']['name'] )."',
  1578. ".$_SESSION['user']['id_author'].",
  1579. NOW(),
  1580. ".$_SESSION['user']['id_author'].",
  1581. '".mysql_real_escape_string( $_SESSION['user']['name'] )."',
  1582. NOW(),
  1583. ".$_GET['idForum'].",
  1584. 0
  1585. )";
  1586. $res = mysql_query( $query_theme );
  1587. if ( !$res ) {
  1588. $msg = 'Ошибка при добавлении новой темы';
  1589. $err = 'Ошибка при выполнении запроса: <br/>'.
  1590. $query_theme.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1591. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1592. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1593. }
  1594. // Выясняем первичный ключ только что добавленной записи -
  1595. // это понадобится для добавления сообщения (поста) и файла
  1596. $id_theme = mysql_insert_id();
  1597.  
  1598. // Если поле выбора файла(рисунка) не пустое
  1599. $file = '';
  1600. if ( !empty($_FILES['attach']['name']) ) {
  1601. // Проверяем не больше ли файл максимально допустимого размера
  1602. if ( $_FILES['attach']['size'] <= MAX_FILE_SIZE ) {
  1603. // Проверяем, не является ли файл скриптом PHP или Perl, html;
  1604. // если это так преобразуем его в формат .txt
  1605. $extentions = array(".php",".phtml",".php3",".html",".htm",".pl");
  1606. // Извлекаем из имени файла расширение
  1607. $ext = strrchr( $_FILES['attach']['name'], "." );
  1608. // Формируем путь к файлу
  1609. if ( in_array( $ext, $extentions ) )
  1610. $file = $id_theme.'-'.date("YmdHis",time()).'.txt';
  1611. else
  1612. $file = $id_theme.'-'.date("YmdHis",time()).$ext;
  1613. // Перемещаем файл из временной директории сервера в
  1614. // директорию /files Web-приложения
  1615. if ( move_uploaded_file ( $_FILES['attach']['tmp_name'], './files/'.$file ) )
  1616. chmod( './files/'.$file, 0644 );
  1617. }
  1618. }
  1619.  
  1620. // Формируем SQL-запрос на добавление сообщения
  1621. $query = "INSERT INTO ".TABLE_POSTS."
  1622. VALUES
  1623. (
  1624. NULL,
  1625. '".mysql_real_escape_string( $message )."',
  1626. '".$file."',
  1627. '".mysql_real_escape_string( $_SESSION['user']['name'] )."',
  1628. ".$_SESSION['user']['id_author'].",
  1629. NOW(),
  1630. NOW(),
  1631. 0,
  1632. ".$id_theme.",
  1633. 0
  1634. )";
  1635. $res = mysql_query( $query );
  1636. if ( !$res ) {
  1637. $msg = 'Ошибка при добавлении новой темы';
  1638. $err = 'Ошибка при выполнении запроса: <br/>'.
  1639. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1640. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1641. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1642. }
  1643. // Обновляем число оставленных сообщений и созданных тем
  1644. $q = "UPDATE ".TABLE_USERS." SET themes=themes+1, posts=posts+1
  1645. WHERE id_author = ".$_SESSION['user']['id_author'];
  1646. mysql_query( $q );
  1647.  
  1648. return showInfoMessage( 'Новая тема успешно добавлена',
  1649. 'action=showForum&idForum='.$_GET['idForum'] );
  1650. }
  1651.  
  1652. // Функция возвращает форму для редактирования темы;
  1653. // ID форума и темы передаются методом GET
  1654. function getEditThemeForm()
  1655. {
  1656. // Если не передан ID форума - значит функция была вызвана по ошибке
  1657. if ( !isset( $_GET['idForum'] ) ) {
  1658. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1659. die();
  1660. }
  1661. // Если не передан ID темы - значит функция была вызвана по ошибке
  1662. if ( !isset( $_GET['id_theme'] ) ) {
  1663. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1664. die();
  1665. }
  1666.  
  1667. $id_theme = (int)$_GET['id_theme'];
  1668. if ( $id_theme < 1 ) {
  1669. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1670. die();
  1671. }
  1672.  
  1673. // Получаем из БД информацию о редактируемой теме
  1674. $query = "SELECT name, author, id_forum FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  1675. $res = mysql_query( $query );
  1676. if ( !$res ) {
  1677. $msg = 'Ошибка при формировании формы для редактирования темы';
  1678. $err = 'Ошибка при выполнении запроса: <br/>'.
  1679. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1680. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1681. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1682. }
  1683. if ( mysql_num_rows( $res ) == 0 ) {
  1684. header( 'Location: '.$_SERVER['PHP_SELF'].'action=showForum&idForum='.$_GET['idForum'] );
  1685. die();
  1686. }
  1687. $theme = mysql_fetch_array( $res );
  1688. $_GET['idForum'] = $theme['id_forum'];
  1689.  
  1690. $html = '';
  1691.  
  1692. // Если при заполнении формы были допущены ошибки
  1693. if ( isset( $_SESSION['editThemeForm'] ) ) {
  1694. $html = $html.$_SESSION['editThemeForm']['error'];
  1695. $name = htmlspecialchars( $_SESSION['editThemeForm']['name'] );
  1696. unset( $_SESSION['editThemeForm'] );
  1697. } else {
  1698. $name = htmlspecialchars( $theme['name'] );
  1699. }
  1700.  
  1701. // Формируем список форумов, чтобы можно было переместить тему в другой форум
  1702. $query = "SELECT id_forum, name FROM ".TABLE_FORUMS." WHERE 1 ORDER BY pos";
  1703. $res = mysql_query( $query );
  1704. if ( !$res ) {
  1705. $msg = 'Ошибка при формировании формы для редактирования темы';
  1706. $err = 'Ошибка при выполнении запроса: <br/>'.
  1707. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1708. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1709. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1710. }
  1711. if ( mysql_num_rows( $res ) == 0 ) {
  1712. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1713. die();
  1714. }
  1715.  
  1716. $options = '';
  1717. while ( $forum = mysql_fetch_array( $res ) ) {
  1718. if ( $forum['id_forum'] == $theme['id_forum'] )
  1719. $options = $options.'<option value="'.$forum['id_forum'].'" selected>'.$forum['name'].'</option>'."\n";
  1720. else
  1721. $options = $options.'<option value="'.$forum['id_forum'].'">'.$forum['name'].'</option>'."\n";
  1722. }
  1723.  
  1724. $action = $_SERVER['PHP_SELF'].'?action=updateTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
  1725.  
  1726. // Считываем в переменную файл шаблона, содержащего форму для редактирования темы
  1727. $tpl = file_get_contents( './templates/editThemeForm.html' );
  1728.  
  1729. $tpl = str_replace( '{action}', $action, $tpl );
  1730. $tpl = str_replace( '{name}', htmlspecialchars( $theme['name'] ), $tpl );
  1731. $tpl = str_replace( '{author}', htmlspecialchars( $theme['author'] ), $tpl );
  1732. $tpl = str_replace( '{options}', $options, $tpl );
  1733.  
  1734. $html = $html. $tpl;
  1735.  
  1736. return $html;
  1737. }
  1738.  
  1739. // Функция обновляет информацию о теме (запись в таблице БД TABLE_THEMES);
  1740. // уникальный ID темы передается методом GET
  1741. function updateTheme()
  1742. {
  1743. // Если не переданы данные формы - функция вызвана по ошибке
  1744. if ( !isset( $_GET['idForum'] ) or
  1745. !isset( $_GET['id_theme'] ) or
  1746. !isset( $_POST['id_forum'] ) or
  1747. !isset( $_POST['name'] ) )
  1748. {
  1749. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1750. die();
  1751. }
  1752. $id_theme = (int)$_GET['id_theme'];
  1753. if ( $id_theme < 1 ) {
  1754. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
  1755. die();
  1756. }
  1757. $id_forum = (int)$_POST['id_forum'];
  1758. if ( $id_forum < 1 ) {
  1759. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
  1760. die();
  1761. }
  1762.  
  1763. // Если тему пытается редактировать не зарегистрированный пользователь
  1764. if ( !isset( $_SESSION['user'] ) ) {
  1765. header( 'Location: '.$_SERVER['PHP_SELF'].'action=showForum&idForum='.$_GET['idForum'] );
  1766. die();
  1767. }
  1768.  
  1769. // Проверяем, имеет ли право этот пользователь редактировать тему
  1770. if ( $_SESSION['user']['status'] == 'user' ) {
  1771. $msg = 'У вас нет прав для редактирования темы';
  1772. return showInfoMessage( $msg, 'action=showForum&idForum='.$_GET['idForum'] );
  1773. }
  1774.  
  1775. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  1776. $name = substr( $_POST['name'], 0, 128 );
  1777. // Обрезаем лишние пробелы
  1778. $name = trim( $name );
  1779.  
  1780. // Проверяем, заполнены ли обязательные поля
  1781. $error = '';
  1782. if ( empty( $name ) ) $error = $error.'<li>не заполнено поле "Тема"</li>'."\n";
  1783. // Проверяем поля формы на недопустимые символы
  1784. if ( !empty( $name ) and !preg_match( "#^[-.;:,?!/)=(_\"\s0-9а-яА-Яa-z]+$#i", $name ) )
  1785. $error = $error.'<li>поле "Тема" содержит недопустимые символы</li>'."\n";
  1786.  
  1787. // Если были допущены ошибки при заполнении формы -
  1788. // перенаправляем пользователя для исправления ошибок
  1789. if ( !empty( $error ) )
  1790. {
  1791. $_SESSION['editThemeForm'] = array();
  1792. $_SESSION['editThemeForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'."\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  1793. $_SESSION['editThemeForm']['name'] = $name;
  1794. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editThemeForm&idForum='.
  1795. $_GET['idForum'].'&id_theme='.$id_theme );
  1796. die();
  1797. }
  1798.  
  1799. // Если тема перемещается в другой форум, мы
  1800. // должны проверить, что этот форум существует
  1801. $tmp = '';
  1802. if ( $id_forum != $_GET['idForum'] ) {
  1803. $query = "SELECT id_forum FROM ".TABLE_FORUMS." WHERE 1";
  1804. $res = mysql_query( $query );
  1805. if ( !$res ) {
  1806. $msg = 'Ошибка при обновлении темы';
  1807. $err = 'Ошибка при выполнении запроса: <br/>'.
  1808. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1809. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1810. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1811. }
  1812. while ( $id = mysql_fetch_row( $res ) ) $ids[] = $id[0];
  1813. if ( !in_array( $id_forum, $ids ) )
  1814. return showInfoMessage( 'Ошибка при обновлении темы', 'action=showForum&idForum='.$_GET['idForum'] );
  1815. else
  1816. $tmp = ', id_forum='.$id_forum;
  1817. }
  1818.  
  1819. // Запрос на обновление темы
  1820. $query = "UPDATE ".TABLE_THEMES."
  1821. SET name='".mysql_real_escape_string( $name )."'".$tmp."
  1822. WHERE id_theme=".$id_theme;
  1823. $res = mysql_query( $query );
  1824. if ( !$res ) {
  1825. $msg = 'Ошибка при обновлении темы';
  1826. $err = 'Ошибка при выполнении запроса: <br/>'.
  1827. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1828. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1829. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1830. } else {
  1831. return showInfoMessage( 'Обновление темы прошло успешно', 'action=showForum&idForum='.$_GET['idForum'] );
  1832. }
  1833. }
  1834.  
  1835. // Функция удаляет тему; ID темы передается методом GET
  1836. function deleteTheme()
  1837. {
  1838. // Если тему пытается удалить не зарегистрированный пользователь
  1839. if ( !isset( $_SESSION['user'] ) ) {
  1840. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1841. die();
  1842. }
  1843. // Только администратор или модератор может удалить тему
  1844. if ( $_SESSION['user']['status'] == 'user' ) {
  1845. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1846. die();
  1847. }
  1848. // Если не передан ID форума - значит функция была вызвана по ошибке
  1849. if ( !isset( $_GET['idForum'] ) ) {
  1850. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1851. die();
  1852. }
  1853. // Если не передан ID темы, которую надо удалить
  1854. if ( !isset( $_GET['id_theme'] ) ) {
  1855. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1856. die();
  1857. }
  1858. $id_theme = (int)$_GET['id_theme'];
  1859. if ( $id_theme < 1 ) {
  1860. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1861. die();
  1862. }
  1863.  
  1864. // Выдаем пользователю сообщение с просьбой подтвердить свое
  1865. // желание удалить тему
  1866. if ( !isset( $_GET['confirm'] ) ) {
  1867. $html = '<div align="center"><p>Вы действительно хотите удалить эту тему?</p>'."\n";
  1868. $html = $html.'<input type="button" name="yes" value="Да"
  1869. onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=deleteTheme&idForum='.
  1870. $_GET['idForum'].'&id_theme='.$id_theme.'&confirm=yes\'" />&nbsp;&nbsp;'."\n";
  1871. $html = $html.'<input type="button" name="no" value="Нет"
  1872. onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
  1873. $_GET['idForum'].'\'" /></div>'."\n";
  1874. $tpl = file_get_contents( './templates/infoMessage.html' );
  1875. $tpl = str_replace( '{infoMessage}', $html, $tpl );
  1876. return $tpl;
  1877. }
  1878.  
  1879. // Это небольшой код для удаленния коллизий в БД;
  1880. // каким-то образом во время тестирования форума
  1881. // у меня появилось несколько тем, в которых не
  1882. // было сообщений (постов)
  1883. // Вообще, надо подумать об использовании InnoDB и Foreign Key
  1884. $q = "DELETE FROM ".TABLE_THEMES." WHERE id_theme NOT IN (SELECT DISTINCT id_theme FROM ".TABLE_POSTS.")";
  1885. mysql_query( $q );
  1886. $q = "DELETE FROM ".TABLE_POSTS." WHERE id_theme NOT IN (SELECT id_theme FROM ".TABLE_THEMES.")";
  1887. mysql_query( $q );
  1888.  
  1889. // Сперва мы должны удалить все сообщения (посты) темы;
  1890. // начнем с того, что удалим файлы вложений
  1891. $query = "SELECT putfile, id_author FROM ".TABLE_POSTS."
  1892. WHERE id_theme=".$id_theme;
  1893. $res = mysql_query( $query );
  1894. if ( !$res ) {
  1895. $msg = 'Ошибка при удалении темы';
  1896. $err = 'Ошибка при выполнении запроса: <br/>'.
  1897. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1898. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1899. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1900. }
  1901. if ( mysql_num_rows( $res ) > 0 ) {
  1902. while( $file = mysql_fetch_row( $res ) ) {
  1903. if ( !empty( $file[0] ) and is_file( './files/'.$file[0] ) ) unlink( is_file( './files/'.$file[0] ) );
  1904. // заодно обновляем таблицу TABLE_USERS - надо обновить поле posts (кол-во сообщений)
  1905. if ( $file[1] ) {
  1906. // Здесь надо будет переделать - выполнять только один запрос
  1907. // UPDATE users SET posts=posts-1 WHERE id_author IN (3, 5, 12);
  1908. $q = "UPDATE ".TABLE_USERS." SET posts=posts-1 WHERE id_author=".$file[1];
  1909. $r = mysql_query( $q );
  1910. }
  1911. }
  1912. }
  1913.  
  1914. // Продолжаем - удаляем сообщения (посты)
  1915. $query = "DELETE FROM ".TABLE_POSTS." WHERE id_theme=".$id_theme;
  1916. $res = mysql_query( $query );
  1917. if ( !$res ) {
  1918. $msg = 'Ошибка при удалении темы';
  1919. $err = 'Ошибка при выполнении запроса: <br/>'.
  1920. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1921. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1922. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1923. }
  1924.  
  1925. // Обновляем таблицу TABLE_USERS - надо обновить поле themes
  1926. $query = "UPDATE ".TABLE_USERS." SET themes=themes-1
  1927. WHERE id_author=(SELECT id_author FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme.")";
  1928. mysql_query( $query );
  1929.  
  1930. // Теперь удаляем тему (запись в таблице TABLE_THEMES)
  1931. $query = "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  1932. $res = mysql_query( $query );
  1933. if ( !$res ) {
  1934. $msg = 'Ошибка при удалении темы';
  1935. $err = 'Ошибка при выполнении запроса: <br/>'.
  1936. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1937. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1938. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1939. }
  1940.  
  1941. return showInfoMessage( 'Тема удалена',
  1942. 'action=showForum&idForum='.$_GET['idForum'] );
  1943. }
  1944.  
  1945. // Закрыть тему
  1946. function lockTheme()
  1947. {
  1948. // Если тему пытается закрыть не зарегистрированный пользователь
  1949. if ( !isset( $_SESSION['user'] ) ) {
  1950. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1951. die();
  1952. }
  1953. // Только администратор или модератор может закрыть тему
  1954. if ( $_SESSION['user']['status'] == 'user' ) {
  1955. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1956. die();
  1957. }
  1958. // Если не передан ID форума - значит функция была вызвана по ошибке
  1959. if ( !isset( $_GET['idForum'] ) ) {
  1960. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1961. die();
  1962. }
  1963. // Если не передан ID темы, которую надо закрыть
  1964. if ( !isset( $_GET['id_theme'] ) ) {
  1965. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1966. die();
  1967. }
  1968. $id_theme = (int)$_GET['id_theme'];
  1969. if ( $id_theme < 1 ) {
  1970. header( 'Location: '.$_SERVER['PHP_SELF'] );
  1971. die();
  1972. }
  1973.  
  1974. // Сначала заблокируем сообщения (посты) темы
  1975. $query = "UPDATE ".TABLE_POSTS." SET locked=1 WHERE id_theme=".$id_theme;
  1976. $res = mysql_query( $query );
  1977. if ( !$res ) {
  1978. $msg = 'Ошибка при попытке заблокировать тему';
  1979. $err = 'Ошибка при выполнении запроса: <br/>'.
  1980. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1981. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1982. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1983. }
  1984. // Теперь заблокируем тему
  1985. $query = "UPDATE ".TABLE_THEMES." SET locked=1 WHERE id_theme=".$id_theme;
  1986. $res = mysql_query( $query );
  1987. if ( !$res ) {
  1988. $msg = 'Ошибка при попытке заблокировать тему';
  1989. $err = 'Ошибка при выполнении запроса: <br/>'.
  1990. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  1991. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  1992. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  1993. }
  1994.  
  1995. return showInfoMessage( 'Тема закрыта',
  1996. 'action=showForum&idForum='.$_GET['idForum'] );
  1997. }
  1998.  
  1999. // Открыть тему
  2000. function unlockTheme()
  2001. {
  2002. // Если тему пытается разблокировать не зарегистрированный пользователь
  2003. if ( !isset( $_SESSION['user'] ) ) {
  2004. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2005. die();
  2006. }
  2007. // Только администратор или модератор может разблокировать тему
  2008. if ( $_SESSION['user']['status'] == 'user' ) {
  2009. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2010. die();
  2011. }
  2012. // Если не передан ID форума - значит функция была вызвана по ошибке
  2013. if ( !isset( $_GET['idForum'] ) ) {
  2014. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2015. die();
  2016. }
  2017. // Если не передан ID темы, которую надо разблокировать
  2018. if ( !isset( $_GET['id_theme'] ) ) {
  2019. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2020. die();
  2021. }
  2022. $id_theme = (int)$_GET['id_theme'];
  2023. if ( $id_theme < 1 ) {
  2024. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2025. die();
  2026. }
  2027.  
  2028. // Сначала разблокируем сообщения (посты) темы
  2029. $query = "UPDATE ".TABLE_POSTS." SET locked=0 WHERE id_theme=".$id_theme;
  2030. $res = mysql_query( $query );
  2031. if ( !$res ) {
  2032. $msg = 'Ошибка при попытке разблокировать тему';
  2033. $err = 'Ошибка при выполнении запроса: <br/>'.
  2034. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2035. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2036. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  2037. }
  2038. // Теперь разблокируем тему
  2039. $query = "UPDATE ".TABLE_THEMES." SET locked=0 WHERE id_theme=".$id_theme;
  2040. $res = mysql_query( $query );
  2041. if ( !$res ) {
  2042. $msg = 'Ошибка при попытке разблокировать тему';
  2043. $err = 'Ошибка при выполнении запроса: <br/>'.
  2044. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2045. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2046. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  2047. }
  2048.  
  2049. return showInfoMessage( 'Тема открыта',
  2050. 'action=showForum&idForum='.$_GET['idForum'] );
  2051. }
  2052.  
  2053. // Функция возвращает форму для добавления нового сообщения (поста)
  2054. function getAddPostForm()
  2055. {
  2056. // Если не передан ID форума - значит функция была вызвана по ошибке
  2057. if ( !isset( $_GET['idForum'] ) ) {
  2058. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2059. die();
  2060. }
  2061. // Если не передан ID темы, куда будет добавлено сообщение -
  2062. // значит функция была вызвана по ошибке
  2063. if ( !isset( $_GET['id_theme'] ) ) {
  2064. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2065. die();
  2066. }
  2067. $id_theme = (int)$_GET['id_theme'];
  2068. if ( $id_theme < 1 ) {
  2069. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2070. die();
  2071. }
  2072.  
  2073. // Проверяем, не заблокирована ли тема?
  2074. $query = "SELECT locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  2075. $res = mysql_query( $query );
  2076. if ( !$res ) {
  2077. $msg = 'Ошибка при формировании формы для добавления нового сообщения';
  2078. $err = 'Ошибка при выполнении запроса: <br/>'.
  2079. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2080. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2081. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  2082. }
  2083. if ( mysql_num_rows( $res ) == 0 ) {
  2084. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
  2085. die();
  2086. }
  2087. if ( mysql_result( $res, 0, 0 ) == 1 )
  2088. return showInfoMessage( 'Вы не можете добавить сообщение - тема заблокирована.',
  2089. 'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2090.  
  2091. $message = '';
  2092. $html = '';
  2093.  
  2094. if ( isset( $_SESSION['viewMessage'] ) and !empty( $_SESSION['viewMessage'] ) ) {
  2095. $view = file_get_contents( './templates/previewMessage.html' );
  2096. $view = str_replace( '{message}', print_page( $_SESSION['viewMessage'] ), $view );
  2097. $html = $html.$view."\n";
  2098. $message = htmlspecialchars( $_SESSION['viewMessage'] );
  2099. unset( $_SESSION['viewMessage'] );
  2100. }
  2101.  
  2102. // Если при заполнении формы были допущены ошибки
  2103. if ( isset( $_SESSION['addPostForm'] ) ) {
  2104. $info = file_get_contents( './templates/infoMessage.html' );
  2105. $info = str_replace( '{infoMessage}', $_SESSION['addPostForm']['error'], $info );
  2106. $html = $html.$info."\n";
  2107. $message = htmlspecialchars( $_SESSION['addPostForm']['message'] );
  2108. unset( $_SESSION['addPostForm'] );
  2109. }
  2110.  
  2111. $tpl = file_get_contents( './templates/addPostForm.html' );
  2112. $action = $_SERVER['PHP_SELF'].'?action=addPost&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
  2113. $tpl = str_replace( '{action}', $action, $tpl );
  2114. $tpl = str_replace( '{message}', $message, $tpl );
  2115.  
  2116. $html = $html . $tpl;
  2117.  
  2118. return $html."\n";
  2119. }
  2120.  
  2121. // Функция добавляет новое сообщение(пост) (новую запись в таблицу БД TABLE_POSTS)
  2122. function addPost()
  2123. {
  2124.  
  2125. // Если не переданы данные формы - значит функция была вызвана по ошибке
  2126. if ( !isset( $_GET['idForum'] ) or
  2127. !isset( $_GET['id_theme'] ) or
  2128. !isset( $_POST['message'] ) or
  2129. !isset( $_FILES['attach'] )
  2130. )
  2131. {
  2132. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2133. die();
  2134. }
  2135.  
  2136. $id_theme = (int)$_GET['id_theme'];
  2137. if ( $id_theme < 1 ) {
  2138. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2139. die();
  2140. }
  2141.  
  2142. // Проверяем, не заблокирована ли тема?
  2143. $query = "SELECT locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  2144. $res = mysql_query( $query );
  2145. if ( !$res ) {
  2146. $msg = 'Ошибка при формировании формы для добавления нового сообщения';
  2147. $err = 'Ошибка при выполнении запроса: <br/>'.
  2148. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2149. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2150. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  2151. }
  2152. if ( mysql_num_rows( $res ) == 0 ) {
  2153. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
  2154. die();
  2155. }
  2156. if ( mysql_result( $res, 0, 0 ) == 1 )
  2157. return showInfoMessage( 'Вы не можете добавить сообщение - тема заблокирована.',
  2158. 'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2159.  
  2160. $msgLen = strlen( $_POST['message'] );
  2161.  
  2162. // Обрезаем сообщение (пост) до длины MAX_POST_LENGTH
  2163. $message = substr( $_POST['message'], 0, MAX_POST_LENGTH );
  2164. // Обрезаем лишние пробелы
  2165. $message = trim( $message );
  2166. // Если пользователь хочет посмотреть на сообщение перед отправкой
  2167. if ( isset( $_POST['viewMessage'] ) )
  2168. {
  2169. $_SESSION['viewMessage'] = $message;
  2170. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.
  2171. $_GET['idForum'].'&id_theme='.$id_theme );
  2172. die();
  2173. }
  2174.  
  2175. // Проверяем, правильно ли заполнены поля формы
  2176. $error = '';
  2177. if ( empty( $message ) ) $error = $error.'<li>не заполнено поле "Сообщение"</li>'."\n";
  2178. if ( $msgLen > MAX_POST_LENGTH )
  2179. $error = $error.'<li>длина сообщения больше '.MAX_POST_LENGTH.' символов</li>'."\n";
  2180. if ( !empty( $_FILES['attach']['name'] ) and $_FILES['attach']['size'] > MAX_FILE_SIZE )
  2181. $error = $error.'<li>размер файла вложения больше '.(MAX_FILE_SIZE/1024).' Кб</li>'."\n";
  2182.  
  2183. // Если были допущены ошибки при заполнении формы -
  2184. // перенаправляем пользователя для исправления ошибок
  2185. if ( !empty( $error ) )
  2186. {
  2187. $_SESSION['addPostForm'] = array();
  2188. $_SESSION['addPostForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'."\n".
  2189. '<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  2190. $_SESSION['addPostForm']['message'] = $message;
  2191. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.
  2192. $_GET['idForum'].'&id_theme='.$id_theme );
  2193. die();
  2194. }
  2195. $file = '';
  2196. if ( !empty( $_FILES['attach']['name'] ) ) {
  2197. // Массив недопустимых расширений файла вложения
  2198. $extentions = array('.php', '.phtml', '.php3', '.html', '.htm', '.pl');
  2199. // Извлекаем из имени файла расширение
  2200. $ext = strrchr( $_FILES['attach']['name'], "." );
  2201. // Формируем путь к файлу
  2202. if ( in_array( $ext, $extentions ) )
  2203. $file = $id_theme.'-'.date("YmdHis",time()).'.txt';
  2204. else
  2205. $file = $id_theme.'-'.date("YmdHis",time()).$ext;
  2206. // Перемещаем файл из временной директории сервера в директорию files
  2207. if ( move_uploaded_file ( $_FILES['attach']['tmp_name'], './files/'.$file ) )
  2208. chmod( './files/'.$file, 0644 );
  2209. }
  2210.  
  2211. if ( isset( $_SESSION['user'] ) ) {
  2212. $name = $_SESSION['user']['name'];
  2213. $id_user = $_SESSION['user']['id_author'];
  2214. } else {
  2215. $name = NOT_REGISTERED_USER;
  2216. $id_user = 0;
  2217. }
  2218.  
  2219. // Защита от того, чтобы один пользователь не добавил
  2220. // 100 сообщений за одну минуту
  2221. if ( isset( $_SESSION['unix_last_post'] ) and ( time()-$_SESSION['unix_last_post'] < 10 ) ) {
  2222. return showInfoMessage( 'Ваше сообщение уже было добавлено',
  2223. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2224. }
  2225.  
  2226. // Все поля заполнены правильно - выполняем запрос к БД
  2227. $query = "INSERT INTO ".TABLE_POSTS."
  2228. (
  2229. name,
  2230. putfile,
  2231. author,
  2232. id_author,
  2233. time,
  2234. id_theme
  2235. )
  2236. VALUES
  2237. (
  2238. '".mysql_real_escape_string( $message )."',
  2239. '".$file."',
  2240. '".mysql_real_escape_string( $name )."',
  2241. ".$id_user.",
  2242. NOW(),
  2243. ".$id_theme."
  2244. )";
  2245. $res = mysql_query( $query );
  2246. if ( !$res ) {
  2247. $msg = 'Ошибка при добавлении нового сообщения';
  2248. $err = 'Ошибка при выполнении запроса: <br/>'.
  2249. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2250. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2251. return showErrorMessage( $msg, $err, true,
  2252. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2253. }
  2254. $query = "UPDATE ".TABLE_THEMES."
  2255. SET
  2256. id_last_author=".$id_user.",
  2257. last_author='".mysql_real_escape_string( $name )."',
  2258. last_post=NOW()
  2259. WHERE id_theme=".$id_theme;
  2260. $res = mysql_query( $query );
  2261. if ( !$res ) {
  2262. $msg = 'Ошибка при добавлении нового сообщения';
  2263. $err = 'Ошибка при выполнении запроса: <br/>'.
  2264. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2265. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2266. return showErrorMessage( $msg, $err, true,
  2267. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2268. }
  2269.  
  2270. // Добавляем в массив $_SESSION время последнего сообщения;
  2271. // Это нужно для того, чтобы один пользователь не добавил
  2272. // 100 сообщений за одну минуту
  2273. $_SESSION['unix_last_post'] = time();
  2274.  
  2275. // Обновляем количество сообщений для зарегистрированного пользователя
  2276. if ( isset( $_SESSION['user'] ) ) {
  2277. $query = "UPDATE ".TABLE_USERS." SET posts=posts+1 WHERE id_author = ".$_SESSION['user']['id_author'];
  2278. $res = mysql_query( $query );
  2279. if ( !$res ) {
  2280. $msg = 'Ошибка при добавлении нового сообщения';
  2281. $err = 'Ошибка при выполнении запроса: <br/>'.
  2282. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2283. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2284. return showErrorMessage( $msg, $err, true,
  2285. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2286. }
  2287. }
  2288.  
  2289. return showInfoMessage( 'Ваше сообщение успешно добавлено',
  2290. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2291. }
  2292.  
  2293. // Функция добавляет новое сообщение(пост) (новую запись в таблицу БД TABLE_POSTS)
  2294. function quickReply()
  2295. {
  2296. // Если не переданы данные формы - значит функция была вызвана по ошибке
  2297. if ( !isset( $_GET['idForum'] ) or
  2298. !isset( $_GET['id_theme'] ) or
  2299. !isset( $_POST['message'] )
  2300. )
  2301. {
  2302. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2303. die();
  2304. }
  2305. $id_theme = (int)$_GET['id_theme'];
  2306. if ( $id_theme < 1 ) {
  2307. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2308. die();
  2309. }
  2310.  
  2311. // Проверяем, не заблокирована ли тема?
  2312. $query = "SELECT locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
  2313. $res = mysql_query( $query );
  2314. if ( !$res ) {
  2315. $msg = 'Ошибка при формировании формы для добавления нового сообщения';
  2316. $err = 'Ошибка при выполнении запроса: <br/>'.
  2317. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2318. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2319. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  2320. }
  2321. if ( mysql_num_rows( $res ) == 0 ) {
  2322. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
  2323. die();
  2324. }
  2325. if ( mysql_result( $res, 0, 0 ) == 1 )
  2326. return showInfoMessage( 'Вы не можете добавить сообщение - тема заблокирована.',
  2327. 'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2328.  
  2329. if ( isset( $_SESSION['user'] ) ) {
  2330. $name = $_SESSION['user']['name'];
  2331. $id_user = $_SESSION['user']['id_author'];
  2332. } else {
  2333. $name = NOT_REGISTERED_USER;
  2334. $id_user = 0;
  2335. }
  2336. // Обрезаем сообщение (пост) до длины MAX_POST_LENGTH
  2337. $message = substr( $_POST['message'], 0, MAX_POST_LENGTH );
  2338. // Обрезаем лишние пробелы
  2339. $message = trim( $message );
  2340.  
  2341. // Проверяем, правильно ли заполнены поля формы
  2342. if ( empty( $message ) )
  2343. return showInfoMessage( 'Не заполнено поле "Сообщение"',
  2344. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2345.  
  2346. // Защита от того, чтобы один пользователь не добавил
  2347. // 100 сообщений за одну минуту
  2348. if ( isset( $_SESSION['unix_last_post'] ) and ( time()-$_SESSION['unix_last_post'] < 10 ) ) {
  2349. return showInfoMessage( 'Ваше сообщение уже было добавлено несколькими секундами ранее',
  2350. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2351. }
  2352.  
  2353. // Все поля заполнены правильно - выполняем запрос к БД
  2354. $query = "INSERT INTO ".TABLE_POSTS."
  2355. (
  2356. name,
  2357. putfile,
  2358. author,
  2359. id_author,
  2360. time,
  2361. id_theme
  2362. )
  2363. VALUES
  2364. (
  2365. '".mysql_real_escape_string( $message )."',
  2366. '',
  2367. '".mysql_real_escape_string( $name )."',
  2368. ".$id_user.",
  2369. NOW(),
  2370. ".$id_theme."
  2371. )";
  2372. $res = mysql_query( $query );
  2373. if ( !$res ) {
  2374. $msg = 'Ошибка при добавлении нового сообщения';
  2375. $err = 'Ошибка при выполнении запроса: <br/>'.
  2376. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2377. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2378. return showErrorMessage( $msg, $err, true,
  2379. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2380. }
  2381. $query = "UPDATE ".TABLE_THEMES."
  2382. SET
  2383. id_last_author=".$id_user.",
  2384. last_author='".mysql_real_escape_string( $name )."',
  2385. last_post=NOW()
  2386. WHERE id_theme=".$id_theme;
  2387. $res = mysql_query( $query );
  2388. if ( !$res ) {
  2389. $msg = 'Ошибка при добавлении нового сообщения';
  2390. $err = 'Ошибка при выполнении запроса: <br/>'.
  2391. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2392. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2393. return showErrorMessage( $msg, $err, true,
  2394. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2395. }
  2396.  
  2397. // Добавляем в массив $_SESSION время последнего сообщения;
  2398. // Это нужно для того, чтобы один пользователь не добавил
  2399. // 100 сообщений за одну минуту
  2400. $_SESSION['unix_last_post'] = time();
  2401.  
  2402. // Обновляем количество сообщений для зарегистрированного пользователя
  2403. if ( isset( $_SESSION['user'] ) ) {
  2404. $query = "UPDATE ".TABLE_USERS." SET posts=posts+1 WHERE id_author = ".$_SESSION['user']['id_author'];
  2405. $res = mysql_query( $query );
  2406. if ( !$res ) {
  2407. $msg = 'Ошибка при добавлении нового сообщения';
  2408. $err = 'Ошибка при выполнении запроса: <br/>'.
  2409. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2410. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2411. return showErrorMessage( $msg, $err, true,
  2412. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2413. }
  2414. }
  2415.  
  2416. return showInfoMessage( 'Ваше сообщение успешно добавлено',
  2417. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2418. }
  2419.  
  2420. // Функция возвращает форму для редактирования сообщения(поста)
  2421. function getEditPostForm()
  2422. {
  2423. // Если не передан ID форума - значит функция была вызвана по ошибке
  2424. if ( !isset( $_GET['idForum'] ) ) {
  2425. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2426. die();
  2427. }
  2428. // Если не передан ID темы - значит функция была вызвана по ошибке
  2429. if ( !isset( $_GET['id_theme'] ) ) {
  2430. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2431. die();
  2432. }
  2433. $id_theme = (int)$_GET['id_theme'];
  2434. if ( $id_theme < 1 ) {
  2435. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2436. die();
  2437. }
  2438. // Если не передан ID сообщения - значит функция была вызвана по ошибке
  2439. if ( !isset( $_GET['id_post'] ) ) {
  2440. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2441. die();
  2442. }
  2443. $id_post = (int)$_GET['id_post'];
  2444. if ( $id_post < 1 ) {
  2445. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2446. die();
  2447. }
  2448.  
  2449. // Если сообщение пытается редактировать не зарегистрированный пользователь
  2450. if ( !isset( $_SESSION['user'] ) ) {
  2451. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2452. die();
  2453. }
  2454.  
  2455. // Получаем из БД сообщение
  2456. $query = "SELECT name, putfile, id_author, author, time, id_theme, locked
  2457. FROM ".TABLE_POSTS."
  2458. WHERE id_post=".$id_post;
  2459. $res = mysql_query( $query );
  2460. if ( !$res ) {
  2461. $msg = 'Ошибка при формировании формы для редактирования сообщения';
  2462. $err = 'Ошибка при выполнении запроса: <br/>'.
  2463. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2464. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2465. return showErrorMessage( $msg, $err, true, '' );
  2466. }
  2467. // Если сообщение не найдено - редирект на страницу темы
  2468. if ( mysql_num_rows( $res ) == 0 )
  2469. return showInfoMessage( 'Ошибка при формировании формы для редактирования сообщения',
  2470. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2471.  
  2472. $post = mysql_fetch_array( $res );
  2473. $id_theme = $post['id_theme'];
  2474.  
  2475. // Проверяем, имеет ли пользователь право редактировать это сообщение (пост)
  2476. if ( !hasRightEditPost( $post ) ) {
  2477. $msg = 'У вас нет прав для редактирования этого сообщения';
  2478. $queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
  2479. return showInfoMessage( $msg, $queryString );
  2480. }
  2481.  
  2482. $message = htmlspecialchars( $post['name'] );
  2483. $html = '';
  2484.  
  2485. if ( isset( $_SESSION['viewMessage'] ) and !empty( $_SESSION['viewMessage'] ) ) {
  2486. $view = file_get_contents( './templates/previewMessage.html' );
  2487. $view = str_replace( '{message}', print_page( $_SESSION['viewMessage'] ), $view );
  2488. $html = $html.$view."\n";
  2489. $message = htmlspecialchars( $_SESSION['viewMessage'] );
  2490. unset( $_SESSION['viewMessage'] );
  2491. }
  2492.  
  2493. // Если при заполнении формы были допущены ошибки
  2494. if ( isset( $_SESSION['editPostForm'] ) ) {
  2495. $html = $html . $_SESSION['editPostForm']['error'];
  2496. $message = htmlspecialchars( $_SESSION['editPostForm']['message'] );
  2497. unset( $_SESSION['editPostForm'] );
  2498. }
  2499.  
  2500. $tpl = file_get_contents( './templates/editPostForm.html' );
  2501.  
  2502. $action = $_SERVER['PHP_SELF'].'?action=updatePost&idForum='.
  2503. $_GET['idForum'].'&id_theme='.$id_theme.'&id_post='.$id_post;
  2504. $tpl = str_replace( '{action}', $action, $tpl );
  2505. $tpl = str_replace( '{message}', $message, $tpl );
  2506. // Если ранее был загружен файл - надо предоставить возможность удалить его
  2507. $unlinkfile = '';
  2508. if ( !empty( $post['putfile'] ) and is_file( './files/'.$post['putfile'] ) ) {
  2509. $unlinkfile = '<input type="checkbox" name="unlink" value="1" />&nbsp;Удалить загруженный ранее файл<br/>'."\n";
  2510. }
  2511. $tpl = str_replace( '{unlinkfile}', $unlinkfile, $tpl );
  2512. $html = $html . $tpl;
  2513.  
  2514. return $html."\n";
  2515. }
  2516.  
  2517. function updatePost()
  2518. {
  2519. // Если не переданы данные формы - значит функция была вызвана по ошибке
  2520. if ( !isset( $_GET['idForum'] ) or
  2521. !isset( $_GET['id_post'] ) or
  2522. !isset( $_POST['message'] ) or
  2523. !isset( $_FILES['attach'] )
  2524. )
  2525. {
  2526. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2527. die();
  2528. }
  2529.  
  2530. $id_post = (int)$_GET['id_post'];
  2531. if ( $id_post < 1 ) {
  2532. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2533. die();
  2534. }
  2535.  
  2536. // Проверяем, имеет ли пользователь право редактировать это сообщение (пост)
  2537. $query = "SELECT * FROM ".TABLE_POSTS." WHERE id_post=".$id_post;
  2538. $res = mysql_query( $query );
  2539. if ( !$res ) {
  2540. $msg = 'Ошибка при обновлении сообщения';
  2541. $err = 'Ошибка при выполнении запроса: <br/>'.
  2542. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2543. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2544. return showErrorMessage( $msg, $err, true, '' );
  2545. }
  2546. if ( mysql_num_rows( $res ) == 0 ) {
  2547. $msg = 'Ошибка при обновлении сообщения: сообщение не найдено';
  2548. return showInfoMessage( $msg, '' );
  2549. }
  2550. $post = mysql_fetch_array( $res );
  2551. $id_theme = $post['id_theme'];
  2552. if ( !hasRightEditPost( $post ) ) {
  2553. $msg = 'У вас нет прав для редактирования этого сообщения';
  2554. $queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
  2555. return showInfoMessage( $msg, $queryString );
  2556. }
  2557.  
  2558. // Обрезаем сообщение до длины MAX_POST_LENGTH
  2559. $message = substr( $_POST['message'], 0, MAX_POST_LENGTH );
  2560. // Обрезаем лишние пробелы
  2561. $message = trim( $message );
  2562.  
  2563. // Если пользователь хочет посмотреть на сообщение перед отправкой
  2564. if ( isset( $_POST['viewMessage'] ) )
  2565. {
  2566. $_SESSION['viewMessage'] = $message;
  2567. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editPostForm&idForum='.
  2568. $_GET['idForum'].'&id_theme='.$id_theme.'&id_post='.$id_post );
  2569. die();
  2570. }
  2571.  
  2572. // Проверяем, правильно ли заполнены поля формы
  2573. $error = '';
  2574. if ( empty( $message ) ) $error = $error.'<li>не заполнено поле "Сообщение"</li>'."\n";
  2575. if ( !empty( $_FILES['attach']['name'] ) and $_FILES['attach']['size'] > MAX_FILE_SIZE )
  2576. $error = $error.'<li>размер файла вложения больше '.(MAX_FILE_SIZE/1024).' Кб</li>'."\n";
  2577.  
  2578. // Если были допущены ошибки при заполнении формы -
  2579. // перенаправляем посетителя для исправления ошибок
  2580. if ( !empty( $error ) ) {
  2581. $_SESSION['editPostForm'] = array();
  2582. $_SESSION['editPostForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'."\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  2583. $_SESSION['editPostForm']['message'] = $message;
  2584. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editPostForm&idForum='.
  2585. $_GET['idForum'].'&id_theme='.$id_theme.'&id_post='.$id_post );
  2586. die();
  2587. }
  2588.  
  2589. $file = $post['putfile'];
  2590. // Такой ситуации быть не должно, но я случайтно удалил файл вложения
  2591. // вручную, и после этого нельзя было правильно загрузить файл
  2592. if ( !empty( $file ) and !is_file( './files/'.$post['putfile'] ) ) $file = '';
  2593. // Если выставлен флажок "Удалить загруженный ранее файл"
  2594. if ( isset( $_POST['unlink'] ) and !empty( $file ) and is_file( './files/'.$post['putfile'] ) ) {
  2595. if ( unlink( './files/'.$post['putfile'] ) ) $file = '';
  2596. }
  2597. if ( !empty( $_FILES['attach']['name'] ) ) {
  2598. // Если пользователь загружает новый файл - мы должны сперва удалить старый
  2599. // (при условии, что он вообще был загружен ранее)
  2600. if ( !empty( $file ) and is_file( './files/'.$post['putfile'] ) ) {
  2601. if ( unlink( './files/'.$post['putfile'] ) ) $file = '';
  2602. }
  2603. // Загружать новый файл мы будем только при условии, что был успешно
  2604. // удален ранее загруженный (или он не загружался вовсе)
  2605. if ( empty( $file ) ) {
  2606. // Массив недопустимых расширений файла вложения
  2607. $extentions = array('.php', '.phtml', '.php3', '.html', '.htm', '.pl');
  2608. // Извлекаем из имени файла расширение
  2609. $ext = strrchr( $_FILES['attach']['name'], "." );
  2610. // Формируем путь к файлу
  2611. if ( in_array( $ext, $extentions ) )
  2612. $new = $id_theme.'-'.date("YmdHis",time()).'.txt';
  2613. else
  2614. $new = $id_theme.'-'.date("YmdHis",time()).$ext;
  2615. // Перемещаем файл из временной директории сервера в директорию files
  2616. if ( move_uploaded_file ( $_FILES['attach']['tmp_name'], './files/'.$new ) ) {
  2617. chmod( './files/'.$new, 0644 );
  2618. $file = $new;
  2619. }
  2620. }
  2621. }
  2622.  
  2623. // Все поля заполнены правильно - выполняем запрос к БД
  2624. $query = "UPDATE ".TABLE_POSTS." SET
  2625. name='".mysql_real_escape_string( $message )."',
  2626. putfile='".$file."',
  2627. id_editor=".$_SESSION['user']['id_author'].",
  2628. edittime=NOW()
  2629. WHERE id_post=".$id_post;
  2630. $res = mysql_query( $query );
  2631. if ( !$res ) {
  2632. $msg = 'Ошибка при обновлении сообщения';
  2633. $err = 'Ошибка при выполнении запроса: <br/>'.
  2634. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2635. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2636. $queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
  2637. return showErrorMessage( $msg, $err, true, $queryString );
  2638. }
  2639.  
  2640. $msg = 'Cообщение успешно исправлено';
  2641. $queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
  2642. return showInfoMessage( $msg, $queryString );
  2643.  
  2644. }
  2645.  
  2646. // Функция удаляет сообщение (пост)
  2647. function deletePost()
  2648. {
  2649. // Если не передан ID форума - значит функция была вызвана по ошибке
  2650. if ( !isset( $_GET['idForum'] ) ) {
  2651. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2652. die();
  2653. }
  2654. // Если не прередан ID темы - значит функция вызвана по ошибке
  2655. if ( !isset( $_GET['id_theme'] ) ) {
  2656. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2657. die();
  2658. }
  2659. $id_theme = (int)$_GET['id_theme'];
  2660. if ( $id_theme < 1 ) {
  2661. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2662. die();
  2663. }
  2664. // Если не прередан ID сообщения (поста) - значит функция вызвана по ошибке
  2665. if ( !isset( $_GET['id_post'] ) ) {
  2666. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2667. die();
  2668. }
  2669. $id_post = (int)$_GET['id_post'];
  2670. if ( $id_post < 1 ) {
  2671. header( 'Location: '.$_SERVER['PHP_SELF'] );
  2672. die();
  2673. }
  2674.  
  2675. // Выдаем пользователю сообщение с просьбой подтвердить свое
  2676. // желание удалить сообщение (пост)
  2677. if ( !isset( $_GET['confirm'] ) ) {
  2678. $html = '<div align="center"><p>Вы действительно хотите удалить это сообщение?</p>'."\n";
  2679. $html = $html.'<input type="button" name="yes" value="Да"
  2680. onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=deletePost&idForum='.
  2681. $_GET['idForum'].'&id_theme='.$id_theme.'&id_post='.$id_post.
  2682. '&confirm=yes\'" />&nbsp;&nbsp;'."\n";
  2683. $html = $html.'<input type="button" name="no" value="Нет"
  2684. onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
  2685. $_GET['idForum'].'&id_theme='.$id_theme.'\'" /></div>'."\n";
  2686. $tpl = file_get_contents( './templates/infoMessage.html' );
  2687. $tpl = str_replace( '{infoMessage}', $html, $tpl );
  2688. return $tpl;
  2689. }
  2690.  
  2691. // Получаем из БД информацию об удаляемом сообщении - это нужно,
  2692. // чтобы узнать, имеет ли право пользователь удалить это сообщение
  2693. $query = "SELECT * FROM ".TABLE_POSTS." WHERE id_post=".$id_post;
  2694. $res = mysql_query( $query );
  2695. if ( !$res ) {
  2696. $msg = 'Ошибка при удалении сообщения';
  2697. $err = 'Ошибка при выполнении запроса: <br/>'.
  2698. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2699. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2700. return showErrorMessage( $msg, $err, true,
  2701. 'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2702. }
  2703. if ( mysql_num_rows( $res ) == 0 ) {
  2704. return showInfoMessage( 'Сообщение успешно удалено',
  2705. 'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2706. }
  2707. $post = mysql_fetch_array( $res );
  2708. if ( !hasRightDeletePost( $post ) ) {
  2709. return showInfoMessage( 'У вас нет прав, чтобы удалить это сообщение',
  2710. 'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
  2711. }
  2712.  
  2713. // Удаляем файл, если он есть
  2714. if ( !empty( $post['putfile'] ) and is_file( './files/'.$post['putfile'] ) )
  2715. unlink( './files/'.$post['putfile'] );
  2716. $query = "DELETE FROM ".TABLE_POSTS." WHERE id_post=".$id_post;
  2717. $res = mysql_query( $query );
  2718. if ( !$res ) {
  2719. $msg = 'Ошибка при удалении сообщения';
  2720. $err = 'Ошибка при выполнении запроса: <br/>'.
  2721. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2722. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2723. return showErrorMessage( $msg, $err, true,
  2724. 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$post['id_theme'] );
  2725. }
  2726. // Если это - единственное сообщение темы, то надо удалить и тему
  2727. $query = "SELECT COUNT(*) FROM ".TABLE_POSTS." WHERE id_theme=".$post['id_theme'];
  2728. $res = mysql_query( $query );
  2729. if ( !$res ) {
  2730. $msg = 'Ошибка при удалении сообщения';
  2731. $err = 'Ошибка при выполнении запроса: <br/>'.
  2732. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2733. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2734. return showErrorMessage( $msg, $err, true,
  2735. 'action=showForum&idForum='.$_GET['idForum'] );
  2736. }
  2737. if ( mysql_result( $res, 0, 0 ) == 0 ) {
  2738. // Прежде чем удалять тему, надо обновить таблицу TABLE_USERS
  2739. $query = "UPDATE ".TABLE_USERS."
  2740. SET themes=themes-1
  2741. WHERE id_author=(SELECT id_author FROM ".TABLE_THEMES." WHERE id_theme=".$post['id_theme'].")";
  2742. $res = mysql_query( $query );
  2743. if ( !$res ) {
  2744. $msg = 'Ошибка при удалении сообщения';
  2745. $err = 'Ошибка при выполнении запроса: <br/>'.
  2746. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2747. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2748. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  2749. }
  2750. $query = "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$post['id_theme'];
  2751. $res = mysql_query( $query );
  2752. if ( !$res ) {
  2753. $msg = 'Ошибка при удалении сообщения';
  2754. $err = 'Ошибка при выполнении запроса: <br/>'.
  2755. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2756. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2757. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
  2758. }
  2759. // Если мы удалили тему, то мы не можем в нее вернуться;
  2760. // поэтому редирект будет на страницу форума, а не страницу темы
  2761. $deleteTheme = true;
  2762. }
  2763.  
  2764. // Обновляем количество сообщений, оставленных автором сообщения ...
  2765. $query = "UPDATE ".TABLE_USERS." SET posts=posts-1 WHERE id_author=".$post['id_author'];
  2766. $res = mysql_query( $query );
  2767. if ( !$res ) {
  2768. $msg = 'Ошибка при удалении сообщения';
  2769. $err = 'Ошибка при выполнении запроса: <br/>'.
  2770. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2771. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2772. return showErrorMessage( $msg, $err, true,
  2773. 'action=showForum&idForum='.$_GET['idForum'] );
  2774. }
  2775. // ... и таблицу TABLE_THEMES
  2776. if ( !isset( $deleteTheme ) ) {
  2777. $query = "SELECT id_author, author, time
  2778. FROM ".TABLE_POSTS."
  2779. WHERE id_theme=".$post['id_theme']."
  2780. ORDER BY id_post DESC
  2781. LIMIT 1";
  2782. $res = mysql_query( $query );
  2783. if ( !$res ) {
  2784. $msg = 'Ошибка при удалении сообщения';
  2785. $err = 'Ошибка при выполнении запроса: <br/>'.
  2786. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2787. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2788. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.
  2789. $_GET['idForum'].'&id_theme='.$post['id_theme'] );
  2790. }
  2791. list( $id_last_author, $last_author, $last_post ) = mysql_fetch_row( $res );
  2792. $query = "UPDATE ".TABLE_THEMES."
  2793. SET id_last_author=".$id_last_author.", last_author='".$last_author."', last_post='".$last_post."'
  2794. WHERE id_theme=".$post['id_theme'];
  2795. $res = mysql_query( $query );
  2796. if ( !$res ) {
  2797. $msg = 'Ошибка при удалении сообщения';
  2798. $err = 'Ошибка при выполнении запроса: <br/>'.
  2799. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2800. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2801. return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.
  2802. $_GET['idForum'].'&id_theme='.$post['id_theme'] );
  2803. }
  2804. }
  2805.  
  2806. if ( isset( $deleteTheme ) ) {
  2807. return showInfoMessage( 'Сообщение успешно удалено', 'action=showForum&idForum='.$_GET['idForum'] );
  2808. } else {
  2809. return showInfoMessage( 'Сообщение успешно удалено', 'action=showTheme&idForum='.
  2810. $_GET['idForum'].'&id_theme='.$post['id_theme'] );
  2811. }
  2812. }
  2813.  
  2814. // Функция возвращает форму для регистрации нового пользователя на форуме
  2815. function getAddNewUserForm()
  2816. {
  2817. if ( isset( $_SESSION['captcha_keystring'] ) ) unset( $_SESSION['captcha_keystring'] );
  2818. $html = '';
  2819. // Если при заполнении формы были допущены ошибки
  2820. if ( isset( $_SESSION['addNewUserForm'] ) ) {
  2821. $info = file_get_contents( './templates/infoMessage.html' );
  2822. $info = str_replace( '{infoMessage}', $_SESSION['addNewUserForm']['error'], $info );
  2823. $html = $html.$info."\n";
  2824. $name = htmlspecialchars( $_SESSION['addNewUserForm']['name'] );
  2825. $email = htmlspecialchars( $_SESSION['addNewUserForm']['email'] );
  2826. $timezone = $_SESSION['addNewUserForm']['timezone'];
  2827. $icq = htmlspecialchars( $_SESSION['addNewUserForm']['icq'] );
  2828. $url = htmlspecialchars( $_SESSION['addNewUserForm']['url'] );
  2829. $about = htmlspecialchars( $_SESSION['addNewUserForm']['about'] );
  2830. $signature = htmlspecialchars( $_SESSION['addNewUserForm']['signature'] );
  2831. unset( $_SESSION['addNewUserForm'] );
  2832. } else {
  2833. $name = '';
  2834. $email = '';
  2835. $timezone = 0;
  2836. $icq = '';
  2837. $url = '';
  2838. $about = '';
  2839. $signature = '';
  2840. }
  2841.  
  2842. // Считываем в переменную файл шаблона, содержащего
  2843. // форму для добавления нового пользователя
  2844. $tpl = file_get_contents( './templates/addNewUserForm.html' );
  2845. $action = $_SERVER['PHP_SELF'].'?action=addNewUser';
  2846. $tpl = str_replace( '{action}', $action, $tpl);
  2847. $tpl = str_replace( '{name}', $name, $tpl);
  2848. $tpl = str_replace( '{email}', $email, $tpl);
  2849. $tpl = str_replace( '{icq}', $icq, $tpl);
  2850. $tpl = str_replace( '{url}', $url, $tpl);
  2851. $tpl = str_replace( '{about}', $about, $tpl);
  2852. $tpl = str_replace( '{signature}', $signature, $tpl);
  2853. $kcaptcha = './kcaptcha/kc.php?'.session_name().'='.session_id();
  2854. $tpl = str_replace( '{kcaptcha}', $kcaptcha, $tpl);
  2855. $tpl = str_replace( '{keystring}', '', $tpl);
  2856.  
  2857. $options = '';
  2858. for ( $i = -12; $i <= 12; $i++ ) {
  2859. if ( $i < 1 )
  2860. $value = $i.' часов';
  2861. else
  2862. $value = '+'.$i.' часов';
  2863. if ( $i == $timezone )
  2864. $options = $options . '<option value="'.$i.'" selected>'.$value.'</option>'."\n";
  2865. else
  2866. $options = $options . '<option value="'.$i.'">'.$value.'</option>'."\n";
  2867. }
  2868. $tpl = str_replace( '{options}', $options, $tpl);
  2869. $tpl = str_replace( '{servertime}', date( "d.m.Y H:i:s" ), $tpl );
  2870.  
  2871. $html = $html . $tpl;
  2872. return $html;
  2873. }
  2874.  
  2875. // Функция добавляет нового пользователя форума (запись в таблице БД TABLE_USERS)
  2876. function addNewUser()
  2877. {
  2878.  
  2879. // Если не переданы данные формы - значит функция была вызвана по ошибке
  2880. if ( !isset( $_POST['name'] ) or
  2881. !isset( $_POST['password'] ) or
  2882. !isset( $_POST['confirm'] ) or
  2883. !isset( $_POST['email'] ) or
  2884. !isset( $_POST['timezone'] ) or
  2885. !isset( $_POST['icq'] ) or
  2886. !isset( $_POST['url'] ) or
  2887. !isset( $_POST['about'] ) or
  2888. !isset( $_POST['signature'] ) or
  2889. !isset( $_POST['keystring'] ) or
  2890. !isset( $_FILES['avatar'] )
  2891. )
  2892. {
  2893. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addNewUserForm' );
  2894. die();
  2895. }
  2896.  
  2897. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  2898. $name = substr( $_POST['name'], 0, 30 );
  2899. $password = substr( $_POST['password'], 0, 30 );
  2900. $confirm = substr( $_POST['confirm'], 0, 30 );
  2901. $email = substr( $_POST['email'], 0, 60 );
  2902. $icq = substr( $_POST['icq'], 0, 12 );
  2903. $url = substr( $_POST['url'], 0, 60 );
  2904. $about = substr( $_POST['about'], 0, 1000 );
  2905. $signature = substr( $_POST['signature'], 0, 500 );
  2906. $keystring = substr( $_POST['keystring'], 0, 6 );
  2907.  
  2908. // Обрезаем лишние пробелы
  2909. $name = trim( $name );
  2910. $password = trim( $password );
  2911. $confirm = trim( $confirm );
  2912. $email = trim( $email );
  2913. $icq = trim( $icq );
  2914. $url = trim( $url );
  2915. $about = trim( $about );
  2916. $signature = trim( $signature );
  2917. $keystring = trim( $keystring );
  2918.  
  2919. // Проверяем, заполнены ли обязательные поля
  2920. $error = '';
  2921. if ( empty( $name ) ) $error = $error.'<li>не заполнено поле "Имя"</li>'."\n";
  2922. if ( empty( $password ) ) $error = $error.'<li>не заполнено поле "Пароль"</li>'."\n";
  2923. if ( empty( $confirm ) ) $error = $error.'<li>не заполнено поле "Подтвердите пароль"</li>'."\n";
  2924. if ( empty( $email ) ) $error = $error.'<li>не заполнено поле "Адрес e-mail"</li>'."\n";
  2925. if ( empty( $keystring ) ) $error = $error.'<li>не заполнено поле "Код"</li>'."\n";
  2926. // Проверяем, не слишком ли короткий пароль
  2927. if ( !empty( $password ) and strlen( $password ) < MIN_PASSWORD_LENGTH )
  2928. $error = $error.'<li>длина пароля должна быть не меньше '.MIN_PASSWORD_LENGTH.' символов</li>'."\n";
  2929. // Проверяем, совпадают ли пароли
  2930. if ( !empty( $password ) and !empty( $confirm ) and $password != $confirm )
  2931. $error = $error.'<li>не совпадают пароли</li>'."\n";
  2932. // Проверяем поле "код"
  2933. if ( !empty( $keystring ) ) {
  2934. // Проверяем поле "код" на недопустимые символы
  2935. if ( !ereg( "[23456789abcdeghkmnpqsuvxyz]+", $keystring ) )
  2936. $error = $error.'<li>поле "Код" содержит недопустимые символы</li>'."\n";
  2937. // Проверяем, совпадает ли код с картинки
  2938. if ( !isset( $_SESSION['captcha_keystring'] ) or $_SESSION['captcha_keystring'] != $keystring )
  2939. $error = $error.'<li>не совпадает код с картинки</li>'."\n";
  2940. }
  2941. unset( $_SESSION['captcha_keystring'] );
  2942.  
  2943. // Проверяем поля формы на недопустимые символы
  2944. if ( !empty( $name ) and !preg_match( "#^[А-Яа-яЁё]+$#i", $name ) )
  2945. $error = $error.'<li>поле "Имя" содержит недопустимые символы</li>'."\n";
  2946. if ( !empty( $password ) and !preg_match( "#^[-_0-9a-z]+$#i", $password ) )
  2947. $error = $error.'<li>поле "Пароль" содержит недопустимые символы</li>'."\n";
  2948. if ( !empty( $confirm ) and !preg_match( "#^[-_0-9a-z]+$#i", $confirm ) )
  2949. $error = $error.'<li>поле "Подтвердите пароль" содержит недопустимые символы</li>'."\n";
  2950. if ( !empty( $icq ) and !preg_match( "#^[0-9]+$#", $icq ) )
  2951. $error = $error.'<li>поле "ICQ" содержит недопустимые символы</li>'."\n";
  2952. if ( !empty( $about ) and !preg_match( "#^[-\[\].;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $about ) )
  2953. $error = $error.'<li>поле "Интересы" содержит недопустимые символы</li>'."\n";
  2954. if ( !empty( $signature ) and !preg_match( "#^[-\[\].;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $signature ) )
  2955. $error = $error.'<li>поле "Подпись" содержит недопустимые символы</li>'."\n";
  2956.  
  2957. // Проверяем корректность e-mail
  2958. if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
  2959. $error = $error.'<li>поле "Адрес e-mail" должно соответствовать формату somebody@somewhere.ru</li>'."\n";
  2960.  
  2961. // Проверяем корректность URL домашней странички
  2962. if ( !empty( $url ) and !preg_match( "#^(http:\/\/)?(www.)?[-0-9a-z]+\.[a-z]{2,6}\/?$#i", $url ) )
  2963. $error = $error.'<li>поле "Домашняя страничка" должно соответствовать формату http://www.homepage.ru</li>'."\n";
  2964.  
  2965. // Выясняем не зарегистрировано ли уже это имя
  2966. // Возможно три ситуации, которые необходимо предотвратить:
  2967. // 1. Вводится ник, полностью совпадающий с уже существующим
  2968. // 2. Вводится уже существующий кирилический ник, в котором
  2969. // одна или несколько букв заменены на латинские
  2970. // 3. Вводится уже существующий латинский ник, в котором
  2971. // одна или несколько букв заменениы на кирилические
  2972.  
  2973. // Массив кирилических букв
  2974. $rus = array( "А","а","В","Е","е","К","М","Н","О","о","Р","р","С","с","Т","Х","х" );
  2975. // Массив латинских букв
  2976. $eng = array( "A","a","B","E","e","K","M","H","O","o","P","p","C","c","T","X","x" );
  2977. $new_name = preg_replace( "#[А-Яа-яЁё]#i", "", $name );
  2978. // Заменяем русские буквы латинскими
  2979. $eng_new_name = str_replace( $rus, $eng, $new_name );
  2980. // Заменяем латинские буквы русскими
  2981. $rus_new_name = str_replace( $eng, $rus, $new_name );
  2982. // Формируем SQL-запрос
  2983. $query = "SELECT * FROM ".TABLE_USERS."
  2984. WHERE name LIKE '".mysql_real_escape_string( $new_name )."' OR
  2985. name LIKE '".mysql_real_escape_string( $eng_new_name )."' OR
  2986. name LIKE '".mysql_real_escape_string( $rus_new_name )."';";
  2987. $res = mysql_query( $query );
  2988.  
  2989. if ( !$res ) {
  2990. $msg = 'Ошибка при регистрации нового пользователя';
  2991. $err = 'Ошибка при выполнении запроса: <br/>'.
  2992. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  2993. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  2994. return showErrorMessage( $msg, $err, true, '' );
  2995. }
  2996.  
  2997. if ( mysql_num_rows( $res ) > 0 )
  2998. $error = $error.'<li>имя "'.$new_name.'" уже зарегистрировано</li>'."\n";
  2999.  
  3000. if ( !empty( $_FILES['avatar']['name'] ) ) {
  3001. $ext = strrchr( $_FILES['avatar']['name'], "." );
  3002. $extensions = array( ".jpg", ".gif", ".bmp", ".png" );
  3003. if ( !in_array( $ext, $extensions ) )
  3004. $error = $error.'<li>недопустимый формат файла аватара</li>'."\n";
  3005. if ( $_FILES['avatar']['size'] > MAX_AVATAR_SIZE )
  3006. $error = $error.'<li>размер файла аватора больше '.(MAX_AVATAR_SIZE/1024).' Кб</li>'."\n";
  3007. }
  3008.  
  3009. $timezone = (int)$_POST['timezone'];
  3010. if ( $timezone < -12 or $timezone > 12 ) $timezone = 0;
  3011.  
  3012. // Если были допущены ошибки при заполнении формы - перенаправляем посетителя на страницу регистрации
  3013. if ( !empty( $error ) ) {
  3014. $_SESSION['addNewUserForm'] = array();
  3015. $_SESSION['addNewUserForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  3016. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  3017. $_SESSION['addNewUserForm']['name'] = $name;
  3018. $_SESSION['addNewUserForm']['email'] = $email;
  3019. $_SESSION['addNewUserForm']['timezone'] = $timezone;
  3020. $_SESSION['addNewUserForm']['icq'] = $icq;
  3021. $_SESSION['addNewUserForm']['url'] = $url;
  3022. $_SESSION['addNewUserForm']['about'] = $about;
  3023. $_SESSION['addNewUserForm']['signature'] = $signature;
  3024. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addNewUserForm' );
  3025. die();
  3026. }
  3027.  
  3028. if ( !empty( $url ) and substr($url, 0, 7) != 'http://' ) $url = 'http://'.$url;
  3029.  
  3030. // Уникальный код для активации учетной записи
  3031. $code = md5( uniqid( rand(), 1 ) );
  3032. // Все поля заполнены правильно - продолжаем регистрацию
  3033. $query = "INSERT INTO ".TABLE_USERS."
  3034. (
  3035. name,
  3036. passw,
  3037. email,
  3038. timezone,
  3039. url,
  3040. icq,
  3041. about,
  3042. signature,
  3043. photo,
  3044. puttime,
  3045. last_visit,
  3046. themes,
  3047. status,
  3048. activation
  3049. )
  3050. VALUES
  3051. (
  3052. '".mysql_real_escape_string( $name )."',
  3053. '".mysql_real_escape_string( md5( $password ) )."',
  3054. '".mysql_real_escape_string( $email )."',
  3055. ".$timezone.",
  3056. '".mysql_real_escape_string( $url )."',
  3057. '".$icq."',
  3058. '".mysql_real_escape_string( $about )."',
  3059. '".mysql_real_escape_string( $signature )."',
  3060. '',
  3061. NOW(),
  3062. NOW(),
  3063. 0,
  3064. 'user',
  3065. '".$code."'
  3066. );";
  3067. $res = mysql_query( $query );
  3068. if ( !$res ) {
  3069. $msg = 'Ошибка при регистрации нового пользователя';
  3070. $err = 'Ошибка при выполнении запроса: <br/>'.
  3071. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3072. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3073. return showErrorMessage( $msg, $err, true, '' );
  3074. }
  3075.  
  3076. $id = mysql_insert_id();
  3077. if ( !empty( $_FILES['avatar']['name'] ) and
  3078. move_uploaded_file ( $_FILES['avatar']['tmp_name'], './photo/'.$id ) ) chmod( './photo/'.$id, 0644 );
  3079.  
  3080. // Посылаем письмо пользователю с просьбой активировать учетную запись
  3081. $headers = "From: ".$_SERVER['SERVER_NAME']." <".ADMIN_EMAIL.">\n";
  3082. $headers = $headers."Content-type: text/html; charset=\"windows-1251\"\n";
  3083. $headers = $headers."Return-path: <".ADMIN_EMAIL.">\n";
  3084. $message = '<p>Добро пожаловать на форум '.$_SERVER['SERVER_NAME'].'!</p>'."\n";
  3085. $message = $message.'<p>Пожалуйста сохраните это сообщение. Параметры вашей учётной записи таковы:</p>'."\n";
  3086. $message = $message.'<p>Логин: '.$name.'<br/>Пароль: '.$password.'</p>'."\n";
  3087. $message = $message.'<p>Для активации вашей учетной записи перейдите по ссылке:</p>'."\n";
  3088. $link = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'].'?action=activateUser&code='.$code;
  3089. $message = $message.'<p><a href="'.$link.'">Активировать учетную запись</a></p>'."\n";
  3090. $message = $message.'<p>Не забывайте свой пароль: он хранится в нашей базе в зашифрованном
  3091. виде, и мы не сможем вам его выслать. Если вы всё же забудете пароль, то сможете
  3092. запросить новый, который придётся активировать таким же образом, как и вашу
  3093. учётную запись.</p>'."\n";
  3094. $message = $message.'<p>Спасибо за то, что зарегистрировались на нашем форуме.</p>'."\n";
  3095. $subject = 'Регистрация на форуме '.$_SERVER['SERVER_NAME'];
  3096. $subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject, "w","k")).'?=';
  3097. mail( $email, $subject, $message, $headers );
  3098.  
  3099. $msg = 'На Ваш e-mail выслано письмо с просьбой подтвердить регистрацию.
  3100. Чтобы завершить регистрацию и активировать учетную запись, зайдите
  3101. по адресу, указанному в письме.';
  3102. $html = file_get_contents( './templates/infoMessage.html' );
  3103. $html = str_replace( '{infoMessage}', $msg, $html );
  3104. return $html;
  3105. }
  3106.  
  3107. // Активация учетной записи нового пользователя
  3108. function activateUser()
  3109. {
  3110. // Если не передан параметр $code - значит функция вызвана по ошибке
  3111. if ( !isset( $_GET['code'] ) ) {
  3112. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3113. die();
  3114. }
  3115. // Т.к. код зашифрован с помощью md5, то он представляет собой
  3116. // 32-значное шестнадцатеричное число
  3117. $code = substr( $_GET['code'], 0, 32 );
  3118. $code = preg_replace( "#[^0-9a-f]#i", '', $code );
  3119.  
  3120. $query = "SELECT id_author
  3121. FROM ".TABLE_USERS."
  3122. WHERE activation='".mysql_real_escape_string( $code )."' LIMIT 1";
  3123. $res = mysql_query( $query );
  3124. if ( !$res ) {
  3125. $msg = 'Ошибка при активации учетной записи. Обратитесь к администратору.';
  3126. $err = 'Ошибка при выполнении запроса: <br/>'.
  3127. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3128. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3129. return showErrorMessage( $msg, $err, true, '' );
  3130. }
  3131. if ( mysql_num_rows( $res ) > 0 ) {
  3132. $id = mysql_result( $res, 0, 0 );
  3133. $query = "UPDATE ".TABLE_USERS."
  3134. SET activation='', last_visit=NOW()
  3135. WHERE id_author=".$id;
  3136. $res = mysql_query( $query );
  3137. if ( !$res ) {
  3138. $msg = 'Ошибка при активации учетной записи. Обратитесь к администратору.';
  3139. $err = 'Ошибка при выполнении запроса: <br/>'.
  3140. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3141. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3142. return showErrorMessage( $msg, $err, true, '' );
  3143. }
  3144. }
  3145. return showInfoMessage( 'Ваша учетная запись активирована.', 'action=loginForum' );
  3146. }
  3147.  
  3148. // Если пользователь забыл свой пароль, он может получить новый,
  3149. // заполнив эту форму (свой логин и e-mail)
  3150. function newPasswordForm()
  3151. {
  3152. $html = '';
  3153. if ( isset( $_SESSION['newPasswordForm']['error'] ) ) {
  3154. $info = file_get_contents( './templates/infoMessage.html' );
  3155. $info = str_replace( '{infoMessage}', $_SESSION['newPasswordForm']['error'], $info );
  3156. $html = $html.$info."\n";
  3157. unset( $_SESSION['newPasswordForm']['error'] );
  3158. }
  3159. $action = $_SERVER['PHP_SELF'].'?action=sendNewPassword';
  3160. $tpl = file_get_contents( './templates/newPasswordForm.html' );
  3161. $tpl = str_replace( '{action}', $action, $tpl );
  3162. $html = $html . $tpl;
  3163. return $html;
  3164. }
  3165.  
  3166. // Функция высылает на e-mail пользователя новый пароль
  3167. function sendNewPassword()
  3168. {
  3169.  
  3170. // Если не переданы методом POST логин и e-mail - перенаправляем пользователя
  3171. if ( !isset( $_POST['username'] ) or
  3172. !isset( $_POST['email'] )
  3173. )
  3174. {
  3175. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3176. die();
  3177. }
  3178.  
  3179. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  3180. $name = substr( $_POST['username'], 0, 30 );
  3181. $email = substr( $_POST['email'], 0, 60 );
  3182.  
  3183. // Обрезаем лишние пробелы
  3184. $name = trim( $name );
  3185. $email = trim( $email );
  3186.  
  3187. // Проверяем, заполнены ли обязательные поля
  3188. $error = "";
  3189. if ( empty( $name ) ) $error = $error.'<li>не заполнено поле "Имя"</li>'."\n";
  3190. if ( empty( $email ) ) $error = $error.'<li>не заполнено поле "Адрес e-mail"</li>'."\n";
  3191.  
  3192. // Проверяем поля формы на недопустимые символы
  3193. if ( !empty( $name ) and !ereg( "[-_[:blank:]0-9a-zA-Zа-яА-Я]+", $name ) )
  3194. $error = $error.'<li>поле "Имя" содержит недопустимые символы</li>'."\n";
  3195. // Проверяем корректность e-mail
  3196. if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
  3197. $error = $error.'<li>поле "Адрес e-mail" должно соответствовать формату somebody@somewhere.ru</li>'."\n";
  3198. // Проверять существование такого пользователя есть смысл только в том
  3199. // случае, если поля не пустые и не содержат недопустимых символов
  3200. if ( empty( $error ) ) {
  3201. $query = "SELECT id_author FROM ".TABLE_USERS."
  3202. WHERE name='".mysql_real_escape_string( $name )."'
  3203. AND email='".mysql_real_escape_string( $email )."'";
  3204. $res = mysql_query( $query );
  3205. if ( !$res ) {
  3206. $msg = 'Ошибка при создании нового пароля.';
  3207. $err = 'Ошибка при выполнении запроса: <br/>'.
  3208. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3209. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3210. return showErrorMessage( $msg, $err, true, 'action=newPasswordForm' );
  3211. }
  3212.  
  3213. // Если пользователь с таким логином и e-mail существует
  3214. if ( mysql_num_rows( $res ) > 0 ) {
  3215. // Небольшой код, который читает содержимое директории activate
  3216. // и удаляет старые файлы для активации пароля (были созданы более суток назад)
  3217. if ( $dir = opendir( './activate' ) ) {
  3218. chdir( './activate' );
  3219. $tmp = 24*60*60;
  3220. while ( false !== ( $file = readdir($dir) ) ) {
  3221. if ( is_file( $file ) )
  3222. if ( ( time() - filemtime( $file ) ) > $tmp ) unlink( $file );
  3223. }
  3224. chdir( '..' );
  3225. closedir( $dir );
  3226. }
  3227. // Как происходит процедура восстановления пароля? Пользователь ввел свой логин
  3228. // и e-mail, мы проверяем существование такого пользователя в таблице БД. Потом
  3229. // генерируем с помощью функции getNewPassword() новый пароль, создаем файл с именем
  3230. // md5( $newPassword ) в директории activate. Файл содержит ID пользователя.
  3231. // В качестве кода активации выступает хэш пароля - md5( $newPassword ).
  3232. // Когда пользователь перейдет по ссылке в письме для активации своего нового пароля,
  3233. // мы проверяем наличие в директории activatePassword файла с именем кода активации,
  3234. // и если он существует, активируем новый пароль.
  3235. $id = mysql_result( $res, 0, 0 );
  3236. $newPassword = getNewPassword();
  3237. $code = md5( $newPassword );
  3238. // file_put_contents( './activate/'.$code, $id );
  3239. $fp = fopen( './activate/'.$code, "w" );
  3240. fwrite($fp, $id);
  3241. fclose($fp);
  3242. // Посылаем письмо пользователю с просьбой активировать пароль
  3243. $headers = "From: ".$_SERVER['SERVER_NAME']." <".ADMIN_EMAIL.">\n";
  3244. $headers = $headers."Content-type: text/html; charset=\"windows-1251\"\n";
  3245. $headers = $headers."Return-path: <".ADMIN_EMAIL.">\n";
  3246. $message = '<p>Добрый день, '.$name.'!</p>'."\n";
  3247. $message = $message.'<p>Вы получили это письмо потому, что вы (либо кто-то, выдающий себя
  3248. за вас) попросили выслать новый пароль к вашей учётной записи на форуме '.
  3249. $_SERVER['SERVER_NAME'].'. Если вы не просили выслать пароль, то не обращайте
  3250. внимания на это письмо, если же подобные письма будут продолжать приходить,
  3251. обратитесь к администратору форума</p>'."\n";
  3252. $message = $message.'<p>Прежде чем использовать новый пароль, вы должны его активировать.
  3253. Для этого перейдите по ссылке:</p>'."\n";
  3254. $link = 'http://'.$_SERVER['SERVER_NAME'].$_SERVER['PHP_SELF'].
  3255. '?action=activatePassword&code='.$code;
  3256. $message = $message.'<p><a href="'.$link.'">Активировать пароль</a></p>'."\n";
  3257. $message = $message.'<p>В случае успешной активации вы сможете входить в систему, используя
  3258. следующий пароль: '.$newPassword.'</p>'."\n";
  3259. $message = $message.'<p>Вы сможете сменить этот пароль на странице редактирования профиля.
  3260. Если у вас возникнут какие-то трудности, обратитесь к администратору форума.</p>'."\n";
  3261. $subject = 'Активация пароля на форуме '.$_SERVER['SERVER_NAME'];
  3262. $subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject, "w","k")).'?=';
  3263. mail( $email, $subject, $message, $headers );
  3264.  
  3265. $msg = 'На ваш e-mail выслано письмо. Чтобы активировать новый пароль, зайдите
  3266. по адресу, указанному в письме.';
  3267. $html = file_get_contents( './templates/infoMessage.html' );
  3268. $html = str_replace( '{infoMessage}', $msg, $html );
  3269.  
  3270. return $html;
  3271. } else {
  3272. $error = $error.'<li>неправильный логин или e-mail</li>'."\n";
  3273. }
  3274. }
  3275.  
  3276. // Если были допущены ошибки при заполнении формы - перенаправляем посетителя
  3277. if ( !empty( $error ) ) {
  3278. $_SESSION['newPasswordForm'] = array();
  3279. $_SESSION['newPasswordForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены
  3280. ошибки:</p>'."\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  3281. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=newPasswordForm' );
  3282. die();
  3283. }
  3284.  
  3285. }
  3286.  
  3287. // Активация нового пароля
  3288. function activatePassword()
  3289. {
  3290. if ( !isset( $_GET['code'] ) ) {
  3291. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3292. die();
  3293. }
  3294. // Т.к. код активации создан с помощью md5, то он
  3295. // представляет собой 32-значное шестнадцатеричное число
  3296. $code = substr( $_GET['code'], 0, 32 );
  3297. $code = preg_replace( "#[^0-9a-f]#i", '', $code );
  3298. if ( is_file( './activate/'.$code ) and ( ( time() - filemtime('./activate/'.$code) ) < 24*60*60 ) ) {
  3299. $file = file( './activate/'.$code );
  3300. unlink( './activate/'.$code );
  3301. $id_user = (int)trim( $file[0] );
  3302. $query = "UPDATE ".TABLE_USERS."
  3303. SET passw='".mysql_real_escape_string( $code )."'
  3304. WHERE id_author=".$id_user;
  3305. $res = mysql_query( $query );
  3306. if ( !$res ) {
  3307. $msg = 'Ошибка при активации нового пароля. Обратитесь к администратору.';
  3308. $err = 'Ошибка при выполнении запроса: <br/>'.
  3309. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3310. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3311. return showErrorMessage( $msg, $err, true, 'action=newPasswordForm' );
  3312. }
  3313. $message = 'Ваш новый пароль успешно активирован.';
  3314. } else {
  3315. $message = 'Ошибка при активации нового пароля. Обратитесь к администратору.';
  3316. }
  3317.  
  3318. $html = file_get_contents( './templates/infoMessage.html' );
  3319. $html = str_replace( '{infoMessage}', $message, $html );
  3320. return $html;
  3321. }
  3322.  
  3323. // Функция возвращает случайно сгенерированный пароль
  3324. function getNewPassword()
  3325. {
  3326. $length = rand( 10, 30 );
  3327. $password = '';
  3328. for( $i = 0; $i < $length; $i++ ) {
  3329. $range = rand(1, 3);
  3330. switch( $range ) {
  3331. case 1: $password = $password.chr( rand(48, 57) ); break;
  3332. case 2: $password = $password.chr( rand(65, 90) ); break;
  3333. case 3: $password = $password.chr( rand(97, 122) ); break;
  3334. }
  3335. }
  3336. return $password;
  3337. }
  3338.  
  3339. // Функция возвращает html формы для редактирования данных о пользователе
  3340. function getEditUserForm()
  3341. {
  3342. // Если информацию о пользователе пытается редактировать
  3343. // не зарегистрированный пользователь
  3344. if ( !isset( $_SESSION['user'] ) ) {
  3345. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3346. die();
  3347. }
  3348.  
  3349. $html = '';
  3350.  
  3351. // Если при заполнении формы были допущены ошибки
  3352. if ( isset( $_SESSION['editUserForm'] ) ) {
  3353. $info = file_get_contents( './templates/infoMessage.html' );
  3354. $info = str_replace( '{infoMessage}', $_SESSION['editUserForm']['error'], $info );
  3355. $html = $html.$info."\n";
  3356. $email = htmlspecialchars( $_SESSION['editUserForm']['email'] );
  3357. $timezone = $_SESSION['editUserForm']['timezone'];
  3358. $icq = htmlspecialchars( $_SESSION['editUserForm']['icq'] );
  3359. $url = htmlspecialchars( $_SESSION['editUserForm']['url'] );
  3360. $about = htmlspecialchars( $_SESSION['editUserForm']['about'] );
  3361. $signature = htmlspecialchars( $_SESSION['editUserForm']['signature'] );
  3362. unset( $_SESSION['editUserForm'] );
  3363. } else {
  3364. $email = htmlspecialchars( $_SESSION['user']['email'] );
  3365. $timezone = $_SESSION['user']['timezone'];
  3366. $icq = htmlspecialchars( $_SESSION['user']['icq'] );
  3367. $url = htmlspecialchars( $_SESSION['user']['url'] );
  3368. $about = htmlspecialchars( $_SESSION['user']['about'] );
  3369. $signature = htmlspecialchars( $_SESSION['user']['signature'] );
  3370. }
  3371.  
  3372. $action = $_SERVER['PHP_SELF'].'?action=updateUser';
  3373.  
  3374. $tpl = file_get_contents( './templates/editUserForm.html' );
  3375. $tpl = str_replace( '{action}', $action, $tpl );
  3376. $tpl = str_replace( '{email}', htmlspecialchars( $email ), $tpl );
  3377. $tpl = str_replace( '{icq}', htmlspecialchars( $icq ), $tpl );
  3378. $tpl = str_replace( '{url}', htmlspecialchars( $url ), $tpl );
  3379. $tpl = str_replace( '{about}', htmlspecialchars( $about ), $tpl );
  3380. $tpl = str_replace( '{signature}', htmlspecialchars( $signature ), $tpl );
  3381.  
  3382. $options = '';
  3383. for ( $i = -12; $i <= 12; $i++ ) {
  3384. if ( $i < 1 )
  3385. $value = $i.' часов';
  3386. else
  3387. $value = '+'.$i.' часов';
  3388. if ( $i == $_SESSION['user']['timezone'] )
  3389. $options = $options . '<option value="'.$i.'" selected>'.$value.'</option>'."\n";
  3390. else
  3391. $options = $options . '<option value="'.$i.'">'.$value.'</option>'."\n";
  3392. }
  3393. $tpl = str_replace( '{options}', $options, $tpl);
  3394. $tpl = str_replace( '{servertime}', date( "d.m.Y H:i:s" ), $tpl );
  3395. // Если ранее был загружен файл - надо предоставить возможность удалить его
  3396. $unlinkfile = '';
  3397. if ( is_file( './photo/'.$_SESSION['user']['id_author'] ) ) {
  3398. $unlinkfile = '<br/><input type="checkbox" name="unlink" value="1" />
  3399. Удалить загруженный ранее файл'."\n";
  3400. }
  3401. $tpl = str_replace( '{unlinkfile}', $unlinkfile, $tpl );
  3402.  
  3403. $html = $html.$tpl;
  3404.  
  3405. return $html;
  3406. }
  3407.  
  3408. // Функция обновляет данные пользователя (обновляет запись в таблице TABLE_USERS)
  3409. function updateUser()
  3410. {
  3411. // Если это не зарегистрированный пользователь - функция вызвана по ошибке
  3412. if ( !isset( $_SESSION['user'] ) ) {
  3413. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3414. die();
  3415. }
  3416.  
  3417. // Если не переданы данные формы - функция вызвана по ошибке
  3418. if ( !isset( $_POST['password'] ) or
  3419. !isset( $_POST['newpassword'] ) or
  3420. !isset( $_POST['confirm'] ) or
  3421. !isset( $_POST['email'] ) or
  3422. !isset( $_POST['timezone'] ) or
  3423. !isset( $_POST['icq'] ) or
  3424. !isset( $_POST['url'] ) or
  3425. !isset( $_POST['about'] ) or
  3426. !isset( $_POST['signature'] ) or
  3427. !isset( $_FILES['avatar'] )
  3428. )
  3429. {
  3430. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3431. die();
  3432. }
  3433.  
  3434. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  3435. $password = substr( $_POST['password'], 0, 30 );
  3436. $newpassword = substr( $_POST['newpassword'], 0, 30 );
  3437. $confirm = substr( $_POST['confirm'], 0, 30 );
  3438. $email = substr( $_POST['email'], 0, 60 );
  3439. $icq = substr( $_POST['icq'], 0, 12 );
  3440. $url = substr( $_POST['url'], 0, 60 );
  3441. $about = substr( $_POST['about'], 0, 1000 );
  3442. $signature = substr( $_POST['signature'], 0, 500 );
  3443.  
  3444. // Обрезаем лишние пробелы
  3445. $password = trim( $password );
  3446. $newpassword = trim( $newpassword );
  3447. $confirm = trim( $confirm );
  3448. $email = trim( $email );
  3449. $icq = trim( $icq );
  3450. $url = trim( $url );
  3451. $about = trim( $about );
  3452. $signature = trim( $signature );
  3453.  
  3454. // Проверяем, заполнены ли обязательные поля
  3455. $error = '';
  3456.  
  3457. // Если заполнено поле "Текущий пароль" - значит пользователь
  3458. // хочет изменить его или поменять свой e-mail
  3459. $changePassword = false;
  3460. $changeEmail = false;
  3461. if ( !empty( $_POST['password'] ) ) {
  3462. if ( md5( $_POST['password'] ) != $_SESSION['user']['passw'] )
  3463. $error = $error.'<li>текущий пароль введен не верно</li>'."\n";
  3464. // Надо выяснить, что хочет сделать пользователь:
  3465. // поменять свой e-mail, изменить пароль или и то и другое
  3466. if ( !empty( $newpassword ) ) { // хочет изменить пароль
  3467. $changePassword = true;
  3468. if ( empty( $confirm ) ) $error = $error.'<li>не заполнено поле "Подтвердите пароль"</li>'."\n";
  3469. // Проверяем, не слишком ли короткий новый пароль
  3470. if ( strlen( $newpassword ) < MIN_PASSWORD_LENGTH )
  3471. $error = $error.'<li>длина пароля должна быть не меньше '.MIN_PASSWORD_LENGTH.' символов</li>'."\n";
  3472. // Проверяем, совпадают ли пароли
  3473. if ( !empty( $confirm ) and $newpassword != $confirm )
  3474. $error = $error.'<li>не совпадают пароли</li>'."\n";
  3475. // Проверяем поля формы на недопустимые символы
  3476. if ( !preg_match( "#^[-_0-9a-z]+$#i", $newpassword ) )
  3477. $error = $error.'<li>поле "Новый пароль" содержит недопустимые символы</li>'."\n";
  3478. if ( !empty( $confirm ) and !preg_match( "#^[-_0-9a-z]+$#i", $confirm ) )
  3479. $error = $error.'<li>поле "Подтвердите пароль" содержит недопустимые символы</li>'."\n";
  3480. }
  3481. if ( $email != $_SESSION['user']['email'] ) { // хочет изменить e-mail
  3482. $changeEmail = true;
  3483. if ( empty( $email ) ) $error = $error.'<li>не заполнено поле "Адрес e-mail"</li>'."\n";
  3484. // Проверяем корректность e-mail
  3485. if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
  3486. $error = $error.'<li>поле "Адрес e-mail" должно соответствовать формату
  3487. somebody@somewhere.ru</li>'."\n";
  3488. }
  3489. }
  3490.  
  3491. // Проверяем поля формы на недопустимые символы
  3492. if ( !empty( $icq ) and !preg_match( "#^[0-9]+$#", $icq ) )
  3493. $error = $error.'<li>поле "ICQ" содержит недопустимые символы</li>'."\n";
  3494. if ( !empty( $about ) and !preg_match( "#^[-\[\].;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $about ) )
  3495. $error = $error.'<li>поле "Интересы" содержит недопустимые символы</li>'."\n";
  3496. if ( !empty( $signature ) and !preg_match( "#^[-\[\].;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $signature ) )
  3497. $error = $error.'<li>поле "Подпись" содержит недопустимые символы</li>'."\n";
  3498.  
  3499. // Проверяем корректность URL домашней странички
  3500. if ( !empty( $url ) and !preg_match( "#^(http:\/\/)?(www.)?[-0-9a-z]+\.[a-z]{2,6}\/?$#i", $url ) )
  3501. $error = $error.'<li>поле "Домашняя страничка" должно соответствовать формату http://www.homepage.ru</li>'."\n";
  3502.  
  3503. if ( !empty( $_FILES['avatar']['name'] ) ) {
  3504. $ext = strrchr( $_FILES['avatar']['name'], "." );
  3505. $extensions = array( ".jpg", ".gif", ".bmp", ".png" );
  3506. if ( !in_array( $ext, $extensions ) )
  3507. $error = $error.'<li>недопустимый формат файла аватара</li>'."\n";
  3508. if ( $_FILES['avatar']['size'] > MAX_AVATAR_SIZE )
  3509. $error = $error.'<li>размер файла аватора больше '.(MAX_AVATAR_SIZE/1024).' Кб</li>'."\n";
  3510. }
  3511.  
  3512. $timezone = (int)$_POST['timezone'];
  3513. if ( $timezone < -12 or $timezone > 12 ) $timezone = 0;
  3514.  
  3515. // Если были допущены ошибки при заполнении формы -
  3516. // перенаправляем посетителя на страницу редактирования
  3517. if ( !empty( $error ) ) {
  3518. $_SESSION['editUserForm'] = array();
  3519. $_SESSION['editUserForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  3520. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  3521. $_SESSION['editUserForm']['email'] = $email;
  3522. $_SESSION['editUserForm']['timezone'] = $timezone;
  3523. $_SESSION['editUserForm']['icq'] = $icq;
  3524. $_SESSION['editUserForm']['url'] = $url;
  3525. $_SESSION['editUserForm']['about'] = $about;
  3526. $_SESSION['editUserForm']['signature'] = $signature;
  3527. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editUserForm' );
  3528. die();
  3529. }
  3530.  
  3531. // Если выставлен флажок "Удалить загруженный ранее файл"
  3532. if ( isset( $_POST['unlink'] ) and is_file( './photo/'.$_SESSION['user']['id_author'] ) ) {
  3533. unlink( './photo/'.$_SESSION['user']['id_author'] );
  3534. }
  3535. if ( !empty( $_FILES['avatar']['name'] ) and
  3536. move_uploaded_file ( $_FILES['avatar']['tmp_name'], './photo/'.$_SESSION['user']['id_author'] ) ) {
  3537. chmod( './photo/'.$_SESSION['user']['id_author'], 0644 );
  3538. }
  3539.  
  3540. // Все поля заполнены правильно - записываем изменения в БД
  3541. $tmp = '';
  3542. if ( $changePassword ) {
  3543. $tmp = $tmp."passw='".mysql_real_escape_string( md5( $newpassword ) )."', ";
  3544. $_SESSION['user']['passw'] = md5( $newpassword );
  3545. }
  3546. if ( $changeEmail ) {
  3547. $tmp = $tmp."email='".mysql_real_escape_string( $email )."', ";
  3548. $_SESSION['user']['email'] = $email;
  3549. }
  3550. $query = "UPDATE ".TABLE_USERS." SET ".$tmp."
  3551. timezone=".$timezone.",
  3552. url='".mysql_real_escape_string( $url )."',
  3553. icq='".$icq."',
  3554. about='".mysql_real_escape_string( $about )."',
  3555. signature='".mysql_real_escape_string( $signature )."'
  3556. WHERE id_author=".$_SESSION['user']['id_author'];
  3557. $res = mysql_query( $query );
  3558. if ( !$res ) {
  3559. $msg = 'Ошибка при обновлении профиля';
  3560. $err = 'Ошибка при выполнении запроса: <br/>'.
  3561. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3562. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3563. return showErrorMessage( $msg, $err, true, '' );
  3564. }
  3565. // Теперь надо обновить данные о пользователе в массиве $_SESSION['user']
  3566. if ( $changePassword ) $_SESSION['user']['passw'] = md5( $newpassword );
  3567. if ( $changeEmail ) $_SESSION['user']['email'] = $email;
  3568. $_SESSION['user']['timezone'] = $timezone;
  3569. $_SESSION['user']['url'] = $url;
  3570. $_SESSION['user']['icq'] = $icq;
  3571. $_SESSION['user']['about'] = $about;
  3572. $_SESSION['user']['signature'] = $signature;
  3573. // ... и в массиве $_COOKIE
  3574. if ( isset( $_COOKIE['autologin'] ) ) {
  3575. $tmppos = strrpos( $_SERVER['PHP_SELF'], '/' ) + 1;
  3576. $path = substr( $_SERVER['PHP_SELF'], 0, $tmppos );
  3577. setcookie( 'autologin', 'yes', time() + 3600*24*COOKIE_TIME, $path );
  3578. setcookie( 'username', $_SESSION['user']['name'], time() + 3600*24*COOKIE_TIME, $path );
  3579. setcookie( 'password', $_SESSION['user']['passw'], time() + 3600*24*COOKIE_TIME, $path );
  3580. }
  3581.  
  3582. return showInfoMessage( 'Ваш профиль был изменён', '' );
  3583. }
  3584.  
  3585. // Функция возвращает html формы для редактирования данных о пользователе
  3586. // (только для администратора форума)
  3587. function getEditUserFormByAdmin()
  3588. {
  3589. // Если не передан ID пользователя - значит функция вызвана по ошибке
  3590. if ( !isset( $_GET['idUser'] ) ) {
  3591. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
  3592. die();
  3593. }
  3594. $id = (int)$_GET['idUser'];
  3595. // ID зарегистрированного пользователя не может быть меньше
  3596. // единицы - значит функция вызвана по ошибке
  3597. if ( $id < 1 ) {
  3598. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
  3599. die();
  3600. }
  3601. // Если информацию о пользователе пытается редактировать
  3602. // не зарегистрированный пользователь
  3603. if ( !isset( $_SESSION['user'] ) ) {
  3604. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3605. die();
  3606. }
  3607. // Только администратор имеет право на эту операцию
  3608. if ( $_SESSION['user']['status'] != 'admin' ) {
  3609. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3610. die();
  3611. }
  3612.  
  3613. $statusArray = array( 'user' => 'Пользователь',
  3614. 'moderator' => 'Модератор',
  3615. 'admin' => 'Администратор' );
  3616. $html = '';
  3617.  
  3618. // Если при заполнении формы были допущены ошибки
  3619. if ( isset( $_SESSION['editUserFormByAdmin'] ) ) {
  3620. $info = file_get_contents( './templates/infoMessage.html' );
  3621. $info = str_replace( '{infoMessage}', $_SESSION['editUserFormByAdmin']['error'], $info );
  3622. $html = $html.$info."\n";
  3623. $name = htmlspecialchars( $_SESSION['editUserFormByAdmin']['name'] );
  3624. $status = $_SESSION['editUserFormByAdmin']['status'];
  3625. $email = htmlspecialchars( $_SESSION['editUserFormByAdmin']['email'] );
  3626. $oldEmail = htmlspecialchars( $_SESSION['editUserFormByAdmin']['oldEmail'] );
  3627. $timezone = $_SESSION['editUserFormByAdmin']['timezone'];
  3628. $icq = htmlspecialchars( $_SESSION['editUserFormByAdmin']['icq'] );
  3629. $url = htmlspecialchars( $_SESSION['editUserFormByAdmin']['url'] );
  3630. $about = htmlspecialchars( $_SESSION['editUserFormByAdmin']['about'] );
  3631. $signature = htmlspecialchars( $_SESSION['editUserFormByAdmin']['signature'] );
  3632. unset( $_SESSION['editUserFormByAdmin'] );
  3633. } else {
  3634. // Получаем данные о пользователе из БД
  3635. $query = "SELECT id_author, name, email, url, icq, about, photo, status, timezone, signature
  3636. FROM ".TABLE_USERS."
  3637. WHERE id_author=".$id;
  3638. $res = mysql_query( $query );
  3639. if ( !$res ) {
  3640. $msg = 'Ошибка при получении информации о пользователе';
  3641. $err = 'Ошибка при выполнении запроса: <br/>'.
  3642. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3643. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3644. return showErrorMessage( $msg, $err, 'action=showUsersList', true );
  3645. }
  3646. if ( mysql_num_rows( $res ) == 0 )
  3647. return showInfoMessage( 'Пользователь не найден', 'action=showUsersList' );
  3648. $user = mysql_fetch_array( $res );
  3649.  
  3650. $name = htmlspecialchars( $user['name'] );
  3651. $status = $user['status'];
  3652. $email = htmlspecialchars( $user['email'] );
  3653. $oldEmail = $email;
  3654. $timezone = $user['timezone'];
  3655. $icq = htmlspecialchars( $user['icq'] );
  3656. $url = htmlspecialchars( $user['url'] );
  3657. $about = htmlspecialchars( $user['about'] );
  3658. $signature = htmlspecialchars( $user['signature'] );
  3659. }
  3660.  
  3661. $userStatus = '<select name="status">'."\n";
  3662. foreach( $statusArray as $key => $value ) {
  3663. if ( $key == $status )
  3664. $userStatus = $userStatus.'<option value="'.$key.'" selected>'.$value.'</option>'."\n";
  3665. else
  3666. $userStatus = $userStatus.'<option value="'.$key.'">'.$value.'</option>'."\n";
  3667. }
  3668. $userStatus = $userStatus.'</select>'."\n";
  3669.  
  3670. $action = $_SERVER['PHP_SELF'].'?action=updateUserByAdmin&idUser='.$id;
  3671.  
  3672. $tpl = file_get_contents( './templates/editUserFormByAdmin.html' );
  3673. $tpl = str_replace( '{action}', $action, $tpl );
  3674. $tpl = str_replace( '{name}', htmlspecialchars( $name ), $tpl );
  3675. $tpl = str_replace( '{status}', $userStatus, $tpl );
  3676. $tpl = str_replace( '{email}', htmlspecialchars( $email ), $tpl );
  3677. $tpl = str_replace( '{icq}', htmlspecialchars( $icq ), $tpl );
  3678. $tpl = str_replace( '{url}', htmlspecialchars( $url ), $tpl );
  3679. $tpl = str_replace( '{about}', htmlspecialchars( $about ), $tpl );
  3680. $tpl = str_replace( '{signature}', htmlspecialchars( $signature ), $tpl );
  3681.  
  3682. $options = '';
  3683. for ( $i = -12; $i <= 12; $i++ ) {
  3684. if ( $i < 1 )
  3685. $value = $i.' часов';
  3686. else
  3687. $value = '+'.$i.' часов';
  3688. if ( $i == $timezone )
  3689. $options = $options . '<option value="'.$i.'" selected>'.$value.'</option>'."\n";
  3690. else
  3691. $options = $options . '<option value="'.$i.'">'.$value.'</option>'."\n";
  3692. }
  3693. $tpl = str_replace( '{options}', $options, $tpl);
  3694. $tpl = str_replace( '{servertime}', date( "d.m.Y H:i:s" ), $tpl );
  3695. // Если ранее был загружен файл - надо предоставить возможность удалить его
  3696. $unlinkfile = '';
  3697. if ( is_file( './photo/'.$id ) ) {
  3698. $unlinkfile = '<br/><input type="checkbox" name="unlink" value="1" />
  3699. Удалить загруженный ранее файл'."\n";
  3700. }
  3701. $tpl = str_replace( '{unlinkfile}', $unlinkfile, $tpl );
  3702.  
  3703. $html = $html.$tpl;
  3704.  
  3705. return $html;
  3706. }
  3707.  
  3708. // Функция обновляет данные пользователя (только для администратора форума)
  3709. function updateUserByAdmin()
  3710. {
  3711. // Если не передан ID пользователя - значит функция вызвана по ошибке
  3712. if ( !isset( $_GET['idUser'] ) ) {
  3713. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
  3714. die();
  3715. }
  3716. $id = (int)$_GET['idUser'];
  3717. // ID зарегистрированного пользователя не может быть меньше
  3718. // единицы - значит функция вызвана по ошибке
  3719. if ( $id < 1 ) {
  3720. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
  3721. die();
  3722. }
  3723. // Если профиль пытается редактировать не зарегистрированный
  3724. // пользователь - функция вызвана по ошибке
  3725. if ( !isset( $_SESSION['user'] ) ) {
  3726. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3727. die();
  3728. }
  3729. // Только администратор имеет право на эту операцию
  3730. if ( $_SESSION['user']['status'] != 'admin' ) {
  3731. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3732. die();
  3733. }
  3734. // Если не переданы данные формы - функция вызвана по ошибке
  3735. if ( !isset( $_POST['name'] ) or
  3736. !isset( $_POST['status'] ) or
  3737. !isset( $_POST['email'] ) or
  3738. !isset( $_POST['oldEmail'] ) or
  3739. !isset( $_POST['newpassword'] ) or
  3740. !isset( $_POST['confirm'] ) or
  3741. !isset( $_POST['timezone'] ) or
  3742. !isset( $_POST['icq'] ) or
  3743. !isset( $_POST['url'] ) or
  3744. !isset( $_POST['about'] ) or
  3745. !isset( $_POST['signature'] ) or
  3746. !isset( $_FILES['avatar'] )
  3747. )
  3748. {
  3749. header( 'Location: '.$_SERVER['PHP_SELF'] );
  3750. die();
  3751. }
  3752.  
  3753. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  3754. $email = substr( $_POST['email'], 0, 60 );
  3755. $oldEmail = substr( $_POST['oldEmail'], 0, 60 );
  3756. $newpassword = substr( $_POST['newpassword'], 0, 30 );
  3757. $confirm = substr( $_POST['confirm'], 0, 30 );
  3758. $icq = substr( $_POST['icq'], 0, 12 );
  3759. $url = substr( $_POST['url'], 0, 60 );
  3760. $about = substr( $_POST['about'], 0, 1000 );
  3761. $signature = substr( $_POST['signature'], 0, 500 );
  3762.  
  3763. // Обрезаем лишние пробелы
  3764. $email = trim( $email );
  3765. $oldEmail = trim( $oldEmail );
  3766. $newpassword = trim( $newpassword );
  3767. $confirm = trim( $confirm );
  3768. $icq = trim( $icq );
  3769. $url = trim( $url );
  3770. $about = trim( $about );
  3771. $signature = trim( $signature );
  3772.  
  3773. // Проверяем, заполнены ли обязательные поля
  3774. $error = '';
  3775.  
  3776. // Надо выяснить, что хочет сделать администратор:
  3777. // поменять e-mail, изменить пароль или и то и другое
  3778. $changePassword = false;
  3779. $changeEmail = false;
  3780.  
  3781. if ( !empty( $newpassword ) ) { // хочет изменить пароль
  3782. $changePassword = true;
  3783. if ( empty( $confirm ) ) $error = $error.'<li>не заполнено поле "Подтвердите пароль"</li>'."\n";
  3784. // Проверяем, не слишком ли короткий новый пароль
  3785. if ( strlen( $newpassword ) < MIN_PASSWORD_LENGTH )
  3786. $error = $error.'<li>длина пароля должна быть не меньше '.MIN_PASSWORD_LENGTH.' символов</li>'."\n";
  3787. // Проверяем, совпадают ли пароли
  3788. if ( !empty( $confirm ) and $newpassword != $confirm )
  3789. $error = $error.'<li>не совпадают пароли</li>'."\n";
  3790. // Проверяем поля формы на недопустимые символы
  3791. if ( !preg_match( "#^[-_0-9a-z]+$#i", $newpassword ) )
  3792. $error = $error.'<li>поле "Новый пароль" содержит недопустимые символы</li>'."\n";
  3793. if ( !empty( $confirm ) and !preg_match( "#^[-_0-9a-z]+$#i", $confirm ) )
  3794. $error = $error.'<li>поле "Подтвердите пароль" содержит недопустимые символы</li>'."\n";
  3795. }
  3796. if ( $email != $oldEmail ) { // хочет изменить e-mail
  3797. $changeEmail = true;
  3798. if ( empty( $email ) ) $error = $error.'<li>не заполнено поле "Адрес e-mail"</li>'."\n";
  3799. // Проверяем корректность e-mail
  3800. if ( !empty( $email ) and !preg_match( "#^[0-9a-z_\-\.]+@[0-9a-z\-\.]+\.[a-z]{2,6}$#i", $email ) )
  3801. $error = $error.'<li>поле "Адрес e-mail" должно соответствовать формату
  3802. somebody@somewhere.ru</li>'."\n";
  3803. }
  3804.  
  3805. // Проверяем поля формы на недопустимые символы
  3806. if ( !empty( $icq ) and !preg_match( "#^[0-9]+$#", $icq ) )
  3807. $error = $error.'<li>поле "ICQ" содержит недопустимые символы</li>'."\n";
  3808. if ( !empty( $about ) and !preg_match( "#^[-\[\].;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $about ) )
  3809. $error = $error.'<li>поле "Интересы" содержит недопустимые символы</li>'."\n";
  3810. if ( !empty( $signature ) and !preg_match( "#^[-\[\].;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $signature ) )
  3811. $error = $error.'<li>поле "Подпись" содержит недопустимые символы</li>'."\n";
  3812.  
  3813. // Проверяем корректность URL домашней странички
  3814. if ( !empty( $url ) and !preg_match( "#^(http:\/\/)?(www.)?[-0-9a-z]+\.[a-z]{2,6}\/?$#i", $url ) )
  3815. $error = $error.'<li>поле "Домашняя страничка" должно соответствовать формату http://www.homepage.ru</li>'."\n";
  3816.  
  3817. if ( !empty( $_FILES['avatar']['name'] ) ) {
  3818. $ext = strrchr( $_FILES['avatar']['name'], "." );
  3819. $extensions = array( ".jpg", ".gif", ".bmp", ".png" );
  3820. if ( !in_array( $ext, $extensions ) )
  3821. $error = $error.'<li>недопустимый формат файла аватара</li>'."\n";
  3822. if ( $_FILES['avatar']['size'] > MAX_AVATAR_SIZE )
  3823. $error = $error.'<li>размер файла аватора больше '.(MAX_AVATAR_SIZE/1024).' Кб</li>'."\n";
  3824. }
  3825.  
  3826. $statusArray = array( 'user' => 'Пользователь',
  3827. 'moderator' => 'Модератор',
  3828. 'admin' => 'Администратор' );
  3829. if ( in_array( $_POST['status'], $statusArray ) )
  3830. $status = $_POST['status'];
  3831. else
  3832. $status = 'user';
  3833.  
  3834. $timezone = (int)$_POST['timezone'];
  3835. if ( $timezone < -12 or $timezone > 12 ) $timezone = 0;
  3836.  
  3837. // Если были допущены ошибки при заполнении формы -
  3838. // перенаправляем посетителя на страницу редактирования
  3839. if ( !empty( $error ) ) {
  3840. $_SESSION['editUserFormByAdmin'] = array();
  3841. $_SESSION['editUserFormByAdmin']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  3842. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  3843. $_SESSION['editUserFormByAdmin']['name'] = $_POST['name'];
  3844. $_SESSION['editUserFormByAdmin']['status'] = $status;
  3845. $_SESSION['editUserFormByAdmin']['email'] = $email;
  3846. $_SESSION['editUserFormByAdmin']['oldEmail'] = $oldEmail;
  3847. $_SESSION['editUserFormByAdmin']['timezone'] = $timezone;
  3848. $_SESSION['editUserFormByAdmin']['icq'] = $icq;
  3849. $_SESSION['editUserFormByAdmin']['url'] = $url;
  3850. $_SESSION['editUserFormByAdmin']['about'] = $about;
  3851. $_SESSION['editUserFormByAdmin']['signature'] = $signature;
  3852. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editUserFormByAdmin' );
  3853. die();
  3854. }
  3855.  
  3856. // Если выставлен флажок "Удалить загруженный ранее файл"
  3857. if ( isset( $_POST['unlink'] ) and is_file( './photo/'.$id ) ) {
  3858. unlink( './photo/'.$id );
  3859. }
  3860. if ( !empty( $_FILES['avatar']['name'] ) and
  3861. move_uploaded_file ( $_FILES['avatar']['tmp_name'], './photo/'.$id ) ) {
  3862. chmod( './photo/'.$id, 0644 );
  3863. }
  3864.  
  3865. // Все поля заполнены правильно - записываем изменения в БД
  3866. $tmp = '';
  3867. if ( $changePassword ) {
  3868. $tmp = $tmp."passw='".mysql_real_escape_string( md5( $newpassword ) )."', ";
  3869. }
  3870. if ( $changeEmail ) {
  3871. $tmp = $tmp."email='".mysql_real_escape_string( $email )."', ";
  3872. }
  3873. $query = "UPDATE ".TABLE_USERS." SET ".$tmp."
  3874. status='".$status."',
  3875. timezone=".$timezone.",
  3876. url='".mysql_real_escape_string( $url )."',
  3877. icq='".$icq."',
  3878. about='".mysql_real_escape_string( $about )."',
  3879. signature='".mysql_real_escape_string( $signature )."'
  3880. WHERE id_author=".$id;
  3881. $res = mysql_query( $query );
  3882. if ( !$res ) {
  3883. $msg = 'Ошибка при обновлении профиля';
  3884. $err = 'Ошибка при выполнении запроса: <br/>'.
  3885. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3886. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3887. return showErrorMessage( $msg, $err, true, '' );
  3888. } else {
  3889. return showInfoMessage( 'Профиль был изменён', '' );
  3890. }
  3891. }
  3892.  
  3893. // Функция возвращает html списка пользователей форума
  3894. function getUsersList()
  3895. {
  3896. // Выбираем из БД количество пользователей - это нужно для
  3897. // построения постраничной навигации
  3898. $query = "SELECT COUNT(*) FROM ".TABLE_USERS." WHERE 1";
  3899. $res = mysql_query( $query );
  3900. if ( !$res ) {
  3901. $msg = 'Ошибка при формировании списка пользователей';
  3902. $err = 'Ошибка при выполнении запроса: <br/>'.
  3903. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3904. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3905. return showErrorMessage( $msg, $err, true, 'action=showUsersList' );
  3906. }
  3907. $total = mysql_result( $res, 0, 0 );
  3908.  
  3909. // Проверяем передан ли номер текущей страницы (постраничная навигация)
  3910. if ( isset($_GET['page']) ) {
  3911. $page = (int)$_GET['page'];
  3912. if ( $page < 1 ) $page = 1;
  3913. } else {
  3914. $page = 1;
  3915. }
  3916.  
  3917. // Число страниц списка пользователей (постраничная навигация)
  3918. $cntPages = ceil( $total / USERS_PER_PAGE );
  3919. if ( $page > $cntPages ) $page = $cntPages;
  3920. // Начальная позиция (постраничная навигация)
  3921. $start = ( $page - 1 ) * USERS_PER_PAGE;
  3922.  
  3923. $query = "SELECT id_author, name, status, email, url, icq, puttime, posts
  3924. FROM ".TABLE_USERS."
  3925. WHERE 1 ORDER BY puttime ASC LIMIT ".$start.", ".USERS_PER_PAGE;
  3926. $res = mysql_query( $query );
  3927. if ( !$res ) {
  3928. $msg = 'Ошибка при формировании списка пользователей';
  3929. $err = 'Ошибка при выполнении запроса: <br/>'.
  3930. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  3931. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  3932. return showErrorMessage( $msg, $err, true, 'action=showUsersList' );
  3933. }
  3934.  
  3935. // Выводим "шапку" таблицы
  3936. $html = '<table class="showTable">'."\n";
  3937. $html = $html.'<tr>'."\n";
  3938. $html = $html.'<th>Имя</th>'."\n";
  3939. $html = $html.'<th>Статус</th>'."\n";
  3940. $html = $html.'<th>Зарегистрирован</th>'."\n";
  3941. $html = $html.'<th>Сообщений</th>'."\n";
  3942. if ( isset( $_SESSION['user'] ) ) {
  3943. $html = $html.'<th>Личное сообщение</th>'."\n";
  3944. $html = $html.'<th>E-mail</th>'."\n";
  3945. }
  3946. $html = $html.'<th>WWW</th>'."\n";
  3947. $html = $html.'<th>ICQ</th>'."\n";
  3948. if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] == 'admin' )
  3949. $html = $html.'<th>Правка</th>'."\n";
  3950. $html = $html.'</tr>'."\n";
  3951.  
  3952. $status = array( 'user' => 'Пользователь',
  3953. 'moderator' => 'Модератор',
  3954. 'admin' => 'Администратор' );
  3955.  
  3956. while( $user = mysql_fetch_array( $res ) ) {
  3957. $html = $html.'<tr align="center">'."\n";
  3958. $html = $html.'<td align="left"><a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
  3959. $user['id_author'].'">'.$user['name'].'</a></td>'."\n";
  3960. $html = $html.'<td align="left">'.$status[$user['status']].'</td>'."\n";
  3961. $html = $html.'<td>'.$user['puttime'].'</td>'."\n";
  3962. $html = $html.'<td>'.$user['posts'].'</td>'."\n";
  3963. if ( isset( $_SESSION['user'] ) ) {
  3964. $html = $html.'<td><a href="'.$_SERVER['PHP_SELF'].'?action=sendMsgForm&idUser='.
  3965. $user['id_author'].'">Написать</a></td>'."\n";
  3966. $html = $html.'<td><a href="'.$_SERVER['PHP_SELF'].'?action=sendMailForm&idUser='.
  3967. $user['id_author'].'">Написать</a></td>'."\n";
  3968. }
  3969. if ( !empty( $user['url'] ) )
  3970. $html = $html.'<td align="left"><a href="'.$user['url'].'" target="_blank">'.$user['url'].'</td>'."\n";
  3971. else
  3972. $html = $html.'<td align="left">&nbsp;</td>'."\n";
  3973. if ( !empty( $user['icq'] ) )
  3974. $html = $html.'<td>'.$user['icq'].'</td>'."\n";
  3975. else
  3976. $html = $html.'<td>&nbsp;</td>'."\n";
  3977. if ( isset( $_SESSION['user'] ) and $_SESSION['user']['status'] == 'admin' ) {
  3978. $html = $html.'<td><a href="'.$_SERVER['PHP_SELF'].
  3979. '?action=editUserFormByAdmin&idUser='.$user['id_author'].'"><img
  3980. src="./images/icon_edit.gif" alt="Править" title="Править" /></a></td>'."\n";
  3981. }
  3982. $html = $html.'</tr>'."\n";
  3983. }
  3984.  
  3985. $html = $html.'</table>'."\n";
  3986.  
  3987. // Строим постраничную навигацию
  3988. if ( $cntPages > 1 ) {
  3989. $html = $html.pageIterator( $page, $cntPages, $_SERVER['PHP_SELF'].'?action=showUsersList' );
  3990. }
  3991. return $html;
  3992. }
  3993.  
  3994. // Функция возврашает информацию о пользователе; ID пользователя передается методом GET
  3995. function showUserInfo()
  3996. {
  3997. // Если не передан ID пользователя - значит функция вызвана по ошибке
  3998. if ( !isset( $_GET['idUser'] ) ) {
  3999. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
  4000. die();
  4001. }
  4002. $id = (int)$_GET['idUser'];
  4003. // ID зарегистрированного пользователя не может быть меньше
  4004. // единицы - значит функция вызвана по ошибке
  4005. if ( $id < 1 ) {
  4006. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
  4007. die();
  4008. }
  4009.  
  4010. $status = array( 'user' => 'Пользователь',
  4011. 'moderator' => 'Модератор',
  4012. 'admin' => 'Администратор' );
  4013. $query = "SELECT id_author, name, email, url, icq, about, photo, puttime, last_visit, posts, status
  4014. FROM ".TABLE_USERS."
  4015. WHERE id_author=".$id;
  4016. $res = mysql_query( $query );
  4017. if ( !$res ) {
  4018. $msg = 'Ошибка при получении информации о пользователе';
  4019. $err = 'Ошибка при выполнении запроса: <br/>'.
  4020. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4021. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4022. return showErrorMessage( $msg, $err, 'action=showUsersList', true );
  4023. }
  4024. if ( mysql_num_rows( $res ) == 0 )
  4025. return showInfoMessage( 'Пользователь не найден', 'action=showUsersList' );
  4026. $user = mysql_fetch_array( $res );
  4027.  
  4028. if ( isset( $_SESSION['user'] ) ) {
  4029. $email = '<a href="'.$_SERVER['PHP_SELF'].'?action=sendMailForm&idUser='.$id.'">Написать письмо</a>';
  4030. $privateMessage = '<a href="'.$_SERVER['PHP_SELF'].'?action=sendMsgForm&idUser='.
  4031. $id.'">Отправить личное сообщение</a>';
  4032. } else {
  4033. $email = '[Для зарегистрированных пользователей]';
  4034. $privateMessage = '[Для зарегистрированных пользователей]';
  4035. }
  4036. $query = "SELECT time FROM ".TABLE_POSTS." WHERE id_author=".$id." ORDER BY time DESC LIMIT 1";
  4037. $res = mysql_query( $query );
  4038. if ( $res ) {
  4039. if ( mysql_num_rows( $res ) > 0 )
  4040. $lastPost = mysql_result( $res, 0, 0 );
  4041. else
  4042. $lastPost = '';
  4043. } else {
  4044. $lastPost = '';
  4045. }
  4046.  
  4047. $html = file_get_contents( './templates/showUserInfo.html' );
  4048. $html = str_replace( '{name}', $user['name'], $html );
  4049. $html = str_replace( '{regdate}', $user['puttime'], $html );
  4050. $html = str_replace( '{status}', $status[$user['status']], $html );
  4051. $html = str_replace( '{lastvisit}', $user['last_visit'], $html );
  4052. $html = str_replace( '{lastpost}', $lastPost, $html );
  4053. $html = str_replace( '{totalposts}', $user['posts'], $html );
  4054. $html = str_replace( '{email}', $email, $html );
  4055. $html = str_replace( '{url}', $user['url'], $html );
  4056. $html = str_replace( '{icq}', $user['icq'], $html );
  4057. $html = str_replace( '{about}', $user['about'], $html );
  4058. $html = str_replace( '{privatemessage}', $privateMessage, $html );
  4059. return $html."\n";
  4060. }
  4061.  
  4062. // Функция возвращает html формы для отправки личного сообщения
  4063. function getSendMsgForm()
  4064. {
  4065. // Незарегистрированный пользователь не может отправлять личные сообщения
  4066. if ( !isset( $_SESSION['user'] ) ) {
  4067. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4068. die();
  4069. }
  4070.  
  4071. $html = '<h1>Личные сообщения</h1>'."\n";
  4072. $html = $html.getMessagesMenu();
  4073.  
  4074. $toUser = '';
  4075. if ( isset( $_GET['idUser'] ) ) {
  4076. $id = (int)$_GET['idUser'];
  4077. if ( $id > 0 ) {
  4078. $query = "SELECT name FROM ".TABLE_USERS." WHERE id_author=".$id;
  4079. $res = mysql_query( $query );
  4080. if ( $res ) {
  4081. if ( mysql_num_rows( $res ) > 0 ) $toUser = mysql_result( $res, 0, 0 );
  4082. }
  4083. }
  4084. }
  4085. $subject = '';
  4086. $message = '';
  4087.  
  4088. if ( isset( $_SESSION['viewMessage'] ) and !empty( $_SESSION['viewMessage']['message'] ) ) {
  4089. $view = file_get_contents( './templates/previewMessage.html' );
  4090. $view = str_replace( '{message}', print_page( $_SESSION['viewMessage']['message'] ), $view );
  4091. $html = $html.$view."\n";
  4092. $toUser = htmlspecialchars( $_SESSION['viewMessage']['toUser'] );
  4093. $subject = htmlspecialchars( $_SESSION['viewMessage']['subject'] );
  4094. $message = htmlspecialchars( $_SESSION['viewMessage']['message'] );
  4095. unset( $_SESSION['viewMessage'] );
  4096. }
  4097.  
  4098. $action = $_SERVER['PHP_SELF'].'?action=sendMessage';
  4099. // Если при заполнении формы были допущены ошибки
  4100. if ( isset( $_SESSION['sendMessageForm'] ) ) {
  4101. $info = file_get_contents( './templates/infoMessage.html' );
  4102. $info = str_replace( '{infoMessage}', $_SESSION['sendMessageForm']['error'], $info );
  4103. $html = $html.$info."\n";
  4104. $toUser = htmlspecialchars( $_SESSION['sendMessageForm']['toUser'] );
  4105. $subject = htmlspecialchars( $_SESSION['sendMessageForm']['subject'] );
  4106. $message = htmlspecialchars( $_SESSION['sendMessageForm']['message'] );
  4107. unset( $_SESSION['sendMessageForm'] );
  4108. }
  4109.  
  4110. $tpl = file_get_contents( './templates/sendMessageForm.html' );
  4111. $tpl = str_replace( '{action}', $action, $tpl );
  4112. $tpl = str_replace( '{toUser}', $toUser, $tpl );
  4113. $tpl = str_replace( '{subject}', $subject, $tpl );
  4114. $tpl = str_replace( '{message}', $message, $tpl );
  4115.  
  4116. $html = $html.$tpl;
  4117.  
  4118. return $html;
  4119. }
  4120.  
  4121. // Отправка личного сообщения (добавляется новая запись в таблицу БД TABLE_MESSAGES)
  4122. function sendMessage()
  4123. {
  4124. // Незарегистрированный пользователь не может отправлять личные сообщения
  4125. if ( !isset( $_SESSION['user'] ) ) {
  4126. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4127. die();
  4128. }
  4129.  
  4130. // Если не переданы данные формы - функция вызвана по ошибке
  4131. if ( !isset( $_POST['toUser'] ) or
  4132. !isset( $_POST['subject'] ) or
  4133. !isset( $_POST['message'] ) )
  4134. {
  4135. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4136. die();
  4137. }
  4138.  
  4139. $msgLen = strlen( $_POST['message'] );
  4140.  
  4141. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  4142. $toUser = substr( $_POST['toUser'], 0, 30 );
  4143. $subject = substr( $_POST['subject'], 0, 60 );
  4144. $message = substr( $_POST['message'], 0, MAX_MESSAGE_LENGTH );
  4145. // Обрезаем лишние пробелы
  4146. $toUser = trim( $toUser );
  4147. $subject = trim( $subject );
  4148. $message = trim( $message );
  4149.  
  4150. // Если пользователь хочет посмотреть на сообщение перед отправкой
  4151. if ( isset( $_POST['viewMessage'] ) )
  4152. {
  4153. $_SESSION['viewMessage'] = array();
  4154. $_SESSION['viewMessage']['toUser'] = $toUser;
  4155. $_SESSION['viewMessage']['subject'] = $subject;
  4156. $_SESSION['viewMessage']['message'] = $message;
  4157. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=sendMsgForm' );
  4158. die();
  4159. }
  4160.  
  4161. // Проверяем, заполнены ли обязательные поля
  4162. $error = '';
  4163. if ( empty( $toUser ) ) $error = $error.'<li>не заполнено поле "Для пользователя"</li>'."\n";
  4164. if ( empty( $subject ) ) $error = $error.'<li>не заполнено поле "Заголовок сообщения"</li>'."\n";
  4165. if ( empty( $message ) ) $error = $error.'<li>не заполнено поле "Текст сообщения"</li>'."\n";
  4166. if ( $msgLen > MAX_MESSAGE_LENGTH )
  4167. $error = $error.'<li>длина сообщения больше '.MAX_MESSAGE_LENGTH.' символов</li>'."\n";
  4168. // Проверяем поля формы на недопустимые символы
  4169. if ( !empty( $toUser ) and !preg_match( "#^[- _0-9a-zА-Яа-я]+$#i", $toUser ) )
  4170. $error = $error.'<li>поле "Для пользователя" содержит недопустимые символы</li>'."\n";
  4171. if ( !empty( $subject ) and !preg_match( "#^[-.;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $subject ) )
  4172. $error = $error.'<li>поле "Заголовок сообщения" содержит недопустимые символы</li>'."\n";
  4173. // Проверяем, есть ли такой пользователь
  4174. if ( !empty( $toUser ) ) {
  4175. $to = preg_replace( "#[^- _0-9a-zА-Яа-я]#i", '', $toUser );
  4176. $query = "SELECT id_author FROM ".TABLE_USERS." WHERE name='".$to."' LIMIT 1";
  4177. $res = mysql_query( $query );
  4178. if ( !$res ) {
  4179. $msg = 'Произошла ошибка при отправке сообщения';
  4180. $err = 'Ошибка при выполнении запроса: <br/>'.
  4181. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4182. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4183. return showErrorMessage( $msg, $err, true, 'action=sendMsgForm' );
  4184. }
  4185. if ( mysql_num_rows( $res ) == 0 )
  4186. $error = $error.'<li>пользователь с именем <strong>'.$to.'</strong> не зарегистрирован</li>'."\n";
  4187. if ( (mysql_num_rows( $res ) == 1 ) and (mysql_result( $res, 0, 0 ) == $_SESSION['user']['id_author']) )
  4188. $error = $error.'<li>нельзя послать сообщение самому себе</li>'."\n";
  4189. }
  4190. // Если были допущены ошибки при заполнении формы -
  4191. // перенаправляем посетителя для исправления ошибок
  4192. if ( !empty( $error ) )
  4193. {
  4194. $_SESSION['sendMessageForm'] = array();
  4195. $_SESSION['sendMessageForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  4196. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  4197. $_SESSION['sendMessageForm']['toUser'] = $toUser;
  4198. $_SESSION['sendMessageForm']['subject'] = $subject;
  4199. $_SESSION['sendMessageForm']['message'] = $message;
  4200. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=sendMsgForm' );
  4201. die();
  4202. }
  4203.  
  4204. // Все поля заполнены правильно - "посылаем" сообщение
  4205. $to = mysql_result( $res, 0, 0 );
  4206. $from = $_SESSION['user']['id_author'];
  4207.  
  4208. $query = "INSERT INTO ".TABLE_MESSAGES."
  4209. VALUES
  4210. (
  4211. NULL,
  4212. ".$to.",
  4213. ".$from.",
  4214. NOW(),
  4215. '".mysql_real_escape_string( $subject )."',
  4216. '".mysql_real_escape_string( $message )."',
  4217. 0,
  4218. 0
  4219. )";
  4220. $res = mysql_query( $query );
  4221. if ( !$res ) {
  4222. $msg = 'Произошла ошибка при отправке сообщения';
  4223. $err = 'Ошибка при выполнении запроса: <br/>'.
  4224. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4225. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4226. return showErrorMessage( $msg, $err, true, 'action=showOutBox' );
  4227. }
  4228.  
  4229. return showInfoMessage( 'Ваше сообщение успешно отправлено', 'action=showOutBox' );
  4230. }
  4231.  
  4232. // Функция возвращает личное сообщение для просмотра пользователем
  4233. function getMessage()
  4234. {
  4235. if ( !isset( $_SESSION['user'] ) ) {
  4236. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4237. die();
  4238. }
  4239. if ( !isset( $_GET['idMsg'] ) ) {
  4240. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4241. die();
  4242. }
  4243. $idMsg = (int)$_GET['idMsg'];
  4244. if ( $idMsg < 1 ) {
  4245. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showInBox' );
  4246. die();
  4247. }
  4248. // Получаем из БД информацию о сообщении.
  4249. // В этом запросе дополнительное условие нужно для того, чтобы
  4250. // пользователь не смог просмотреть чужое сообщение, просто указав
  4251. // ID сообщения в адресной строке браузера
  4252. $query = "SELECT a.to_user, a.from_user, a.subject, a.sendtime, a.message, a.viewed,
  4253. b.name AS to_user_name, c.name AS from_user_name
  4254. FROM ".TABLE_MESSAGES." a INNER JOIN ".TABLE_USERS." b
  4255. ON a.to_user=b.id_author
  4256. INNER JOIN ".TABLE_USERS." c
  4257. ON a.from_user=c.id_author
  4258. WHERE id_msg=".$idMsg."
  4259. AND (a.to_user=".$_SESSION['user']['id_author']." OR a.from_user=".$_SESSION['user']['id_author'].")
  4260. AND a.id_rmv<>".$_SESSION['user']['id_author'];
  4261. $res = mysql_query( $query );
  4262. if ( !$res ) {
  4263. $msg = 'Произошла ошибка при получении сообщения';
  4264. $err = 'Ошибка при выполнении запроса: <br/>'.
  4265. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4266. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4267. return showErrorMessage( $msg, $err, true, 'action=showInBox' );
  4268. }
  4269. if ( mysql_num_rows( $res ) == 0 ) {
  4270. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showInBox' );
  4271. die();
  4272. }
  4273. // Далее мы должны выяснить, запрашивается входящее или исходящее
  4274. // сообщение? Это нужно, чтобы правильно указать "Отправитель"
  4275. // или "Получатель" и вывести заголовок страницы: "Входящие"
  4276. // или "Исходящие"
  4277. $message = mysql_fetch_array( $res );
  4278. if ( $message['to_user'] == $_SESSION['user']['id_author'] ) {
  4279. $redirect = 'action=showInBox';
  4280. $inBox = true;
  4281. } else {
  4282. $redirect = 'action=showOutBox';
  4283. $inBox = false;
  4284. }
  4285. // Формируем заголовок страницы
  4286. if ( $inBox ) // Папка "Входящие"
  4287. $html = '<h1>Личные сообщения (входящие)</h1>'."\n";
  4288. else // Папка "Исходящие"
  4289. $html = '<h1>Личные сообщения (исходящие)</h1>'."\n";
  4290. $html = $html.getMessagesMenu();
  4291. $html = $html.'<table class="showTable">'."\n";
  4292. $html = $html.'<tr>'."\n";
  4293. $html = $html.'<th colspan="2">Сообщение</th>'."\n";
  4294. $html = $html.'</tr>'."\n";
  4295. $html = $html.'<tr>'."\n";
  4296. if ( $inBox ) {
  4297. $html = $html.'<td width="15%">Отправитель</td>'."\n";
  4298. $html = $html.'<td width="85%">'.$message['from_user_name'].'</td>'."\n";
  4299. } else {
  4300. $html = $html.'<td width="15%">Получатель</td>'."\n";
  4301. $html = $html.'<td width="85%">'.$message['to_user_name'].'</td>'."\n";
  4302. }
  4303. $html = $html.'</tr>'."\n";
  4304. $html = $html.'<tr>'."\n";
  4305. if ( $inBox )
  4306. $html = $html.'<td>Отправлено</td>'."\n";
  4307. else
  4308. $html = $html.'<td>Получено</td>'."\n";
  4309. $html = $html.'<td>'.$message['sendtime'].'</td>'."\n";
  4310. $html = $html.'<tr>'."\n";
  4311. $html = $html.'</tr>'."\n";
  4312. $html = $html.'<td>Тема</td>'."\n";
  4313. $html = $html.'<td>'.$message['subject'].'</td>'."\n";
  4314. $html = $html.'<tr>'."\n";
  4315. $html = $html.'</tr>'."\n";
  4316. $html = $html.'<td>Сообщение</td>'."\n";
  4317. $html = $html.'<td>'.print_page( $message['message'] ).'</td>'."\n";
  4318. $html = $html.'</tr>'."\n";
  4319. $html = $html.'</table>'."\n";
  4320.  
  4321. // Помечаем сообщение, как прочитанное
  4322. if ( $inBox and $message['viewed'] != 1 ) {
  4323. $query = "UPDATE ".TABLE_MESSAGES." SET viewed=1 WHERE id_msg=".$idMsg;
  4324. mysql_query( $query );
  4325. }
  4326.  
  4327. return $html;
  4328. }
  4329.  
  4330. // Папка личных сообщений (входящие)
  4331. function getInMsgBox()
  4332. {
  4333. if ( !isset( $_SESSION['user'] ) ) {
  4334. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4335. die();
  4336. }
  4337. $html = '<h1>Личные сообщения (входящие)</h1>'."\n";
  4338. $html = $html.getMessagesMenu();
  4339.  
  4340. $html = $html.'<table class="showTable">'."\n";
  4341. $html = $html.'<tr>'."\n";
  4342. $html = $html.'<th width="2%">&nbsp;</th>'."\n";
  4343. $html = $html.'<th width="15%">Отправитель</th>'."\n";
  4344. $html = $html.'<th width="63%">Тема сообщения</th>'."\n";
  4345. $html = $html.'<th width="15%">Дата</th>'."\n";
  4346. $html = $html.'<th width="5%">Удл.</th>'."\n";
  4347. $html = $html.'</tr>'."\n";
  4348. // Запрос на выборку входящих сообщений
  4349.  
  4350. // id_rmv - это поле указывает на то, что это сообщение уже удалил
  4351. // один из пользователей. Т.е. сначала id_rmv=0, после того, как
  4352. // сообщение удалил один из пользователей, id_rmv=id_user. И только после
  4353. // того, как сообщение удалит второй пользователь, мы можем удалить
  4354. // запись в таблице БД TABLE_MESSAGES
  4355. $query = "SELECT a.id_msg, a.subject, a.from_user, a.sendtime, a.viewed, b.name
  4356. FROM ".TABLE_MESSAGES." a INNER JOIN ".TABLE_USERS." b
  4357. ON a.from_user=b.id_author
  4358. WHERE a.to_user=".$_SESSION['user']['id_author']."
  4359. AND id_rmv<>".$_SESSION['user']['id_author']."
  4360. ORDER BY sendtime DESC";
  4361. $res = mysql_query( $query );
  4362.  
  4363. while ( $msg = mysql_fetch_row( $res ) ) {
  4364. $html = $html.'<tr>'."\n";
  4365. // Если сообщение еще не прочитано
  4366. if ( $msg[4] == 0 )
  4367. $html = $html.'<td align="center" valign="middle"><img src="./images/folder_new.gif" width="19"
  4368. height="18" alt="" /></td>';
  4369. else
  4370. $html = $html.'<td align="center" valign="middle"><img src="./images/folder.gif" width="19"
  4371. height="18" alt="" /></td>';
  4372. $html = $html.'<td>'.$msg[5].'</td>'."\n";
  4373. $html = $html.'<td><a href="'.$_SERVER['PHP_SELF'].'?action=showMsg&idMsg='.
  4374. $msg[0].'">'.$msg[1].'</a></td>'."\n";
  4375. $html = $html.'<td>'.$msg[3].'</td>'."\n";
  4376. $html = $html.'<td align="center"><a href="'.$_SERVER['PHP_SELF'].
  4377. '?action=deleteMsg&idMsg='.$msg[0].'"><img src="./images/icon_delete.gif"
  4378. alt="Удалить" title="Удалить" border="0" /></a></td>'."\n";
  4379. $html = $html.'</tr>'."\n";
  4380. }
  4381. if ( mysql_num_rows( $res ) == 0 ) {
  4382. $html = $html.'<tr>'."\n";
  4383. $html = $html.'<td colspan="4">В этой папке нет сообщений</td>'."\n";
  4384. $html = $html.'</tr>'."\n";
  4385. }
  4386. $html = $html.'</table>'."\n";
  4387.  
  4388. return $html;
  4389. }
  4390.  
  4391. // Папка личных сообщений (исходящие)
  4392. function getOutMsgBox()
  4393. {
  4394. if ( !isset( $_SESSION['user'] ) ) {
  4395. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4396. die();
  4397. }
  4398. $html = '<h1>Личные сообщения (исходящие)</h1>'."\n";
  4399. $html = $html.getMessagesMenu();
  4400.  
  4401. $html = $html.'<table class="showTable">'."\n";
  4402. $html = $html.'<tr>'."\n";
  4403. $html = $html.'<th width="15%">Получатель</th>'."\n";
  4404. $html = $html.'<th width="65%">Тема сообщения</th>'."\n";
  4405. $html = $html.'<th width="15%">Дата</th>'."\n";
  4406. $html = $html.'<th width="5%">Удл.</th>'."\n";
  4407. $html = $html.'</tr>'."\n";
  4408.  
  4409. // Запрос на выборку исходящих сообщений
  4410. // id_rmv - это поле указывает на то, что это сообщение уже удалил
  4411. // один из пользователей. Т.е. сначала id_rmv=0, после того, как
  4412. // сообщение удалил один из пользователей, id_rmv=id_user. И только после
  4413. // того, как сообщение удалит второй пользователь, мы можем удалить
  4414. // запись в таблице БД TABLE_MESSAGES
  4415. $query = "SELECT a.id_msg, a.subject, a.to_user, a.sendtime, b.name
  4416. FROM ".TABLE_MESSAGES." a INNER JOIN ".TABLE_USERS." b
  4417. ON a.to_user=b.id_author
  4418. WHERE a.from_user=".$_SESSION['user']['id_author']."
  4419. AND id_rmv<>".$_SESSION['user']['id_author']."
  4420. ORDER BY sendtime DESC";
  4421. $res = mysql_query( $query );
  4422.  
  4423. while ( $msg = mysql_fetch_row( $res ) ) {
  4424. $html = $html.'<tr>'."\n";
  4425. $html = $html.'<td>'.$msg[4].'</td>'."\n";
  4426. $html = $html.'<td><a href="'.$_SERVER['PHP_SELF'].'?action=showMsg&idMsg='.
  4427. $msg[0].'">'.$msg[1].'</a></td>'."\n";
  4428. $html = $html.'<td>'.$msg[3].'</td>'."\n";
  4429. $html = $html.'<td align="center"><a href="'.$_SERVER['PHP_SELF'].
  4430. '?action=deleteMsg&idMsg='.$msg[0].'"><img src="./images/icon_delete.gif"
  4431. alt="Удалить" title="Удалить" border="0" /></a></td>'."\n";
  4432. $html = $html.'</tr>'."\n";
  4433. }
  4434. if ( mysql_num_rows( $res ) == 0 ) {
  4435. $html = $html.'<tr>'."\n";
  4436. $html = $html.'<td colspan="4">В этой папке нет сообщений</td>'."\n";
  4437. $html = $html.'</tr>'."\n";
  4438. }
  4439. $html = $html.'</table>'."\n";
  4440.  
  4441. return $html;
  4442. }
  4443. // Функция удаляет личное сообщение; ID сообщения передается методом GET
  4444. function deleteMessage()
  4445. {
  4446. if ( !isset( $_SESSION['user'] ) ) {
  4447. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4448. die();
  4449. }
  4450.  
  4451. if ( !isset( $_GET['idMsg'] ) ) {
  4452. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4453. die();
  4454. }
  4455.  
  4456. $idMsg = (int)$_GET['idMsg'];
  4457. if ( $idMsg < 1 ) {
  4458. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4459. die();
  4460. }
  4461.  
  4462. // Далее мы должны выяснить, удаляется входящее или исходящее
  4463. // сообщение. Это нужно, чтобы сделать редирект на нужный ящик.
  4464. // В этом запросе дополнительное условие нужно для того, чтобы
  4465. // пользователь не смог удалить чужое сообщение, просто указав
  4466. // ID сообщения в адресной строке браузера
  4467. $query = "SELECT to_user, id_rmv
  4468. FROM ".TABLE_MESSAGES."
  4469. WHERE id_msg=".$idMsg." AND
  4470. (to_user=".$_SESSION['user']['id_author']." OR from_user=".$_SESSION['user']['id_author'].")";
  4471. $res = mysql_query( $query );
  4472. if ( mysql_num_rows( $res ) == 0 ) {
  4473. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showInBox' );
  4474. die();
  4475. }
  4476.  
  4477. list ( $toUser, $id_rmv ) = mysql_fetch_row( $res );
  4478. if ( $toUser == $_SESSION['user']['id_author'] )
  4479. $redirect = 'action=showInBox';
  4480. else
  4481. $redirect = 'action=showOutBox';
  4482. // id_rmv - это поле указывает на то, что это сообщение уже удалил
  4483. // один из пользователей. Т.е. сначала id_rmv=0, после того, как
  4484. // сообщение удалил один из пользователей, id_rmv=id_user. И только после
  4485. // того, как сообщение удалит второй пользователь, мы можем удалить
  4486. // запись в таблице БД TABLE_MESSAGES
  4487. if ( $id_rmv == 0 )
  4488. $query = "UPDATE ".TABLE_MESSAGES." SET id_rmv=".$_SESSION['user']['id_author']." WHERE id_msg=".$idMsg;
  4489. else
  4490. $query = "DELETE FROM ".TABLE_MESSAGES." WHERE id_msg=".$idMsg;
  4491. $res = mysql_query( $query );
  4492. if ( !$res ) {
  4493. $msg = 'Произошла ошибка при удалении сообщения';
  4494. $err = 'Ошибка при выполнении запроса: <br/>'.
  4495. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4496. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4497. return showErrorMessage( $msg, $err, true, $redirect );
  4498. }
  4499. return showInfoMessage( 'Сообщение успешно удалено', $redirect );
  4500. }
  4501.  
  4502. // Функция возвращает меню для раздела "Личные сообщения"
  4503. function getMessagesMenu()
  4504. {
  4505. $html = '<table width="100%">'."\n";
  4506. $html = $html.'<tr valign="middle">'."\n";
  4507. $html = $html.'<td><img src="./images/msg_inbox.gif" alt="Входящие" title="Входящие" /></td>'."\n";
  4508. $html = $html.'<td><a class="header" href="'.$_SERVER['PHP_SELF'].
  4509. '?action=showInBox">Входящие</a>&nbsp;&nbsp;</td>'."\n";
  4510. $html = $html.'<td><img src="./images/msg_outbox.gif" alt="Исходящие" title="Исходящие" /></td>'."\n";
  4511. $html = $html.'<td><a class="header" href="'.$_SERVER['PHP_SELF'].
  4512. '?action=showOutBox">Исходящие</a></td>'."\n";
  4513. $html = $html.'<td align="right" width="90%"><a href="'.$_SERVER['PHP_SELF'].
  4514. '?action=sendMsgForm"><img
  4515. src="./images/msg_newpost.gif" alt="Новое сообщение"
  4516. title="Новое сообщение" /></a></td>'."\n";
  4517. $html = $html.'</tr>'."\n";
  4518. $html = $html.'</table>'."\n";
  4519.  
  4520. return $html;
  4521. }
  4522.  
  4523. // Функция возвращает html формы для отправки письма через форум
  4524. function getSendMailForm()
  4525. {
  4526. // Если письмо пытается отправить незарегистрированный пользователь
  4527. if ( !isset( $_SESSION['user'] ) ) {
  4528. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4529. die();
  4530. }
  4531.  
  4532. $html = '';
  4533.  
  4534. $toUser = '';
  4535. if ( isset( $_GET['idUser'] ) ) {
  4536. $id = (int)$_GET['idUser'];
  4537. if ( $id > 0 ) {
  4538. $query = "SELECT name FROM ".TABLE_USERS." WHERE id_author=".$id;
  4539. $res = mysql_query( $query );
  4540. if ( $res ) {
  4541. if ( mysql_num_rows( $res ) > 0 ) $toUser = mysql_result( $res, 0, 0 );
  4542. }
  4543. }
  4544. }
  4545. $subject = '';
  4546. $message = '';
  4547.  
  4548. $action = $_SERVER['PHP_SELF'].'?action=sendMail';
  4549. // Если при заполнении формы были допущены ошибки
  4550. if ( isset( $_SESSION['sendMailForm'] ) ) {
  4551. $info = file_get_contents( './templates/infoMessage.html' );
  4552. $info = str_replace( '{infoMessage}', $_SESSION['sendMailForm']['error'], $info );
  4553. $html = $html.$info."\n";
  4554. $toUser = htmlspecialchars( $_SESSION['sendMailForm']['toUser'] );
  4555. $subject = htmlspecialchars( $_SESSION['sendMailForm']['subject'] );
  4556. $message = htmlspecialchars( $_SESSION['sendMailForm']['message'] );
  4557. unset( $_SESSION['sendMailForm'] );
  4558. }
  4559.  
  4560. $tpl = file_get_contents( 'templates/sendMailForm.html' );
  4561. $tpl = str_replace( '{action}', $action, $tpl );
  4562. $tpl = str_replace( '{toUser}', $toUser, $tpl );
  4563. $tpl = str_replace( '{subject}', $subject, $tpl );
  4564. $tpl = str_replace( '{message}', $message, $tpl );
  4565.  
  4566. $html = $html.$tpl;
  4567.  
  4568. return $html;
  4569. }
  4570.  
  4571. // Отправка письма пользователю сайта
  4572. function sendMail()
  4573. {
  4574. // Если не переданы данные формы - функция вызвана по ошибке
  4575. if ( !isset( $_POST['toUser'] ) or
  4576. !isset( $_POST['subject'] ) or
  4577. !isset( $_POST['message'] ) )
  4578. {
  4579. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4580. die();
  4581. }
  4582. // Если письмо пытается отправить незарегистрированный пользователь
  4583. if ( !isset( $_SESSION['user'] ) ) {
  4584. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4585. die();
  4586. }
  4587.  
  4588. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  4589. $toUser = substr( $_POST['toUser'], 0, 30 );
  4590. $subject = substr( $_POST['subject'], 0, 60 );
  4591. $message = substr( $_POST['message'], 0, MAX_MAILBODY_LENGTH );
  4592. // Обрезаем лишние пробелы
  4593. $toUser = trim( $toUser );
  4594. $subject = trim( $subject );
  4595. $message = trim( $message );
  4596.  
  4597. // Проверяем, заполнены ли обязательные поля
  4598. $error = '';
  4599. if ( empty( $toUser ) ) $error = $error.'<li>не заполнено поле "Для пользователя"</li>'."\n";
  4600. if ( empty( $subject ) ) $error = $error.'<li>не заполнено поле "Заголовок письма"</li>'."\n";
  4601. if ( empty( $message ) ) $error = $error.'<li>не заполнено поле "Текст письма"</li>'."\n";
  4602. // Проверяем поля формы на недопустимые символы
  4603. if ( !empty( $toUser ) and !preg_match( "#^[- _0-9a-zА-Яа-я]+$#i", $toUser ) )
  4604. $error = $error.'<li>поле "Для пользователя" содержит недопустимые символы</li>'."\n";
  4605. if ( !empty( $subject ) and !preg_match( "#^[-.;:,?!\/)(_\"\s0-9а-яА-Яa-z]+$#i", $subject ) )
  4606. $error = $error.'<li>поле "Заголовок письма" содержит недопустимые символы</li>'."\n";
  4607. // Проверяем, есть ли такой пользователь
  4608. if ( !empty( $toUser ) ) {
  4609. $to = preg_replace( "#[^- _0-9a-zа-яА-Я]#i", '', $toUser );
  4610. $query = "SELECT id_author, name, email FROM ".TABLE_USERS." WHERE name='".$to."' LIMIT 1";
  4611. $res = mysql_query( $query );
  4612. if ( !$res ) {
  4613. $msg = 'Произошла ошибка при отправке письма';
  4614. $err = 'Ошибка при выполнении запроса: <br/>'.
  4615. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4616. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4617. return showErrorMessage( $msg, $err, true, '' );
  4618. }
  4619. if ( mysql_num_rows( $res ) == 0 )
  4620. $error = $error.'<li>пользователь с именем <strong>'.$to.'</strong> не зарегистрирован</li>'."\n";
  4621. }
  4622. // Если были допущены ошибки при заполнении формы -
  4623. // перенаправляем посетителя для исправления ошибок
  4624. if ( !empty( $error ) )
  4625. {
  4626. $_SESSION['sendMailForm'] = array();
  4627. $_SESSION['sendMailForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  4628. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  4629. $_SESSION['sendMailForm']['toUser'] = $toUser;
  4630. $_SESSION['sendMailForm']['subject'] = $subject;
  4631. $_SESSION['sendMailForm']['message'] = $message;
  4632. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=sendMailForm' );
  4633. die();
  4634. }
  4635. $toUser = mysql_fetch_array( $res );
  4636. $fromUser = $_SESSION['user']['name'];
  4637.  
  4638. $message = 'ОТ: '.$fromUser."\n".'ТЕМА: '.$subject."\n\n".$message;
  4639.  
  4640. // формируем заголовки письма
  4641. $headers = "From: ".$_SERVER['SERVER_NAME']." <".ADMIN_EMAIL.">\n";
  4642. $headers = $headers."Content-type: text/plain; charset=\"windows-1251\"\n";
  4643. $headers = $headers."Return-path: <".ADMIN_EMAIL.">\n";
  4644. $subject = 'Письмо с форума '.$_SERVER['SERVER_NAME'].' от '.$fromUser;
  4645. $subject = '=?koi8-r?B?'.base64_encode(convert_cyr_string($subject, "w","k")).'?=';
  4646. if ( mail( $toUser['email'], $subject, $message, $headers ) )
  4647. return showInfoMessage( 'Ваше письмо успешно отправлено', '' );
  4648. else
  4649. return showInfoMessage( 'Произошла ошибка при отправке письма', '' );
  4650. }
  4651.  
  4652. // Вспомогательная функция - после выполнения пользователем каких-либо действий
  4653. // выдает информационное сообщение и делает редирект на нужную страницу с задержкой
  4654. function showInfoMessage( $message, $queryString )
  4655. {
  4656. if ( !empty( $queryString ) ) $queryString = '?'.$queryString;
  4657. header( 'Refresh: '.REDIRECT_DELAY.'; url='.$_SERVER['PHP_SELF'].$queryString );
  4658. $html = file_get_contents( './templates/infoMessage.html' );
  4659. $html = str_replace( '{infoMessage}', $message, $html );
  4660. return $html;
  4661. }
  4662.  
  4663. // Вспомогательная функция - выдает сообщение об ошибке
  4664. // и делает редирект на нужную страницу с задержкой
  4665. function showErrorMessage( $message = '', $error = '', $redirect = false, $queryString = '' )
  4666. {
  4667. if ( $redirect ) {
  4668. if ( !empty( $queryString ) ) $queryString = '?'.$queryString;
  4669. header( 'Refresh: '.REDIRECT_DELAY.'; url='.$_SERVER['PHP_SELF'].$queryString );
  4670. }
  4671. $html = file_get_contents( './templates/infoMessage.html' );
  4672. $html = str_replace( '{infoMessage}', $message, $html );
  4673. if ( DEBUG_MODE ) {
  4674. $tpl = file_get_contents( './templates/errorMessage.html' );
  4675. $tpl = str_replace( '{errorMessage}', $error, $tpl );
  4676. $html = $html.$tpl."\n";
  4677. }
  4678. return $html;
  4679. }
  4680.  
  4681. // Функция возвращает true или false в зависимости от того, имеет ли
  4682. // право пользователь редактировать сообщение (пост)
  4683. function hasRightEditPost( $post )
  4684. {
  4685. // Незарегистрированный пользователь не имеет право редактировать сообщения
  4686. if ( !isset( $_SESSION['user'] ) ) return false;
  4687. // Если пользователь - администратор или модератор, он имеет право
  4688. // редактировать любые сообщения (посты)
  4689. if ( $_SESSION['user']['status'] != 'user' ) return true;
  4690. // Обычный пользователь не может редактировать чужие сообщения (посты)
  4691. if ( $_SESSION['user']['id_author'] != $post['id_author'] ) return false;
  4692. // Пользователь не может редактировать сообщение, если оно заблокировано
  4693. if ( $post['locked'] == 1 ) return false;
  4694. // Обычный пользователь может редактировать свое сообщение,
  4695. // только если на него не было ответов
  4696. $query = "SELECT id_post FROM ".TABLE_POSTS."
  4697. WHERE id_theme=".$post['id_theme']." AND time>'".$post['time']."'";
  4698. $res = mysql_query( $query );
  4699. if ( !$res ) return false;
  4700. if ( mysql_num_rows( $res ) == 0 )
  4701. return true;
  4702. else
  4703. return false;
  4704. }
  4705.  
  4706. // Функция возвращает true или false в зависимости от того, имеет ли
  4707. // право пользователь удалить это сообщение (пост)
  4708. function hasRightDeletePost( $post )
  4709. {
  4710. // Незарегистрированный пользователь не имеет право удалять сообщения
  4711. if ( !isset( $_SESSION['user'] ) ) return false;
  4712. // Если пользователь - администратор или модератор, он имеет право
  4713. // удалять любые сообщения (посты)
  4714. if ( $_SESSION['user']['status'] != 'user' ) return true;
  4715. // Обычный пользователь не может удалять чужие сообщения (посты)
  4716. if ( $_SESSION['user']['id_author'] != $post['id_author'] ) return false;
  4717. // Пользователь не может удалять сообщение, если оно заблокировано
  4718. if ( $post['locked'] == 1 ) return false;
  4719. // Обычный пользователь имеет право удалять свои
  4720. // сообщения, если на них еще не было ответа
  4721. $query = "SELECT id_post FROM ".TABLE_POSTS."
  4722. WHERE id_theme=".$post['id_theme']." AND time>'".$post['time']."'";
  4723. $res = mysql_query( $query );
  4724. if ( !$res ) return false;
  4725. if ( mysql_num_rows( $res ) == 0 )
  4726. return true;
  4727. else
  4728. return false;
  4729. }
  4730.  
  4731. // Эта функция производит обновление времени последнего посещения зарегистрированного
  4732. // пользователя. Вызывается при каждом просмотре страницы форума зарегестрированным
  4733. // пользователем (если пользователь авторизовался)
  4734. function setTimeVisit()
  4735. {
  4736. $query = "UPDATE ".TABLE_USERS."
  4737. SET last_visit=NOW()
  4738. WHERE id_author=".$_SESSION['user']['id_author'];
  4739. mysql_query( $query );
  4740. }
  4741.  
  4742. // Функция возвращает html формы для авторизации на форуме
  4743. function getLoginForm()
  4744. {
  4745. $html = '';
  4746. if ( isset( $_SESSION['loginForm']['error'] ) ) {
  4747. $info = file_get_contents( './templates/infoMessage.html' );
  4748. $info = str_replace( '{infoMessage}', $_SESSION['loginForm']['error'], $info );
  4749. $html = $html.$info."\n";
  4750. unset( $_SESSION['loginForm']['error'] );
  4751. }
  4752. $action = $_SERVER['PHP_SELF'].'?action=login';
  4753. $newPassword = '<a href="'.$_SERVER['PHP_SELF'].'?action=newPasswordForm">Забыли пароль?</a>'."\n";
  4754. $tpl = file_get_contents( './templates/loginForm.html' );
  4755. $tpl = str_replace( '{action}', $action, $tpl );
  4756. $tpl = str_replace( '{newpassword}', $newPassword, $tpl );
  4757. $html = $html . $tpl;
  4758. return $html;
  4759. }
  4760.  
  4761. // Вход на форум - обработчик формы авторизации
  4762. function login()
  4763. {
  4764. // Если не переданы данные формы - значит функция была вызвана по ошибке
  4765. if ( !isset( $_POST['username'] ) or
  4766. !isset( $_POST['password'] ) )
  4767. {
  4768. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4769. die();
  4770. }
  4771.  
  4772. // Защита от перебора пароля - при каждой неудачной попытке время задержки увеличивается
  4773. if ( isset( $_SESSION['loginForm']['count'] ) ) sleep( $_SESSION['loginForm']['count'] );
  4774.  
  4775. // Обрезаем переменные до длины, указанной в параметре maxlength тега input
  4776. $name = substr( $_POST['username'], 0, 30 );
  4777. $password = substr( $_POST['password'], 0, 30 );
  4778.  
  4779. // Обрезаем лишние пробелы
  4780. $name = trim( $name );
  4781. $password = trim( $password );
  4782.  
  4783. // Проверяем, заполнены ли обязательные поля
  4784. $error = '';
  4785. if ( empty( $name ) ) $error = $error.'<li>не заполнено поле "Имя"</li>'."\n";
  4786. if ( empty( $password ) ) $error = $error.'<li>не заполнено поле "Пароль"</li>'."\n";
  4787.  
  4788. // Проверяем поля формы на недопустимые символы
  4789. if ( !empty( $name ) and !preg_match( "#^[- _0-9a-zА-Яа-я]+$#i", $name ) )
  4790. $error = $error.'<li>поле "Имя" содержит недопустимые символы</li>'."\n";
  4791. if ( !empty( $password ) and !preg_match( "#^[-_0-9a-z]+$#i", $password ) )
  4792. $error = $error.'<li>поле "Пароль" содержит недопустимые символы</li>'."\n";
  4793.  
  4794. // Проверять существование такого пользователя есть смысл только в том
  4795. // случае, если поля не пустые и не содержат недопустимых символов
  4796. if ( empty( $error ) ) {
  4797. // Выполняем запрос на получение данных пользователя из БД
  4798. $query = "SELECT *, UNIX_TIMESTAMP(last_visit) as unix_last_visit
  4799. FROM ".TABLE_USERS."
  4800. WHERE name='".mysql_real_escape_string( $name )."'
  4801. AND passw='".mysql_real_escape_string( md5( $password ) )."'
  4802. LIMIT 1";
  4803. $res = mysql_query( $query );
  4804. if ( !$res ) {
  4805. $msg = 'Ошибка при авторизации пользователя';
  4806. $err = 'Ошибка при выполнении запроса: <br/>'.
  4807. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4808. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4809. return showErrorMessage( $msg, $err, true, 'action=loginForm' );
  4810. }
  4811. if ( mysql_num_rows( $res ) == 0 )
  4812. $error = $error.'<li>Неправильный логин или пароль</li>'."\n";
  4813. }
  4814.  
  4815. // Если были допущены ошибки при заполнении формы
  4816. if ( !empty( $error ) ) {
  4817. if ( !isset( $_SESSION['loginForm']['count'] ) )
  4818. $_SESSION['loginForm']['count'] = 1;
  4819. else
  4820. $_SESSION['loginForm']['count'] = $_SESSION['loginForm']['count'] + 1;
  4821. $_SESSION['loginForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
  4822. "\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
  4823. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=loginForm' );
  4824. die();
  4825. }
  4826.  
  4827. // Все поля заполнены правильно и такой пользователь существует - продолжаем...
  4828. unset( $_SESSION['loginForm'] );
  4829. $user = mysql_fetch_assoc( $res );
  4830.  
  4831. if ( !empty( $user['activation'] ) )
  4832. return showInfoMessage( 'Ваша учетная запись не активирована', '' );
  4833.  
  4834. // Если пользователь заблокирован
  4835. if ( $user['locked'] )
  4836. return showInfoMessage( 'Ваша учетная запись заблокирована. Обратитесь к администратору.', '' );
  4837.  
  4838. $_SESSION['user'] = $user;
  4839.  
  4840. // Функция getNewThemes() помещает в массив $_SESSION['newThemes'] ID тем,
  4841. // в которых были новые сообщения со времени последнего посещения пользователя
  4842. getNewThemes();
  4843.  
  4844. // Выставляем cookie, если пользователь хочет входить на форум автоматически
  4845. if ( isset ( $_POST['autologin'] ) ) {
  4846. $tmppos = strrpos( $_SERVER['PHP_SELF'], '/' ) + 1;
  4847. $path = substr( $_SERVER['PHP_SELF'], 0, $tmppos );
  4848. setcookie( 'autologin', 'yes', time() + 3600*24*COOKIE_TIME, $path );
  4849. setcookie( 'username', $_SESSION['user']['name'], time() + 3600*24*COOKIE_TIME, $path );
  4850. setcookie( 'password', $_SESSION['user']['passw'], time() + 3600*24*COOKIE_TIME, $path );
  4851. }
  4852. // Авторизация прошла успешно - перенаправляем посетителя на главную страницу
  4853. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4854. die();
  4855. }
  4856.  
  4857. // Функция осуществляет автоматический вход на форум
  4858. function autoLogin()
  4859. {
  4860. // Если не установлены cookie, содержащие логин и пароль
  4861. if ( !isset( $_COOKIE['username'] ) or !isset( $_COOKIE['password'] ) ) {
  4862. $tmppos = strrpos( $_SERVER['PHP_SELF'], '/' ) + 1;
  4863. $path = substr( $_SERVER['PHP_SELF'], 0, $tmppos );
  4864. if ( isset( $_COOKIE['username'] ) ) setcookie( 'username', '', time() - 1, $path );
  4865. if ( isset( $_COOKIE['password'] ) ) setcookie( 'password', '', time() - 1, $path );
  4866. if ( isset( $_COOKIE['autologin'] ) ) setcookie( 'autologin', '', time() - 1, $path );
  4867. return false;
  4868. }
  4869. // Проверяем переменные cookie на недопустимые символы
  4870. $name = preg_replace( "#[^- _0-9a-zА-Яа-я]#i", '', $_COOKIE['username'] );
  4871. // Т.к. пароль зашифрован с помощью md5, то он представляет собой
  4872. // 32-значное шестнадцатеричное число
  4873. $password = substr( $_COOKIE['password'], 0, 32 );
  4874. $password = preg_replace( "#[^0-9a-f]#i", '', $password );
  4875.  
  4876. // Выполняем запрос на получение данных пользователя из БД
  4877. $query = "SELECT *, UNIX_TIMESTAMP(last_visit) as unix_last_visit
  4878. FROM ".TABLE_USERS."
  4879. WHERE name='".mysql_real_escape_string( $name )."'
  4880. AND passw='".mysql_real_escape_string( $password )."'
  4881. LIMIT 1";
  4882. $res = mysql_query( $query );
  4883. if ( !$res ) {
  4884. $msg = 'Ошибка при авторизации пользователя';
  4885. $err = 'Ошибка при выполнении запроса: <br/>'.
  4886. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4887. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4888. return showErrorMessage( $msg, $err, true, '' );
  4889. }
  4890. // Если пользователь с таким логином и паролем не найден -
  4891. // значит данные неверные и надо их удалить
  4892. if ( mysql_num_rows( $res ) == 0 ) {
  4893. $tmppos = strrpos( $_SERVER['PHP_SELF'], '/' ) + 1;
  4894. $path = substr( $_SERVER['PHP_SELF'], 0, $tmppos );
  4895. setcookie( 'autologin', '', time() - 1, $path );
  4896. setcookie( 'username', '', time() - 1, $path );
  4897. setcookie( 'password', '', time() - 1, $path );
  4898. return false;
  4899. }
  4900.  
  4901. $user = mysql_fetch_assoc( $res );
  4902. if ( !empty( $user['activation'] ) ) {
  4903. $tmppos = strrpos( $_SERVER['PHP_SELF'], '/' ) + 1;
  4904. $path = substr( $_SERVER['PHP_SELF'], 0, $tmppos );
  4905. setcookie( 'autologin', '', time() - 1, $path );
  4906. setcookie( 'username', '', time() - 1, $path );
  4907. setcookie( 'password', '', time() - 1, $path );
  4908. return showInfoMessage( 'Ваша учетная запись не активирована', '' );
  4909. }
  4910.  
  4911. // Если пользователь заблокирован
  4912. if ( $user['locked'] ) {
  4913. $tmppos = strrpos( $_SERVER['PHP_SELF'], '/' ) + 1;
  4914. $path = substr( $_SERVER['PHP_SELF'], 0, $tmppos );
  4915. setcookie( 'autologin', '', time() - 1, $path );
  4916. setcookie( 'username', '', time() - 1, $path );
  4917. setcookie( 'password', '', time() - 1, $path );
  4918. return showInfoMessage( 'Ваша учетная запись заблокирована. Обратитесь к администратору.', '' );
  4919. }
  4920.  
  4921. $_SESSION['user'] = $user;
  4922.  
  4923. // Функция getNewThemes() помещает в массив $_SESSION['newThemes'] ID тем,
  4924. // в которых были новые сообщения со времени последнего посещения пользователя
  4925. getNewThemes();
  4926.  
  4927. return true;
  4928. }
  4929.  
  4930. // Выход из системы
  4931. function logout()
  4932. {
  4933. unset( $_SESSION['user'] );
  4934. if ( isset( $_SESSION['newThemes'] ) ) unset( $_SESSION['newThemes'] );
  4935. $tmppos = strrpos( $_SERVER['PHP_SELF'], '/' ) + 1;
  4936. $path = substr( $_SERVER['PHP_SELF'], 0, $tmppos );
  4937. if ( isset( $_COOKIE['autologin'] ) ) setcookie( 'autologin', '', time() - 1, $path );
  4938. if ( isset( $_COOKIE['username'] ) ) setcookie( 'username', '', time() - 1, $path );
  4939. if ( isset( $_COOKIE['password'] ) ) setcookie( 'password', '', time() - 1, $path );
  4940. header( 'Location: '.$_SERVER['PHP_SELF'] );
  4941. die();
  4942. }
  4943.  
  4944. // Функция возвращает html формы для поиска по форуму
  4945. function searchForm()
  4946. {
  4947. $html = '';
  4948.  
  4949. $query = "SELECT id_forum, name FROM ".TABLE_FORUMS." WHERE 1 ORDER BY pos";
  4950. $res = mysql_query( $query );
  4951. if ( !$res ) {
  4952. $msg = 'Ошибка при формировании формы для поиска';
  4953. $err = 'Ошибка при выполнении запроса: <br/>'.
  4954. $query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
  4955. '(Файл '. __FILE__ .', строка '. __LINE__ .')';
  4956. return showErrorMessage( $msg, $err, true, '' );
  4957. }
  4958. if ( mysql_num_rows( $res ) > 0 ) {
  4959. $options = '<option value="0">Все имеющиеся</option>'."\n";
  4960. while( $forum = mysql_fetch_row( $res ) ) {
  4961. $options = $options.'<option value="'.$forum[0].'">'.$forum[1].'</option>'."\n";
  4962. }
  4963. $html = file_get_contents( './templates/searchForm.html' );
  4964. $action = $_SERVER['PHP_SELF'].'?action=searchResult';
  4965. $html = str_replace( '{options}', $options, $html );
  4966. $html = str_replace( '{action}', $action, $html );
  4967. }
  4968.  
  4969. return $html;
  4970. }
  4971.  
  4972. function searchResult()
  4973. {
  4974.  
  4975. if ( isset( $_POST['words'] ) and
  4976. isset( $_POST['id_forum'] ) and
  4977. isset( $_POST['where'] ) )
  4978. {
  4979. if ( empty( $_POST['words'] ) ) {
  4980. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=searchForm' );
  4981. die();
  4982. }
  4983. // Обрезаем строку до длины, указанной в атрибуте maxlength
  4984. $search = substr( $_POST['words'], 0, 64 );
  4985. // Убираем пробелы в начале и конце строки поиска
  4986. $search = trim( $search );
  4987. // Убираем все "ненормальные" символы
  4988. $good = preg_replace("#[^a-zа-я\s\-]#i", " ", $search);
  4989. $good = trim( $good );
  4990. if ( empty( $good ) ) {
  4991. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=searchForm' );
  4992. die();
  4993. }
  4994. // Сжимаем двойные пробелы
  4995. $good = ereg_replace(" +", " ", $good);
  4996.  
  4997. // Получаем корни искомых слов
  4998. $stemmer = new Lingua_Stem_Ru();
  4999. $tmp = explode( " ", $good );
  5000. foreach ( $tmp as $wrd ) {
  5001. // Если слово слишком короткое - не используем его
  5002. if ( strlen($wrd) < 3 ) continue;
  5003. $words[] = $stemmer->stem_word($wrd);
  5004. }
  5005. // Склеиваем массив $words обратно в строку
  5006. $string = implode( "* ", $words );
  5007. $string = $string."*";
  5008.  
  5009. // Теперь надо выяснить, где будем искать
  5010. $where = $_POST['where'];
  5011. $whereArray = array( 'themes', 'posts', 'everywhere' );
  5012. if ( !in_array( $where, $whereArray ) ) $where = 'themes';
  5013.  
  5014. // Записываем все данные в сессию - это нам понадобится при
  5015. // построении постраничной навигации результатов поиска
  5016. $_SESSION['search']['query'] = $search;
  5017. $_SESSION['search']['good'] = $good;
  5018. $_SESSION['search']['words'] = $words;
  5019. // Это нам потребуется для подсветки искомых слов
  5020. $_SESSION['search']['words'] = implode( '|', $words );
  5021. $_SESSION['search']['string'] = $string;
  5022. $_SESSION['search']['where'] = $where;
  5023. $id_forum = (int)$_POST['id_forum'];
  5024. if ( $id_forum < 0 ) $id_forum = 0;
  5025. $_SESSION['search']['id_forum'] = $id_forum;
  5026.  
  5027. header( 'Location: '.$_SERVER['PHP_SELF'].'?action=searchResult' );
  5028. die();
  5029. }
  5030.  
  5031. if ( !isset( $_SESSION['search'] ) ) {
  5032. header( 'Location: '.$_SERVER['PHP_SELF'] );
  5033. die();
  5034. }
  5035.  
  5036. // Если поиск осуществляется по названиям тем
  5037. if ( $_SESSION['search']['where'] == 'themes' )
  5038. $result = searchResultThemes();
  5039. else if ( $_SESSION['search']['where'] == 'posts' )
  5040. $result = searchResultPosts();
  5041. else
  5042. $result = searchResultEverywhere();
  5043.  
  5044. $html = '<table class="showTable">'."\n";
  5045. $html = $html.'<tr>'."\n";
  5046. $html = $html.'<th>Результаты поиска</th>'."\n";
  5047. $html = $html.'<tr>'."\n";
  5048. $html = $html.'</table>'."\n";
  5049.  
  5050. $html = $html.$result."\n";
  5051.  
  5052. return $html;
  5053. }
  5054.  
  5055. // Поиск только в названиях тем
  5056. function searchResultThemes()
  5057. {
  5058. // Составляем запрос к БД, чтобы узнать количество записей в результатах поиска -
  5059. // это нужно для построения постраничной навигации
  5060. $forum = '';
  5061. if ( $_SESSION['search']['id_forum'] ) $forum = ' AND id_forum='.$_SESSION['search']['id_forum'];
  5062. $query = "SELECT COUNT(*)
  5063. FROM ".TABLE_THEMES."
  5064. WHERE MATCH (name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE)".$forum;
  5065. $res = mysql_query( $query );
  5066. $total = mysql_result( $res, 0, 0 );
  5067. if ( $total == 0 ) return 'По вашему запросу ничего не найдено';
  5068.  
  5069. // Число страниц результатов поиска (постраничная навигация)
  5070. $cntPages = ceil( $total / SEARCH_THEMES_PER_PAGE );
  5071.  
  5072. // Проверяем передан ли номер текущей страницы (постраничная навигация)
  5073. if ( isset($_GET['page']) ) {
  5074. $page = (int)$_GET['page'];
  5075. if ( $page < 1 ) $page = 1;
  5076. } else {
  5077. $page = 1;
  5078. }
  5079.  
  5080. if ( $page > $cntPages ) $page = $cntPages;
  5081. // Начальная позиция (постраничная навигация)
  5082. $start = ( $page - 1 ) * SEARCH_THEMES_PER_PAGE;
  5083.  
  5084. // Строим постраничную навигацию, если это необходимо
  5085. if ( $cntPages > 1 ) {
  5086. // Функция возвращает html меню для постраничной навигации
  5087. $pages = pageIterator( $page, $cntPages, $_SERVER['PHP_SELF'].'?action=searchResult' );
  5088. }
  5089.  
  5090. $query = "SELECT id_theme, name, id_forum
  5091. FROM ".TABLE_THEMES."
  5092. WHERE MATCH (name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE)".$forum."
  5093. ORDER BY MATCH (name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE) DESC
  5094. LIMIT ".$start.", ".SEARCH_THEMES_PER_PAGE;
  5095. $res = mysql_query( $query );
  5096. $html = "<ul>\n";
  5097. while ( $theme = mysql_fetch_array( $res ) ) {
  5098. $html = $html.'<li><a class="topictitle" href="'.$_SERVER["PHP_SELF"]."?action=showTheme".
  5099. '&idForum='.$theme['id_forum'].'&id_theme='.$theme['id_theme'].'&page=1">'.
  5100. $theme['name'].'</a></li>'."\n";
  5101. }
  5102. $html = $html."</ul>\n";
  5103.  
  5104. // Постраничная навигация
  5105. if ( isset( $pages ) ) $html = $html.$pages."\n";
  5106.  
  5107. return $html;
  5108. }
  5109.  
  5110. // Поиск в сообщениях (постах)
  5111. function searchResultPosts()
  5112. {
  5113. // Составляем запрос к БД, чтобы узнать количество записей в результатах поиска -
  5114. // это нужно для построения постраничной навигации
  5115. $forum = '';
  5116. if ( $_SESSION['search']['id_forum'] ) $forum = ' AND b.id_forum='.$_SESSION['search']['id_forum'];
  5117. $query = "SELECT COUNT(*)
  5118. FROM ".TABLE_POSTS." a INNER JOIN ".TABLE_THEMES." b
  5119. ON a.id_theme=b.id_theme
  5120. WHERE MATCH (a.name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE)".$forum;
  5121.  
  5122. $res = mysql_query( $query );
  5123. $total = mysql_result( $res, 0, 0 );
  5124.  
  5125. if ( $total == 0 ) return 'По вашему запросу ничего не найдено';
  5126.  
  5127. // Число страниц результатов поиска (постраничная навигация)
  5128. $cntPages = ceil( $total / SEARCH_POSTS_PER_PAGE );
  5129.  
  5130. // Проверяем передан ли номер текущей страницы (постраничная навигация)
  5131. if ( isset($_GET['page']) ) {
  5132. $page = (int)$_GET['page'];
  5133. if ( $page < 1 ) $page = 1;
  5134. } else {
  5135. $page = 1;
  5136. }
  5137.  
  5138. if ( $page > $cntPages ) $page = $cntPages;
  5139. // Начальная позиция (постраничная навигация)
  5140. $start = ( $page - 1 ) * SEARCH_POSTS_PER_PAGE;
  5141.  
  5142. // Строим постраничную навигацию, если это необходимо
  5143. if ( $cntPages > 1 ) {
  5144. // Функция возвращает html меню для постраничной навигации
  5145. $pages = pageIterator( $page, $cntPages, $_SERVER['PHP_SELF'].'?action=searchResult' );
  5146. }
  5147.  
  5148. $query = "SELECT a.id_post, a.name, a.id_theme, b.id_forum, b.name
  5149. FROM ".TABLE_POSTS." a INNER JOIN ".TABLE_THEMES." b
  5150. ON a.id_theme=b.id_theme
  5151. WHERE MATCH (a.name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE)".$forum."
  5152. ORDER BY MATCH (a.name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE) DESC
  5153. LIMIT ".$start.", ".SEARCH_POSTS_PER_PAGE;
  5154.  
  5155. $res = mysql_query( $query );
  5156. $html = '';
  5157. while ( $post = mysql_fetch_row( $res ) ) {
  5158.  
  5159. $html = $html.'<div style="margin: 5px 0 5px 0">'."\n";
  5160. $html = $html.'<img src="./images/folder.gif" width="19" height="18" alt="" align="top" />
  5161. <a class="topictitle" href="'.$_SERVER["PHP_SELF"]."?action=showTheme".
  5162. '&idForum='.$post[3].'&id_theme='.$post[2].'&page=1">'.$post[4].'</a>'."\n";
  5163. $html = $html.'</div>'."\n";
  5164.  
  5165. $html = $html.'<table class="postTable">'."\n";
  5166. $html = $html.'<tr>'."\n";
  5167. $html = $html.'<td>'."\n";
  5168. $message = print_page( $post[1] );
  5169. $message = preg_replace("/\b(".$_SESSION['search']['words'].")(.*?)\b/i",
  5170. "<span style='color:red; font-weight:bold'>\\0</span>", $message);
  5171. $html = $html.$message."\n";
  5172. $html = $html.'</td>'."\n";
  5173. $html = $html.'</tr>'."\n";
  5174. $html = $html."</table>\n";
  5175. }
  5176.  
  5177. // Постраничная навигация
  5178. if ( isset( $pages ) ) $html = $html.$pages."\n";
  5179.  
  5180. return $html;
  5181. }
  5182.  
  5183. // Поиск в названиях тем и сообщениях
  5184. function searchResultEverywhere()
  5185. {
  5186. // Составляем запрос к БД, чтобы узнать количество записей в результатах поиска -
  5187. // это нужно для построения постраничной навигации
  5188. $forum = '';
  5189. if ( $_SESSION['search']['id_forum'] ) $forum = ' AND b.id_forum='.$_SESSION['search']['id_forum'];
  5190. $query = "SELECT COUNT(*)
  5191. FROM ".TABLE_POSTS." a INNER JOIN ".TABLE_THEMES." b
  5192. ON a.id_theme=b.id_theme
  5193. WHERE MATCH (a.name, b.name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE)".$forum;
  5194.  
  5195. $res = mysql_query( $query );
  5196. $total = mysql_result( $res, 0, 0 );
  5197.  
  5198. if ( $total == 0 ) return 'По вашему запросу ничего не найдено';
  5199.  
  5200. // Число страниц результатов поиска (постраничная навигация)
  5201. $cntPages = ceil( $total / SEARCH_EVERYWHERE_PER_PAGE );
  5202.  
  5203. // Проверяем передан ли номер текущей страницы (постраничная навигация)
  5204. if ( isset($_GET['page']) ) {
  5205. $page = (int)$_GET['page'];
  5206. if ( $page < 1 ) $page = 1;
  5207. } else {
  5208. $page = 1;
  5209. }
  5210.  
  5211. if ( $page > $cntPages ) $page = $cntPages;
  5212. // Начальная позиция (постраничная навигация)
  5213. $start = ( $page - 1 ) * SEARCH_EVERYWHERE_PER_PAGE;
  5214.  
  5215. // Строим постраничную навигацию, если это необходимо
  5216. if ( $cntPages > 1 ) {
  5217. // Функция возвращает html меню для постраничной навигации
  5218. $pages = pageIterator( $page, $cntPages, $_SERVER['PHP_SELF'].'?action=searchResult' );
  5219. }
  5220.  
  5221. $query = "SELECT a.id_post, a.name, a.id_theme, b.id_forum, b.name
  5222. FROM ".TABLE_POSTS." a INNER JOIN ".TABLE_THEMES." b
  5223. ON a.id_theme=b.id_theme
  5224. WHERE MATCH (a.name, b.name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE)".$forum."
  5225. ORDER BY MATCH (a.name, b.name) AGAINST ('".$_SESSION['search']['string']."' IN BOOLEAN MODE) DESC
  5226. LIMIT ".$start.", ".SEARCH_EVERYWHERE_PER_PAGE;
  5227.  
  5228. $res = mysql_query( $query );
  5229. $html = '';
  5230. while ( $post = mysql_fetch_row( $res ) ) {
  5231.  
  5232. $html = $html.'<div style="margin: 5px 0 5px 0">'."\n";
  5233. $html = $html.'<img src="./images/folder.gif" width="19" height="18" alt="" align="top" />
  5234. <a class="topictitle" href="'.$_SERVER["PHP_SELF"]."?action=showTheme".
  5235. '&idForum='.$post[3].'&id_theme='.$post[2].'&page=1">'.$post[4].'</a>'."\n";
  5236. $html = $html.'</div>'."\n";
  5237.  
  5238. $html = $html.'<table class="postTable">'."\n";
  5239. $html = $html.'<tr>'."\n";
  5240. $html = $html.'<td>'."\n";
  5241. $message = print_page( $post[1] );
  5242. $message = preg_replace("/\b(".$_SESSION['search']['words'].")(.*?)\b/i",
  5243. "<span style='color:red; font-weight:bold'>\\0</span>", $message);
  5244. $html = $html.$message."\n";
  5245. $html = $html.'</td>'."\n";
  5246. $html = $html.'</tr>'."\n";
  5247. $html = $html."</table>\n";
  5248. }
  5249.  
  5250. // Постраничная навигация
  5251. if ( isset( $pages ) ) $html = $html.$pages."\n";
  5252.  
  5253. return $html;
  5254. }
  5255.  
  5256. // Функция getNewThemes() помещает в массив $_SESSION['newThemes'] ID тем,
  5257. // в которых были новые сообщения со времени последнего посещения пользователя
  5258. function getNewThemes()
  5259. {
  5260. // Получаем список тем форума, где были новые сообщения
  5261. $query = "SELECT a.id_theme, MAX(UNIX_TIMESTAMP(b.time)) AS unix_last_post
  5262. FROM ".TABLE_THEMES." a INNER JOIN ".TABLE_POSTS." b
  5263. ON a.id_theme=b.id_theme
  5264. GROUP BY a.id_theme
  5265. HAVING unix_last_post>".$_SESSION['user']['unix_last_visit'];
  5266.  
  5267. $res = mysql_query( $query );
  5268. if ( $res ) {
  5269. while ( $id = mysql_fetch_row( $res ) ) {
  5270. $_SESSION['newThemes'][$id[0]] = $id[0];
  5271. }
  5272. }
  5273. }
  5274.  
  5275. // Функция countNewMessages() возвращает количество
  5276. // личных сообщений, которые пользователь еще не прочитал
  5277. function countNewMessages()
  5278. {
  5279.  
  5280. $query = "SELECT COUNT(*)
  5281. FROM ".TABLE_MESSAGES."
  5282. WHERE to_user=".$_SESSION['user']['id_author']."
  5283. AND viewed=0 AND id_rmv<>".$_SESSION['user']['id_author'];
  5284. $res = mysql_query( $query );
  5285. if ( $res )
  5286. return mysql_result( $res, 0, 0 );
  5287. else
  5288. return 0;
  5289.  
  5290. }
  5291.  
  5292. // Функция возвращает html меню для постраничной навигации
  5293. function pageIterator( $page, $cntPages, $url )
  5294. {
  5295.  
  5296. $html = '<div class="pagesDiv">&nbsp;Страницы: ';
  5297. // Проверяем нужна ли стрелка "В начало"
  5298. if ( $page > 3 )
  5299. $startpage = '<a class="pages" href="'.$url.'&page=1"><<</a> ... ';
  5300. else
  5301. $startpage = '';
  5302. // Проверяем нужна ли стрелка "В конец"
  5303. if ( $page < ($cntPages - 2) )
  5304. $endpage = ' ... <a class="pages" href="'.$url.'&page='.$cntPages.'">>></a>';
  5305. else
  5306. $endpage = '';
  5307.  
  5308. // Находим две ближайшие станицы с обоих краев, если они есть
  5309. if ( $page - 2 > 0 )
  5310. $page2left = ' <a class="pages" href="'.$url.'&page='.($page - 2).'">'.($page - 2).'</a> | ';
  5311. else
  5312. $page2left = '';
  5313. if ( $page - 1 > 0 )
  5314. $page1left = ' <a class="pages" href="'.$url.'&page='.($page - 1).'">'.($page - 1).'</a> | ';
  5315. else
  5316. $page1left = '';
  5317. if ( $page + 2 <= $cntPages )
  5318. $page2right = ' | <a class="pages" href="'.$url.'&page='.($page + 2).'">'.($page + 2).'</a>';
  5319. else
  5320. $page2right = '';
  5321. if ( $page + 1 <= $cntPages )
  5322. $page1right = ' | <a class="pages" href="'.$url.'&page='.($page + 1).'">'.($page + 1).'</a>';
  5323. else
  5324. $page1right = '';
  5325.  
  5326. // Выводим меню
  5327. $html = $html.$startpage.$page2left.$page1left.'<strong>'.$page.'</strong>'.
  5328. $page1right.$page2right.$endpage."\n";
  5329.  
  5330. $html = $html.'</div>'."\n";
  5331.  
  5332. return $html;
  5333. }
  5334.  
  5335. // Статистика форума
  5336. function getStat()
  5337. {
  5338. $html = '<table class="showTable">'."\n";
  5339. $html = $html.'<tr><th>Статистика</th></tr>'."\n";
  5340. $html = $html.'<tr>'."\n";
  5341. $html = $html.'<td>'."\n";
  5342. $html = $html.'<div class="details">'."\n";
  5343. $query = 'SELECT COUNT(*) FROM '.TABLE_POSTS;
  5344. $res = mysql_query( $query );
  5345. if ( !$res ) return '';
  5346. $html = $html.'Наши пользователи оставили сообщений: '.mysql_result( $res, 0, 0 ).'<br/>'."\n";
  5347. $query = 'SELECT COUNT(*) FROM '.TABLE_USERS;
  5348. $res = mysql_query( $query );
  5349. if ( !$res ) return '';
  5350. $html = $html.'Всего зарегистрированных пользователей: '.mysql_result( $res, 0, 0 ).'<br/>'."\n";
  5351. $query = 'SELECT id_author, name FROM '.TABLE_USERS.' ORDER BY id_author DESC LIMIT 1';
  5352. $res = mysql_query( $query );
  5353. if ( !$res ) return '';
  5354. list( $id_user, $name ) = mysql_fetch_array( $res );
  5355. $html = $html.'Последний зарегистрированный пользователь: '.
  5356. '<a href="'.$_SERVER['PHP_SELF'].'?action=showUserInfo&idUser='.
  5357. $id_user.'">'.$name.'</a><br/>'."\n";
  5358. // Пользователи on-line
  5359. if ( isset( $_SESSION['usersOnLine'] ) ) {
  5360. $cnt = count( $_SESSION['usersOnLine'] );
  5361. $onLine = '';
  5362. if ( $cnt > 0 ) {
  5363. $onLine = $onLine.'Сейчас на форуме: ';
  5364. foreach ( $_SESSION['usersOnLine'] as $id => $name ) {
  5365. $onLine = $onLine.'<a href="'.$_SERVER['PHP_SELF'].
  5366. '?action=showUserInfo&idUser='.$id.'">'.$name.'</a>, ';
  5367. }
  5368. $onLine = substr( $onLine, 0, (strlen( $onLine )-2) );
  5369. }
  5370. $html = $html.$onLine."\n";
  5371. }
  5372. $html = $html.'</div>'."\n";
  5373. $html = $html.'</td>'."\n";
  5374. $html = $html.'</tr>'."\n";
  5375. $html = $html.'</table>'."\n";
  5376.  
  5377. return $html;
  5378. }
  5379.  
  5380. // Функция помещает в массив $_SESSION['usersOnLine'] список зарегистрированных
  5381. // пользователей, которые в настоящий момент просматривают форум
  5382. function getUsersOnLine()
  5383. {
  5384. $query = "SELECT id_author, name
  5385. FROM ".TABLE_USERS."
  5386. WHERE UNIX_TIMESTAMP(last_visit)>".( time() - 60 * TIME_ON_LINE )."
  5387. ORDER BY status DESC";
  5388. $res = mysql_query( $query );
  5389. if ( $res ) {
  5390. if ( isset( $_SESSION['usersOnLine'] ) ) unset( $_SESSION['usersOnLine'] );
  5391. $cnt = mysql_num_rows( $res );
  5392. if ( $cnt > 0 ) {
  5393. for ( $i = 0; $on = mysql_fetch_array( $res ); $i++ ) {
  5394. $_SESSION['usersOnLine'][$on['id_author']] = $on['name'];
  5395. }
  5396. }
  5397. }
  5398. return;
  5399. }
  5400.  
  5401. // Функция возвращает форму для быстрого ответа в тему
  5402. function getQuickReplyForm( $id_theme )
  5403. {
  5404. $html = file_get_contents( './templates/quickReplyForm.html' );
  5405. $action = $_SERVER['PHP_SELF'].'?action=quickReply&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
  5406. $html = str_replace( '{action}', $action, $html );
  5407. return $html;
  5408. }
  5409.  
  5410. // Возвращает размер файла в Кб
  5411. function getFileSize( $file )
  5412. {
  5413. return number_format( (filesize($file)/1024), 2, '.', '' );
  5414. }
  5415.  
  5416. ?>
Add Comment
Please, Sign In to add comment