Скрипт форума на PHP своими руками. Часть 6
Продолжаем разговор про темы и сообщения. Модератор форума может не только редактировать чужие сообщения, но и заблокировать (разблокировать), отредактировать и удалить тему. Функции lockTheme() и unlockTheme() позволяют, соответственно, закрыть и открыть тему.
Функция lockTheme()
<?php
// Закрыть тему
function lockTheme()
{
// Если тему пытается закрыть не зарегистрированный пользователь
if ( !isset( $_SESSION['user'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Только администратор или модератор может закрыть тему
if ( $_SESSION['user']['status'] == 'user' ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID форума - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID темы, которую надо закрыть
if ( !isset( $_GET['id_theme'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Сначала заблокируем сообщения (посты) темы
$query = "UPDATE ".TABLE_POSTS." SET locked=1 WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при попытке заблокировать тему';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
// Теперь заблокируем тему
$query = "UPDATE ".TABLE_THEMES." SET locked=1 WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при попытке заблокировать тему';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
return showInfoMessage( 'Тема закрыта',
'action=showForum&idForum='.$_GET['idForum'] );
}
?>
Функция unlockTheme()
<?php
// Открыть тему
function unlockTheme()
{
// Если тему пытается разблокировать не зарегистрированный пользователь
if ( !isset( $_SESSION['user'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Только администратор или модератор может разблокировать тему
if ( $_SESSION['user']['status'] == 'user' ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID форума - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID темы, которую надо разблокировать
if ( !isset( $_GET['id_theme'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Сначала разблокируем сообщения (посты) темы
$query = "UPDATE ".TABLE_POSTS." SET locked=0 WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при попытке разблокировать тему';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
// Теперь разблокируем тему
$query = "UPDATE ".TABLE_THEMES." SET locked=0 WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при попытке разблокировать тему';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
return showInfoMessage( 'Тема открыта',
'action=showForum&idForum='.$_GET['idForum'] );
}
?>
Функция getEditThemeForm() возвращает форму для редактирования темы.
<?php
// Функция возвращает форму для редактирования темы;
// ID форума и темы передаются методом GET
function getEditThemeForm()
{
// Если не передан ID форума - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID темы - значит функция была вызвана по ошибке
if ( !isset( $_GET['id_theme'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Получаем из БД информацию о редактируемой теме
$query = "SELECT name, author, id_forum FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при формировании формы для редактирования темы';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_num_rows( $res ) == 0 ) {
header( 'Location: '.$_SERVER['PHP_SELF'].'action=showForum&idForum='.$_GET['idForum'] );
die();
}
$theme = mysql_fetch_array( $res );
$_GET['idForum'] = $theme['id_forum'];
$html = '';
// Если при заполнении формы были допущены ошибки
if ( isset( $_SESSION['editThemeForm'] ) ) {
$html = $html.$_SESSION['editThemeForm']['error'];
$name = htmlspecialchars( $_SESSION['editThemeForm']['name'] );
unset( $_SESSION['editThemeForm'] );
} else {
$name = htmlspecialchars( $theme['name'] );
}
// Формируем список форумов, чтобы можно было переместить тему в другой форум
$query = "SELECT id_forum, name FROM ".TABLE_FORUMS." WHERE 1 ORDER BY pos";
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при формировании формы для редактирования темы';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_num_rows( $res ) == 0 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$options = '';
while ( $forum = mysql_fetch_array( $res ) ) {
if ( $forum['id_forum'] == $theme['id_forum'] )
$options = $options.'<option value="'.$forum['id_forum'].'" selected>'.$forum['name'].'</option>'."\n";
else
$options = $options.'<option value="'.$forum['id_forum'].'">'.$forum['name'].'</option>'."\n";
}
$action = $_SERVER['PHP_SELF'].'?action=updateTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
// Считываем в переменную файл шаблона, содержащего форму для редактирования темы
$tpl = file_get_contents( './templates/editThemeForm.html' );
$tpl = str_replace( '{action}', $action, $tpl );
$tpl = str_replace( '{name}', htmlspecialchars( $theme['name'] ), $tpl );
$tpl = str_replace( '{author}', htmlspecialchars( $theme['author'] ), $tpl );
$tpl = str_replace( '{options}', $options, $tpl );
$html = $html. $tpl;
return $html;
}
?>
Обработчик формы - функция updateTheme().
<?php
// Функция обновляет информацию о теме (запись в таблице БД TABLE_THEMES);
// уникальный ID темы передается методом GET
function updateTheme()
{
// Если не переданы данные формы - функция вызвана по ошибке
if ( !isset( $_GET['idForum'] ) or
!isset( $_GET['id_theme'] ) or
!isset( $_POST['id_forum'] ) or
!isset( $_POST['name'] ) )
{
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
die();
}
$id_forum = (int)$_POST['id_forum'];
if ( $id_forum < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
die();
}
// Если тему пытается редактировать не зарегистрированный пользователь
if ( !isset( $_SESSION['user'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'].'action=showForum&idForum='.$_GET['idForum'] );
die();
}
// Проверяем, имеет ли право этот пользователь редактировать тему
if ( $_SESSION['user']['status'] == 'user' ) {
$msg = 'У вас нет прав для редактирования темы';
return showInfoMessage( $msg, 'action=showForum&idForum='.$_GET['idForum'] );
}
// Обрезаем переменные до длины, указанной в параметре maxlength тега input
$name = substr( $_POST['name'], 0, 128 );
// Обрезаем лишние пробелы
$name = trim( $name );
// Проверяем, заполнены ли обязательные поля
$error = '';
if ( empty( $name ) ) $error = $error.'<li>не заполнено поле "Тема"</li>'."\n";
// Проверяем поля формы на недопустимые символы
if ( !empty( $name ) and !preg_match( "#^[-.;:,?!/)=(_\"\s0-9а-яА-Яa-z]+$#i", $name ) )
$error = $error.'<li>поле "Тема" содержит недопустимые символы</li>'."\n";
// Если были допущены ошибки при заполнении формы -
// перенаправляем пользователя для исправления ошибок
if ( !empty( $error ) )
{
$_SESSION['editThemeForm'] = array();
$_SESSION['editThemeForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
"\n".'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
$_SESSION['editThemeForm']['name'] = $name;
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editThemeForm&idForum='.
$_GET['idForum'].'&id_theme='.$id_theme );
die();
}
// Если тема перемещается в другой форум, мы
// должны проверить, что этот форум существует
$tmp = '';
if ( $id_forum != $_GET['idForum'] ) {
$query = "SELECT id_forum FROM ".TABLE_FORUMS." WHERE 1";
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при обновлении темы';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
while ( $id = mysql_fetch_row( $res ) ) $ids[] = $id[0];
if ( !in_array( $id_forum, $ids ) )
return showInfoMessage( 'Ошибка при обновлении темы', 'action=showForum&idForum='.$_GET['idForum'] );
else
$tmp = ', id_forum='.$id_forum;
}
// Запрос на обновление темы
$query = "UPDATE ".TABLE_THEMES."
SET name='".mysql_real_escape_string( $name )."'".$tmp."
WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при обновлении темы';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
} else {
return showInfoMessage( 'Обновление темы прошло успешно', 'action=showForum&idForum='.$_GET['idForum'] );
}
}
?>
И, наконец, функция deleteTheme().
<?php
// Функция удаляет тему; ID темы передается методом GET
function deleteTheme()
{
// Если тему пытается удалить не зарегистрированный пользователь
if ( !isset( $_SESSION['user'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Только администратор или модератор может удалить тему
if ( $_SESSION['user']['status'] == 'user' ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID форума - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID темы, которую надо удалить
if ( !isset( $_GET['id_theme'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Выдаем пользователю сообщение с просьбой подтвердить свое
// желание удалить тему
if ( !isset( $_GET['confirm'] ) ) {
$html = '<div align="center"><p>Вы действительно хотите удалить эту тему?</p>'."\n";
$html = $html.'<input type="button" name="yes" value="Да"
onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=deleteTheme&idForum='.
$_GET['idForum'].'&id_theme='.$id_theme.'&confirm=yes\'" /> '."\n";
$html = $html.'<input type="button" name="no" value="Нет"
onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.
$_GET['idForum'].'\'" /></div>'."\n";
$tpl = file_get_contents( './templates/infoMessage.html' );
$tpl = str_replace( '{infoMessage}', $html, $tpl );
return $tpl;
}
// Сперва мы должны удалить все сообщения (посты) темы;
// начнем с того, что удалим файлы вложений
$query = "SELECT putfile, id_author FROM ".TABLE_POSTS."
WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении темы';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_num_rows( $res ) > 0 ) {
while( $file = mysql_fetch_row( $res ) ) {
if ( !empty( $file[0] ) and is_file( './files/'.$file[0] ) ) unlink( is_file( './files/'.$file[0] ) );
// заодно обновляем таблицу TABLE_USERS - надо обновить поле posts (кол-во сообщений)
if ( $file[1] ) {
$q = "UPDATE ".TABLE_USERS." SET posts=posts-1 WHERE id_author=".$file[1];
$r = mysql_query( $q );
}
}
}
// Продолжаем - удаляем сообщения (посты)
$query = "DELETE FROM ".TABLE_POSTS." WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении темы';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
// Обновляем таблицу TABLE_USERS - надо обновить поле themes
$query = "UPDATE ".TABLE_USERS." SET themes=themes-1
WHERE id_author=(SELECT id_author FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme.")";
mysql_query( $query );
// Теперь удаляем тему (запись в таблице TABLE_THEMES)
$query = "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении темы';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
return showInfoMessage( 'Тема удалена',
'action=showForum&idForum='.$_GET['idForum'] );
}
?>
Продолжение следует...
|