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

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

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



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

Hot 5 Stories

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




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


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


Наконец, заключительная статья. В ней мы рассмотрим систему администрирования форума. Собственно, системы администрирования как таковой не существует. Просто некоторые пользователи форума, имеющие статус администратора (поле status в таблице БД TABLE_USERS) имеют право добавлять новые форумы и удалять или редактировать существующие. Кроме того, администратор может редактировать профиль любого другого пользователя.

Функция getAddForumForm() возвращает форму для добавления нового форума:

<?php
// Функция возвращает форму для добавления нового форума
function getAddForumForm()
{
  
// Если форум пытается создать не зарегистрированный пользователь
  
if ( !isset( $_SESSION['user'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Проверяем, иммет ли право этот пользователь создавать форумы
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
  
$html '';
  
  
$action $_SERVER['PHP_SELF'].'?action=addForum';
  
$title '';
  
$description '';
  
  
// Если при заполнении формы были допущены ошибки
  
if ( isset( $_SESSION['addForumForm'] ) ) {
    
$info file_get_contents'./templates/infoMessage.html' );
    
$info str_replace'{infoMessage}'$_SESSION['addForumForm']['error'], $info );
    
$html $html.$info."n";
    
$title  htmlspecialchars$_SESSION['addForumForm']['title'] );
    
$description htmlspecialchars$_SESSION['addForumForm']['description'] );
    unset( 
$_SESSION['addForumForm'] );
  }
  
  
// Считываем в переменную содержимое файла, 
  // содержащего форму для добавления форума
  
$tpl file_get_contents'./templates/addForumForm.html' );
  
$tpl str_replace'{action}'$action$tpl );
  
$tpl str_replace'{title}'''$tpl );
  
$tpl str_replace'{description}'''$tpl );
  
  
$html $html $tpl;
  
  return 
$html;
}
?>

Обработчик формы - функция addForum():

<?php
// Функция добавляет новый форум (новую запись в таблицу БД TABLE_FORUMS)
function addForum()
{
  
// Если форум пытается создать не зарегистрированный пользователь
  
if ( !isset( $_SESSION['user'] ) )  {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Проверяем, имеет ли право этот пользователь создавать форумы
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
  
// Если не переданы данные формы - значит функция была вызвана по ошибке
  
if ( !isset( $_POST['title'] ) or
       !isset( 
$_POST['description'] ) )
  {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
  
// Обрезаем переменные до длины, указанной в параметре maxlength тега input
  
$title  substr$_POST['title'], 0120 );
  
$description substr$_POST['description'], 0250 );
  
// Обрезаем лишние пробелы
  
$title  trim$title );
  
$description trim$description );
  
  
// Проверяем, заполнены ли обязательные поля
  
$error '';
  if ( empty( 
$title ) ) $error $error.'<li>не заполнено поле "Название форума"</li>'."n";
  if ( empty( 
$description ) ) $error $error.'<li>не заполнено поле "Описание"</li>'."n";
  
// Проверяем поля формы на недопустимые символы
  
if ( !empty( $title ) and !preg_match"#^[-.;:,?!/)(_"s0-9а-яА-Яa-z]+$#i"$title ) )
    
$error $error.'<li>поле "Название форума" содержит недопустимые символы</li>'."n";
  if ( !empty( 
$description ) and !preg_match"#^[-.;:,?!/)(_"s0-9а-яА-Яa-z]+$#i"$description ) )
    
$error $error.'<li>поле "Описание" содержит недопустимые символы</li>'."n";
    
  
// Если были допущены ошибки при заполнении формы - 
  // перенаправляем посетителя для исправления ошибок
  
if ( !empty( $error ) ) {
    
$_SESSION['addForumForm'] = array();
    
$_SESSION['addForumForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
    
"n".'<ul class="errorMsg">'."n".$error.'</ul>'."n";
    
$_SESSION['addForumForm']['title'] = $title;
    
$_SESSION['addForumForm']['description'] = $description;
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=addForumForm' );
    die();
  }
  
// Порядок следования - новый форум будет в конце списка
  
$query "SELECT IFNULL(MAX(pos), 0) FROM ".TABLE_FORUMS;
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при добавлении нового форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  }
  
$order mysql_result$res0) + 1;
  
$query "INSERT INTO ".TABLE_FORUMS."
            (
            name,
            description,
            pos
            )
            VALUES
            (
            '"
.mysql_real_escape_string$title )."',
            '"
.mysql_real_escape_string$description )."',
            "
.$order."
            )"
;
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при добавлении нового форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
      
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
      
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  }
  
  return 
showInfoMessage'Новый форум успешно добавлен''' );
}
?>

Функция getEditForumForm() возвращает форму для редактирования форума:

<?php
// Функция возвращает форму для редактирования форума;
// уникальный ID форума передается методом GET
function getEditForumForm()
{
  
// Если форум пытается редактировать не зарегистрированный пользователь
  
if ( !isset( $_SESSION['user'] ) )  {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Проверяем, имеет ли право этот пользователь редактировать форум
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Если не передан ID форума - функция вызвана по ошибке
  
if ( !isset( $_GET['idForum'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  } 
  
  
$html '';
  
  
// Получаем из БД информацию о форуме
  
$query "SELECT name, description FROM ".TABLE_FORUMS." WHERE id_forum=".$_GET['idForum'];
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при формировании формы для редактирования форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
      
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
      
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  }
  
$forum mysql_fetch_array$res );
  
$action $_SERVER['PHP_SELF'].'?action=updateForum&idForum='.$_GET['idForum'];
  
  
// Если при заполнении формы были допущены ошибки
  
if ( isset( $_SESSION['editForumForm'] ) ) {    
    
$info file_get_contents'./templates/infoMessage.html' );
    
$info str_replace'{infoMessage}'$_SESSION['editForumForm']['error'], $info );
    
$html $html.$info."n";    
    
$title  htmlspecialchars$_SESSION['editForumForm']['title'] );
    
$description htmlspecialchars$_SESSION['editForumForm']['description'] );
    unset( 
$_SESSION['editForumForm'] );
  } else {
    
$title htmlspecialchars$forum['name'] );
    
$description htmlspecialchars$forum['description'] );
  }
  
// Считываем в переменную содержимое файла, 
  // содержащего форму для редактирования форума
  
$tpl file_get_contents'./templates/editForumForm.html' );
  
$tpl str_replace'{action}'$action$tpl );
  
$tpl str_replace'{title}'$title$tpl );
  
$tpl str_replace'{description}'$description$tpl );
  
  
$html $html $tpl;
  
  return 
$html;
}
?>

Обработчик формы - функция updateForum():

<?php
// Функция обновляет информацию о форуме (запись в таблице БД TABLE_FORUMS);
// уникальный ID форума передается методом GET
function updateForum()
{
  
// Если форум пытается редактировать не зарегистрированный пользователь
  
if ( !isset( $_SESSION['user'] ) )  {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Проверяем, имеет ли право этот пользователь редактировать форум
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  } 
  
// Если не передан ID форума - функция вызвана по ошибке
  
if ( !isset( $_GET['idForum'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }

  
// Обрезаем переменные до длины, указанной в параметре maxlength тега input
  
$title  substr$_POST['title'], 0120 );
  
$description substr$_POST['description'], 0250 );
  
// Обрезаем лишние пробелы
  
$title  trim$title );
  
$description trim$description );
  
  
// Проверяем, заполнены ли обязательные поля
  
$error '';
  if ( empty( 
$title ) ) $error $error.'<li>не заполнено поле "Название форума"</li>'."n";
  if ( empty( 
$description ) ) $error $error.'<li>не заполнено поле "Описание"</li>'."n";
  
// Проверяем поля формы на недопустимые символы
  
if ( !empty( $title ) and !preg_match"#^[-.;:,?!/)(_"s0-9а-яА-Яa-z]+$#i"$title ) )
    
$error $error.'<li>поле "Название форума" содержит недопустимые символы</li>'."n";
  if ( !empty( 
$description ) and !preg_match"#^[-.;:,?!/)(_"s0-9а-яА-Яa-z]+$#i"$description ) )
    
$error $error.'<li>поле "Описание" содержит недопустимые символы</li>'."n";
    
  
// Если были допущены ошибки при заполнении формы - 
  // перенаправляем посетителя для исправления ошибок
  
if ( !empty( $error ) )
  {
    
$_SESSION['editForumForm'] = array();
    
$_SESSION['editForumForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
    
"n".'<ul class="errorMsg">'."n".$error.'</ul>'."n";
    
$_SESSION['editForumForm']['title'] = $title;
    
$_SESSION['editForumForm']['description'] = $description;
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=editForumForm&idForum='.$_GET['idForum'] );
    die();
  }
  
// Все поля заполнены правильно - выполняем запрос
  
$query "UPDATE ".TABLE_FORUMS.
            SET 
            name='"
.mysql_real_escape_string$title )."', 
            description='"
.mysql_real_escape_string$description )."'
            WHERE id_forum="
.$_GET['idForum'];
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при обновлении форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
          
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  } 
    
  return 
showInfoMessage'Обновление форума прошло успешно''' ); 
}
?>

Функции forumUp() и forumDown() изменяют порядок следования форумов на главной странице - позволяют поднять форум вверх и опустить вниз:

<?php
function forumUp()
{
  
// Если форум пытается редактировать не зарегистрированный пользователь
  
if ( !isset( $_SESSION['user'] ) )  {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Проверяем, имеет ли право этот пользователь редактировать форум
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  } 
  
// Если не передан ID форума - функция вызвана по ошибке
  
if ( !isset( $_GET['idForum'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Форум, который "поднимается" вверх
  
$id_forum_up $_GET['idForum'];
  
$query "SELECT pos FROM ".TABLE_FORUMS." WHERE id_forum=".$id_forum_up;
  
$res mysql_query$query );
  
// Порядок следования форума, который "поднимается" вверх
  
$order_up mysql_result$res0);
  
$query "SELECT id_forum, pos  
            FROM "
.TABLE_FORUMS.
            WHERE pos<"
.$order_up.
            ORDER BY pos DESC LIMIT 1"
;    
  
$res mysql_query$query );
  
// Если форум, который "поднимается" вверх и так выше всех (первый в списке)
  
if ( mysql_num_rows$res ) == ) return true;
  
// Порядок следования и ID форума, который находится выше и будет "опущен" вниз
  // ( поменявшись местами с форумом, который "поднимается" вверх )
  
list( $id_forum_down$order_down ) = mysql_fetch_array$res );
  
// Меняем местами форумы
  
$query1 "UPDATE ".TABLE_FORUMS." SET pos=".$order_down." WHERE id_forum=".$id_forum_up;
  
$res1 mysql_query$query1 );
  
$query2 "UPDATE ".TABLE_FORUMS." SET pos=".$order_up." WHERE id_forum=".$id_forum_down;
  
$res2 mysql_query$query2 );
  if ( 
$res1 and $res2 )
    return 
showInfoMessage'Операция прошла успешно''' );
  else
    return 
showInfoMessage'Ошибка при выполнении операции''' );
}

function 
forumDown()
{
  
// Если форум пытается редактировать не зарегистрированный пользователь
  
if ( !isset( $_SESSION['user'] ) )  {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Проверяем, имеет ли право этот пользователь редактировать форум
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  } 
  
// Если не передан ID форума - функция вызвана по ошибке
  
if ( !isset( $_GET['idForum'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Форум, который "опускается" вниз
  
$id_forum_down $_GET['idForum'];
  
$query "SELECT pos FROM ".TABLE_FORUMS." WHERE id_forum=".$id_forum_down;
  
$res mysql_query$query );
  
// Порядок следования форума, который "опускается" вниз
  
$order_down mysql_result$res0);
  
$query "SELECT id_forum, pos  
            FROM "
.TABLE_FORUMS.
            WHERE pos>"
.$order_down.
            ORDER BY pos LIMIT 1"
;
  
$res mysql_query$query );
  
// Если форум, который "опускается" вниз и так ниже всех (последний в списке)
  
if ( mysql_num_rows$res ) == ) return true;
  
// Порядок следования и ID форума, который находится ниже и будет "поднят" вверх
  // ( поменявшись местами с форумом, который "опускается" вниз )
  
list( $id_forum_up$order_up ) = mysql_fetch_array$res );
  
// Меняем местами форумы
  
$query1 "UPDATE ".TABLE_FORUMS." SET pos=".$order_down." WHERE id_forum=".$id_forum_up;
  
$res1 mysql_query$query1 );
  
$query2 "UPDATE ".TABLE_FORUMS." SET pos=".$order_up." WHERE id_forum=".$id_forum_down;
  
$res2 mysql_query$query2 );
  if ( 
$res1 and $res2 )
    return 
showInfoMessage'Операция прошла успешно''' );
  else
    return 
showInfoMessage'Ошибка при выполнении операции''' );
}
?>

Функция deleteForum() удаляет существующий форум:

<?php
// Функция удаляет форум (запись в таблице TABLE_FORUMS)
function deleteForum()
{
  
// Не зарегистрированный пользователь не может добавить тему
  
if ( !isset( $_SESSION['user'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Форум может удалить только администратор
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();  
  }
  
// Если не передан ID форума - значит функция вызвана по ошибке
  
if ( !isset( $_GET['idForum'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Можно удалить только форум, который не содержит тем (в целях безопасности)
  
$query "SELECT COUNT(*) FROM ".TABLE_THEMES." WHERE id_forum=".$_GET['idForum'];
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при удалении форума';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
           
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );          
  } 
  if ( 
mysql_result$res0) > )
    return 
showInfoMessage'Нельзя удалить форум, который содержит темы''' );
  else
    return 
showInfoMessage'Форум успешно удален''' );  
}
?>

Функция getEditUserFormByAdmin() возвращает форму, которая позволяет администратору отредактировать профиль участника:

<?php
// Функция возвращает html формы для редактирования данных о пользователе
// (только для администратора форума)
function getEditUserFormByAdmin()
{
  
// Если не передан ID пользователя - значит функция вызвана по ошибке
  
if ( !isset( $_GET['idUser'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
    die();
  }
  
$id = (int)$_GET['idUser'];
  
// ID зарегистрированного пользователя не может быть меньше 
  // единицы - значит функция вызвана по ошибке
  
if ( $id ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
    die();
  }
  
// Если информацию о пользователе пытается редактировать 
  // не зарегистрированный пользователь
  
if ( !isset( $_SESSION['user'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Только администратор имеет право на эту операцию
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
  
$statusArray = array( 'user' => 'Пользователь',
                        
'moderator' => 'Модератор',
                        
'admin' => 'Администратор' );  
  
$html '';
  
  
// Если при заполнении формы были допущены ошибки
  
if ( isset( $_SESSION['editUserFormByAdmin'] ) ) {
    
$info file_get_contents'./templates/infoMessage.html' );
    
$info str_replace'{infoMessage}'$_SESSION['editUserFormByAdmin']['error'], $info );
    
$html $html.$info."n";
    
$name      htmlspecialchars$_SESSION['editUserFormByAdmin']['name'] );
    
$status    $_SESSION['editUserFormByAdmin']['status'];
    
$email     htmlspecialchars$_SESSION['editUserFormByAdmin']['email'] );
    
$oldEmail  htmlspecialchars$_SESSION['editUserFormByAdmin']['oldEmail'] );
    
$timezone  $_SESSION['editUserFormByAdmin']['timezone'];
    
$icq       htmlspecialchars$_SESSION['editUserFormByAdmin']['icq'] );
    
$url       htmlspecialchars$_SESSION['editUserFormByAdmin']['url'] );
    
$about     htmlspecialchars$_SESSION['editUserFormByAdmin']['about'] );
    
$signature htmlspecialchars$_SESSION['editUserFormByAdmin']['signature'] );
    unset( 
$_SESSION['editUserFormByAdmin'] );
  } else {
    
// Получаем данные о пользователе из БД
    
$query "SELECT id_author, name, email, url, icq, about, photo, status, timezone, signature 
              FROM "
.TABLE_USERS.
              WHERE id_author="
.$id;
    
$res mysql_query$query );
    if ( !
$res ) {
      
$msg 'Ошибка при получении информации о пользователе';
      
$err 'Ошибка при выполнении запроса: <br/>'.
             
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
             
'(Файл '__FILE__ .', строка '__LINE__ .')';
      return 
showErrorMessage$msg$err'action=showUsersList'true );
    }
    if ( 
mysql_num_rows$res ) == 
      return 
showInfoMessage'Пользователь не найден''action=showUsersList' );
    
$user mysql_fetch_array$res );
    
    
$name      htmlspecialchars$user['name'] );
    
$status    $user['status'];
    
$email     htmlspecialchars$user['email'] );
    
$oldEmail  $email;
    
$timezone  $user['timezone'];
    
$icq       htmlspecialchars$user['icq'] );
    
$url       htmlspecialchars$user['url'] );
    
$about     htmlspecialchars$user['about'] );
    
$signature htmlspecialchars$user['signature'] );
  }

  
$userStatus '<select name="status">'."n";
  foreach( 
$statusArray as $key => $value ) {
    if ( 
$key == $status )
      
$userStatus $userStatus.'<option value="'.$key.'" selected>'.$value.'</option>'."n";
    else
      
$userStatus $userStatus.'<option value="'.$key.'">'.$value.'</option>'."n";
  }
  
$userStatus $userStatus.'</select>'."n";
  
  
$action $_SERVER['PHP_SELF'].'?action=updateUserByAdmin&idUser='.$id;
  
  
$tpl file_get_contents'./templates/editUserFormByAdmin.html' );
  
$tpl str_replace'{action}'$action$tpl );
  
$tpl str_replace'{name}'htmlspecialchars$name ), $tpl );
  
$tpl str_replace'{status}'$userStatus$tpl );
  
$tpl str_replace'{email}'htmlspecialchars$email ), $tpl );
  
$tpl str_replace'{icq}'htmlspecialchars$icq ), $tpl );
  
$tpl str_replace'{url}'htmlspecialchars$url ), $tpl );
  
$tpl str_replace'{about}'htmlspecialchars$about ), $tpl );
  
$tpl str_replace'{signature}'htmlspecialchars$signature ), $tpl );
  
  
$options '';
  for ( 
$i = -12$i <= 12$i++ ) {
    if ( 
$i 
      
$value $i.' часов';
    else
      
$value '+'.$i.' часов';
    if ( 
$i == $timezone )
      
$options $options '<option value="'.$i.'" selected>'.$value.'</option>'."n";
    else
      
$options $options '<option value="'.$i.'">'.$value.'</option>'."n";
  }
  
$tpl str_replace'{options}'$options$tpl);
  
$tpl str_replace'{servertime}'date"d.m.Y H:i:s" ), $tpl );
  
// Если ранее был загружен файл - надо предоставить возможность удалить его
  
$unlinkfile '';
  if ( 
is_file'./photo/'.$id ) ) {
    
$unlinkfile '<br/><input type="checkbox" name="unlink" value="1" />
                  Удалить загруженный ранее файл'
."n";
  }
  
$tpl str_replace'{unlinkfile}'$unlinkfile$tpl );
  
  
$html $html.$tpl;
  
  return 
$html;
}
?>

Обработчик формы - функция updateUserByAdmin():

<?php
// Функция обновляет данные пользователя (только для администратора форума)
function updateUserByAdmin()
{
  
// Если не передан ID пользователя - значит функция вызвана по ошибке
  
if ( !isset( $_GET['idUser'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
    die();
  }
  
$id = (int)$_GET['idUser'];
  
// ID зарегистрированного пользователя не может быть меньше 
  // единицы - значит функция вызвана по ошибке
  
if ( $id ) {
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=showUsersList' );
    die();
  }
  
// Если профиль пытается редактировать не зарегистрированный 
  // пользователь - функция вызвана по ошибке
  
if ( !isset( $_SESSION['user'] ) ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Только администратор имеет право на эту операцию
  
if ( $_SESSION['user']['status'] != 'admin' ) {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }
  
// Если не переданы данные формы - функция вызвана по ошибке
  
if ( !isset( $_POST['name'] ) or
       !isset( 
$_POST['status'] ) or
       !isset( 
$_POST['email'] ) or
       !isset( 
$_POST['oldEmail'] ) or
       !isset( 
$_POST['newpassword'] ) or
       !isset( 
$_POST['confirm'] ) or
       !isset( 
$_POST['timezone'] ) or
       !isset( 
$_POST['icq'] ) or
       !isset( 
$_POST['url'] ) or
       !isset( 
$_POST['about'] ) or
       !isset( 
$_POST['signature'] ) or
       !isset( 
$_FILES['avatar'] ) 
    )
  {
    
header'Location: '.$_SERVER['PHP_SELF'] );
    die();
  }

  
// Обрезаем переменные до длины, указанной в параметре maxlength тега input
  
$email        substr$_POST['email'], 060 );
  
$oldEmail     substr$_POST['oldEmail'], 060 );
  
$newpassword  substr$_POST['newpassword'], 030 );
  
$confirm      substr$_POST['confirm'], 030 );
  
$icq          substr$_POST['icq'], 012 );
  
$url          substr$_POST['url'], 060 );
  
$about        substr$_POST['about'], 01000 );
  
$signature    substr$_POST['signature'], 0500 );

  
// Обрезаем лишние пробелы
  
$email        trim$email );
  
$oldEmail     trim$oldEmail );
  
$newpassword  trim$newpassword );
  
$confirm      trim$confirm );
  
$icq          trim$icq );
  
$url          trim$url );
  
$about        trim$about );
  
$signature    trim$signature );

  
// Проверяем, заполнены ли обязательные поля
  
$error '';
  
  
// Надо выяснить, что хочет сделать администратор: 
  // поменять e-mail, изменить пароль или и то и другое
  
$changePassword false;
  
$changeEmail false;
    
  if ( !empty( 
$newpassword ) ) { // хочет изменить пароль
    
$changePassword true;
    if ( empty( 
$confirm ) ) $error $error.'<li>не заполнено поле "Подтвердите пароль"</li>'."n";
    
// Проверяем, не слишком ли короткий новый пароль
    
if ( strlen$newpassword ) < MIN_PASSWORD_LENGTH )
      
$error $error.'<li>длина пароля должна быть не меньше '.MIN_PASSWORD_LENGTH.' символов</li>'."n";
    
// Проверяем, совпадают ли пароли
    
if ( !empty( $confirm ) and $newpassword != $confirm 
      
$error $error.'<li>не совпадают пароли</li>'."n";
    
// Проверяем поля формы на недопустимые символы
    
if (  !preg_match"#^[-_0-9a-z]+$#i"$newpassword ) )
      
$error $error.'<li>поле "Новый пароль" содержит недопустимые символы</li>'."n";
    if ( !empty( 
$confirm ) and !preg_match"#^[-_0-9a-z]+$#i"$confirm ) )
      
$error $error.'<li>поле "Подтвердите пароль" содержит недопустимые символы</li>'."n";
  }
  if ( 
$email != $oldEmail ) { // хочет изменить e-mail
    
$changeEmail true;
    if ( empty( 
$email ) ) $error $error.'<li>не заполнено поле "Адрес e-mail"</li>'."n";
    
// Проверяем корректность e-mail
    
if ( !empty( $email ) and !preg_match"#^[0-9a-z_-.]+@[0-9a-z-.]+.[a-z]{2,6}$#i"$email ) )
      
$error $error.'<li>поле "Адрес e-mail" должно соответствовать формату 
               somebody@somewhere.ru</li>'
."n";    
  }    
  
  
// Проверяем поля формы на недопустимые символы
  
if ( !empty( $icq ) and !preg_match"#^[0-9]+$#"$icq ) )
    
$error $error.'<li>поле "ICQ" содержит недопустимые символы</li>'."n";
  if ( !empty( 
$about ) and !preg_match"#^[-[].;:,?!/)(_"s0-9а-яА-Яa-z]+$#i"$about ) )
    
$error $error.'<li>поле "Интересы" содержит недопустимые символы</li>'."n";
  if ( !empty( 
$signature ) and !preg_match"#^[-[].;:,?!/)(_"s0-9а-яА-Яa-z]+$#i"$signature ) )
    
$error $error.'<li>поле "Подпись" содержит недопустимые символы</li>'."n";
    
  
// Проверяем корректность URL домашней странички    
  
if ( !empty( $url ) and !preg_match"#^(//)?(www.)?[-0-9a-z]+.[a-z]{2,6}/?$#i"$url ) )
    
$error $error.'<li>поле "Домашняя страничка" должно соответствовать формату //www.homepage.ru</li>'."n";

  if ( !empty( 
$_FILES['avatar']['name'] ) ) {
    
$ext strrchr$_FILES['avatar']['name'], "." );
    
$extensions = array( ".jpg"".gif"".bmp"".png" );
    if ( !
in_array$ext$extensions ) ) 
      
$error $error.'<li>недопустимый формат файла аватара</li>'."n";
    if ( 
$_FILES['avatar']['size'] > MAX_AVATAR_SIZE 
      
$error $error.'<li>размер файла аватора больше '.(MAX_AVATAR_SIZE/1024).' Кб</li>'."n";
  }

  
$statusArray = array( 'user' => 'Пользователь',
                        
'moderator' => 'Модератор',
                        
'admin' => 'Администратор' ); 
  if ( 
in_array$_POST['status'], $statusArray ) )
    
$status $_POST['status'];
  else
    
$status 'user';
  
  
$timezone = (int)$_POST['timezone'];
  if ( 
$timezone < -12 or $timezone 12 $timezone 0;

  
// Если были допущены ошибки при заполнении формы - 
  // перенаправляем посетителя на страницу редактирования
  
if ( !empty( $error ) ) {
    
$_SESSION['editUserFormByAdmin'] = array();
    
$_SESSION['editUserFormByAdmin']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'.
    
"n".'<ul class="errorMsg">'."n".$error.'</ul>'."n";
    
$_SESSION['editUserFormByAdmin']['name'] = $_POST['name'];
    
$_SESSION['editUserFormByAdmin']['status'] = $status;
    
$_SESSION['editUserFormByAdmin']['email'] = $email;
    
$_SESSION['editUserFormByAdmin']['oldEmail'] = $oldEmail;
    
$_SESSION['editUserFormByAdmin']['timezone'] = $timezone;
    
$_SESSION['editUserFormByAdmin']['icq'] = $icq;
    
$_SESSION['editUserFormByAdmin']['url'] = $url;
    
$_SESSION['editUserFormByAdmin']['about'] = $about;
    
$_SESSION['editUserFormByAdmin']['signature'] = $signature;
    
header'Location: '.$_SERVER['PHP_SELF'].'?action=editUserFormByAdmin' );
    die();
  }    

  
// Если выставлен флажок "Удалить загруженный ранее файл"
  
if ( isset( $_POST['unlink'] ) and is_file'./photo/'.$id ) ) {
    
unlink'./photo/'.$id );
  } 
  if ( !empty( 
$_FILES['avatar']['name'] ) and 
       
move_uploaded_file $_FILES['avatar']['tmp_name'], './photo/'.$id ) ) {
    
chmod'./photo/'.$id0644 );
  }
  
  
// Все поля заполнены правильно - записываем изменения в БД
  
$tmp '';  
  if ( 
$changePassword ) {
    
$tmp $tmp."passw='".mysql_real_escape_stringmd5$newpassword ) )."', ";
  }
  if ( 
$changeEmail ) {
    
$tmp $tmp."email='".mysql_real_escape_string$email )."', ";
  }
  
$query "UPDATE ".TABLE_USERS." SET ".$tmp."
            status='"
.$status."',
            timezone="
.$timezone.",
            url='"
.mysql_real_escape_string$url )."',
            icq='"
.$icq."',
            about='"
.mysql_real_escape_string$about )."',
            signature='"
.mysql_real_escape_string$signature )."'
            WHERE id_author="
.$id;
  
$res mysql_query$query );
  if ( !
$res ) {
    
$msg 'Ошибка при обновлении профиля';
    
$err 'Ошибка при выполнении запроса: <br/>'.
           
$query.'<br/>'.mysql_errno().':&nbsp;'.mysql_error().'<br/>'.
          
'(Файл '__FILE__ .', строка '__LINE__ .')';
    return 
showErrorMessage$msg$errtrue'' );
  } else {
    return 
showInfoMessage'Профиль был изменён''' );
  }
}
?>

Еще несколько слов

После того, как была написана эта серия статей, мне пришлось внести в исходные коды некоторые изменения. Самое существенное изменение - я избавился от двух сложных запросов ввнутри функции getMainPage()

<?php
$q 
"SELECT a.id_theme, a.name, a.time, a.locked,
             IFNULL(b.id_author, 0), 
             IFNULL(b.name, '"
.NOT_REGISTERED_USER."'),         
             (COUNT(*)-1), IFNULL(MAX(c.time), '0000-00-00 00:00:00') AS last_post
      FROM "
.TABLE_THEMES." a LEFT JOIN ".TABLE_USERS." b
      ON a.id_author=b.id_author
      LEFT JOIN "
.TABLE_POSTS." c
      ON a.id_theme=c.id_theme
      WHERE id_forum="
.$forum['id_forum']."
      GROUP BY a.id_theme, a.name, a.time,
               IFNULL(b.id_author, 0), 
               IFNULL(b.name, '"
.NOT_REGISTERED_USER."')
      ORDER BY last_post DESC
      LIMIT 3"
;
?>

и внутри функции getForum(). Для этого пришлось добавить в таблицу TABLE_THEMES дополнительные поля:

  • id_last_author - ID пользователя, оставившего последнее сообщение в теме;
  • last_author - имя пользователя, оставившего последнее сообщение в теме;
  • last_post - время последнего сообщения в теме.

Скачать исходные коды форума

Установка:

  1. указать параметры соединения с сервером БД в файле config/connect.php
  2. набрать в адресной строке браузера //path_to_forum/install.php
  3. удалить файл install.php
  4. зайти на форум от имени пользователя admin (пароль admin) и поменять пароль
  5. Сайт автора Web Master School


 :::::  viktor_z пишет 30.07.2008 @ 13:09 
Спасибо за инфу, самое главное что вовремя
 :::::  дешевенькие отели пишет 02.09.2008 @ 13:20 
блин как все сложно, глову сломать можно!
 :::::  Олег пишет 10.09.2008 @ 11:20 
Ну спасибо, почерпнул для себя
 :::::  foxkids пишет 24.10.2008 @ 17:04 
да пока разберёшься очень много сигарет скурить можно спасибо набрал бля себя полезной инфы
 :::::  Ivan пишет 30.10.2008 @ 19:07 
Хорошая статья.
 :::::  Dimon пишет 11.12.2008 @ 16:06 
все здорово, но кому сейчас нужен этот php..
 :::::  Voenniy пишет 16.12.2008 @ 08:11 
Dimon - ???
А что, PHP уже никто не пользуется, да?

 :::::  Максим пишет 10.01.2009 @ 12:44 
Perl шагает по стране )
 :::::  KAA пишет 31.01.2009 @ 08:26 
Где getMainMenu()?
 :::::  КАА пишет 31.01.2009 @ 16:50 
Отлично! Спасибо!
 :::::  RevivaL пишет 07.03.2009 @ 12:50 
у меня куча ошибок

на главной
Warning: mysql_num_rows(): supplied argument is not a valid MySQL result resource in D:\AppServ\www\p\forum\index.php on line 414

при добавлении новой темы
Ошибка при выполнении запроса:
INSERT INTO themes VALUES ( NULL, 'ц4у678е', 'admin', 1, NOW(), 1, 'admin', NOW(), 3, 0 )
1136: Column count doesn't match value count at row 1
(Файл D:\AppServ\www\p\forum\index.php, строка 1591)

 :::::  slashHIT пишет 30.09.2009 @ 14:56 
Статья очень интересная, увидеть бы в действии данный форум....автор выложи куданибудь данный скрипт форума чтобы поглядеть на него...
 :::::  DenAlex пишет 15.10.2009 @ 16:33 
А можно ди этот форум использовать не через интернет а на локальном компьютере и как?
 :::::  Юрий пишет 08.04.2012 @ 23:59 
Уважаемый автор, все ОК! Спасибо за скрипт. Один вопрос: у меня на localhost стоит кодировка UTF-8, а у Вас во всех скриптах: win cp1251. При этом, в IE
все отображается нормально, а в остальных браузерах: moz, hrom, opera - иероглифы. MySql запрограммирована полностью на UTF-8, все запросы браузер
возвращает в UTF-8. Какие функции надо изменить, чтобы стало UTF-8, и возможно ли это?

 :::::  Владимир пишет 04.08.2013 @ 09:09 
У меня та же проблема - не идет UTF8.

 :::::  Александр пишет 20.08.2014 @ 16:58 
Проще конечно посидеть, подумать и написать свое чем разбираться в чужом коде но все таки за темку спасибо!
 :::::  Иван пишет 02.11.2014 @ 13:10 
Спасибо за форум!
Он такой классный!
Имя:
Email:
URL

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

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

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