WebScript.Ru
C:\   главная  ::   о сайте  ::  каталог скриптов  ::  гнездо  ::  форум  ::   авторам  :: Новостройки ::   ХОСТИНГ  ::

|| разделы::
|| поиск по сайту::

|| реклама::
|| новости почтой::
Рассылки Subscribe.Ru ::



Новости сайта WebScript.Ru
Популярные статьи

Hot 5 Stories

|| рекомендуем::




Скрипт форума на PHP своими руками. Часть 6


Прислал: Евгений Токмаков [ 03.07.2008 @ 12:55 ]
Раздел:: [ Статьи по PHP ]


Продолжаем разговор про темы и сообщения. Модератор форума может не только редактировать чужие сообщения, но и заблокировать (разблокировать), отредактировать и удалить тему. Функции 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 ) {
    
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().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'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().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'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 ) {
    
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().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'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().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'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 ) {
    
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().':&nbsp;'.mysql_error().'<br/>'.
      
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'action=showForum&idForum='.$_GET['idForum'] );
  } 
  if ( 
mysql_num_rows$res ) == ) {
    
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().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'action=showForum&idForum='.$_GET['idForum'] );
  }
  if ( 
mysql_num_rows$res ) == ) {
    
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 ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
    die();
  }
  
$id_forum = (int)$_POST['id_forum'];
  if ( 
$id_forum ) {
    
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'], 0128 );
  
// Обрезаем лишние пробелы
  
$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().':&nbsp;'.mysql_error().'<br/>'.
             
'(Файл '__FILE__ .', строка '__LINE__ .')';
      return 
showErrorMessage$msg$errtrue'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().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'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 ) {
    
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\'" />&nbsp;&nbsp;'."\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().':&nbsp;'.mysql_error().'<br/>'.
            
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'action=showForum&idForum='.$_GET['idForum'] );
  }
  if ( 
mysql_num_rows$res ) > ) {
    while( 
$file mysql_fetch_row$res ) ) {
      if ( !empty( 
$file[0] ) and is_file'./files/'.$file[0] ) ) unlinkis_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().':&nbsp;'.mysql_error().'<br/>'.
            
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'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().':&nbsp;'.mysql_error().'<br/>'.
            
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'action=showForum&idForum='.$_GET['idForum'] );
  }
  
  return 
showInfoMessage'Тема удалена'
                          
'action=showForum&idForum='.$_GET['idForum'] );
}
?>

Продолжение следует...




Нет комментариев.
Имя:
Email:
URL

Введите сумму двух чисел девять и одинн (девять+одинн=?)
Запомнить мою информацию

* Html запрещен* Ваш E-mail опубликован не будет.

Copyright © 2000-2001 WebScript.Ru nas@webscript.ru
Design © 2001 by Parallax Design Studio (aka Spectator.ru)
Все торговые марки и авторские права на эту страницу принадлежат их соответствующим владельцам.
Сгенерировано за: 0.0519409