PHP

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

Наконец, заключительная статья. В ней мы рассмотрим систему администрирования форума. Собственно, системы администрирования как таковой не существует. Просто некоторые пользователи форума, имеющие статус администратора (поле 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'], 0, 120 ); 
  $description = substr( $_POST['description'], 0, 250 ); 
  // Обрезаем лишние пробелы 
  $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().': '.mysql_error().'<br/>'. 
           '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
    return showErrorMessage( $msg, $err, true, '' ); 
  } 
  $order = mysql_result( $res, 0, 0 ) + 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().': '.mysql_error().'<br/>'. 
      '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
    return showErrorMessage( $msg, $err, true, '' ); 
  } 
   
  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().': '.mysql_error().'<br/>'. 
      '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
    return showErrorMessage( $msg, $err, true, '' ); 
  } 
  $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'], 0, 120 ); 
  $description = substr( $_POST['description'], 0, 250 ); 
  // Обрезаем лишние пробелы 
  $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().': '.mysql_error().'<br/>'. 
          '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
    return showErrorMessage( $msg, $err, true, '' ); 
  }  
     
  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( $res, 0, 0 ); 
  $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 ) == 0 ) 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( $res, 0, 0 ); 
  $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 ) == 0 ) 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().': '.mysql_error().'<br/>'. 
           '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
    return showErrorMessage( $msg, $err, true, '' );           
  }  
  if ( mysql_result( $res, 0, 0 ) > 0 ) 
    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 < 1 ) { 
    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().': '.mysql_error().'<br/>'. 
             '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
      return showErrorMessage( $msg, $err, 'action=showUsersList', true ); 
    } 
    if ( mysql_num_rows( $res ) == 0 )  
      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 < 1 )  
      $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 < 1 ) { 
    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'], 0, 60 ); 
  $oldEmail     = substr( $_POST['oldEmail'], 0, 60 ); 
  $newpassword  = substr( $_POST['newpassword'], 0, 30 ); 
  $confirm      = substr( $_POST['confirm'], 0, 30 ); 
  $icq          = substr( $_POST['icq'], 0, 12 ); 
  $url          = substr( $_POST['url'], 0, 60 ); 
  $about        = substr( $_POST['about'], 0, 1000 ); 
  $signature    = substr( $_POST['signature'], 0, 500 ); 

  // Обрезаем лишние пробелы 
  $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( "#^(http://)?(www.)?[-0-9a-z]+.[a-z]{2,6}/?$#i", $url ) ) 
    $error = $error.'<li>поле "Домашняя страничка" должно соответствовать формату http://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/'.$id, 0644 ); 
  } 
   
  // Все поля заполнены правильно - записываем изменения в БД 
  $tmp = '';   
  if ( $changePassword ) { 
    $tmp = $tmp."passw='".mysql_real_escape_string( md5( $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().': '.mysql_error().'<br/>'. 
          '(Файл '. __FILE__ .', строка '. __LINE__ .')'; 
    return showErrorMessage( $msg, $err, true, '' ); 
  } 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 - время последнего сообщения в теме.
Скачать исходные коды форума

Установка:

указать параметры соединения с сервером БД в файле config/connect.php
набрать в адресной строке браузера http://path_to_forum/install.php
удалить файл install.php
зайти на форум от имени пользователя admin (пароль admin) и поменять пароль
Теги:
форум
Добавлено: 22 Сентября 2013 01:28:54 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...