PHP

Скрипт форума на 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'] ); 
} 
?>

Продолжение следует...
Теги:
форум
Добавлено: 22 Сентября 2013 01:37:51 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...