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

Разработка своих веб-приложений и страничек

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

Сообщение Exet » 02 фев 2009, 02:43

Наконец, заключительная статья. В ней мы рассмотрим систему администрирования форума. Собственно, системы администрирования как таковой не существует. Просто некоторые пользователи форума, имеющие статус администратора (поле 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().':&nbsp;'.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().':&nbsp;'.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().':&nbsp;'.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().':&nbsp;'.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().':&nbsp;'.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().':&nbsp;'.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().':&nbsp;'.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 - время последнего сообщения в теме.



Установка:

1. указать параметры соединения с сервером БД в файле config/connect.php
2. набрать в адресной строке браузера http://path_to_forum/install.php
3. удалить файл install.php
4. зайти на форум от имени пользователя admin (пароль admin) и поменять пароль
Последний раз редактировалось Exet 02 фев 2009, 13:42, всего редактировалось 3 раз(а).
Изображение
Аватара пользователя
Exet
Активный участник
 
Сообщения: 131
Зарегистрирован: 07 дек 2007, 16:43
Откуда: Volsk Style Records
Домен: http://mc-style.vfose.ru/

Re: Скрипт форума на PHP своими руками.

Сообщение doliar » 02 фев 2009, 03:16

Тэг Code Рулит :
Код: Выделить всёРазвернуть
[code][/code]
Изображение

Консультаций по TBDev через icq неосуществляю!
Аватара пользователя
doliar
Автор
 
Сообщения: 732
Зарегистрирован: 16 янв 2008, 15:05
Откуда: Саратов, Волжский р-он
Домен: tbdev-info.vfose.ru

Re: Скрипт форума на PHP своими руками.

Сообщение Rostov114 » 02 фев 2009, 03:36

фух...не асилил...
Некоммерческий проект «HSDN»
Аватара пользователя
Rostov114
Автор
 
Сообщения: 3198
Зарегистрирован: 18 окт 2007, 02:21


Вернуться в PHP, HTML, CSS...

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 156