Скрипт форума на PHP своими руками. Часть 5
Так, с пользователями форума вроде как разобрались. Теперь давайте рассмотрим функции для добавления нового сообщения (поста) - getAddPostForm() и addPost().
<?php
// Функция возвращает форму для добавления нового сообщения (поста)
function getAddPostForm()
{
// Если не передан ID форума - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID темы, куда будет добавлено сообщение -
// значит функция была вызвана по ошибке
if ( !isset( $_GET['id_theme'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Проверяем, не заблокирована ли тема?
$query = "SELECT locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при формировании формы для добавления нового сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_num_rows( $res ) == 0 ) {
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
die();
}
if ( mysql_result( $res, 0, 0 ) == 1 )
return showInfoMessage( 'Вы не можете добавить сообщение - тема заблокирована.',
'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
$message = '';
$html = '';
if ( isset( $_SESSION['viewMessage'] ) and !empty( $_SESSION['viewMessage'] ) ) {
$view = file_get_contents( './templates/previewMessage.html' );
$view = str_replace( '{message}', print_page( $_SESSION['viewMessage'] ), $view );
$html = $html.$view."\n";
$message = htmlspecialchars( $_SESSION['viewMessage'] );
unset( $_SESSION['viewMessage'] );
}
// Если при заполнении формы были допущены ошибки
if ( isset( $_SESSION['addPostForm'] ) ) {
$info = file_get_contents( './templates/infoMessage.html' );
$info = str_replace( '{infoMessage}', $_SESSION['addPostForm']['error'], $info );
$html = $html.$info."\n";
$message = htmlspecialchars( $_SESSION['addPostForm']['message'] );
unset( $_SESSION['addPostForm'] );
}
$tpl = file_get_contents( './templates/addPostForm.html' );
$action = $_SERVER['PHP_SELF'].'?action=addPost&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
$tpl = str_replace( '{action}', $action, $tpl );
$tpl = str_replace( '{message}', $message, $tpl );
$html = $html . $tpl;
return $html."\n";
}
?>
Шаблон addPostForm.html
<script language="JavaScript" type="text/javascript" src="./js/send_message.js"></script>
<form name="sendMessageForm" id="sendMessageForm" action="{action}" method="POST"
enctype="multipart/form-data" onsubmit="return checkForm(this)">
<table class="showTable">
<tr>
<th colspan="2">Ответить</th>
</tr>
<tr>
<td>Сообщение</td>
<td>
<table cellspacing="0" cellpadding="5" width="500">
<tr align="center" valign="middle">
<td>
<input type="button" accesskey="b" name="addbbcode0" value=" b "
style="font-weight:bold; width:30px" onClick="bbstyle(0)"
onMouseOver="helpline('b')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" accesskey="i" name="addbbcode2" value=" i "
style="font-style:italic; width:30px" onClick="bbstyle(2)"
onMouseOver="helpline('i')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode4" value=" u "
style="text-decoration: underline; width:30px" onClick="bbstyle(4)"
onMouseOver="helpline('u')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode6" value="Quote"
style="width:50px" onClick="bbstyle(6)"
onMouseOver="helpline('q')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode8" value="Code"
style="width:45px" onClick="bbstyle(8)"
onMouseOver="helpline('c')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode10" value="PHP"
style="width:45px" onClick="bbstyle(10)"
onMouseOver="helpline('p')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode12" value="List"
style="width:40px" onClick="bbstyle(12)"
onMouseOver="helpline('l')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode14" value="List="
style="width:40px" onClick="bbstyle(14)"
onMouseOver="helpline('o')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode16" value="Img"
style="width:40px" onClick="bbstyle(16)"
onMouseOver="helpline('m')" onMouseOut="helpline('h')" />
</td>
<td>
<input type="button" name="addbbcode18" value="URL"
style="text-decoration: underline; width:40px" onClick="bbstyle(18)"
onMouseOver="helpline('w')" onMouseOut="helpline('h')" />
</td>
</tr>
<tr>
<td colspan="7">Цвет шрифта:
<select name="addbbcode20"
onChange="bbfontstyle('[color=' + this.form.addbbcode20.options[this.form.addbbcode20.selectedIndex].value +
']', '[/color]');this.selectedIndex=0;" onMouseOver="helpline('s')" onMouseOut="helpline('h')">
<option style="color:#000000;" value="default">По умолчанию</option>
<option style="color:#FF0000;" value="red" />Красный</option>
<option style="color:#008000;" value="green" />Зелёный</option>
<option style="color:#0000FF;" value="blue" />Синий</option>
</select>
</td>
<td colspan="3" align="right">
<a href="javascript:bbstyle(-1)" onMouseOver="helpline('a')" onMouseOut="helpline('h')">Закрыть все теги</a>
</td>
</tr>
<tr>
<td colspan="10">
<input type="text" name="helpbox" style="width:100%; font-size:10px"
class="helpline" value="Подсказка: Можно быстро применить стили к выделенному тексту" />
</td>
</tr>
</table>
<textarea name="message" style="width:500; height: 300" onselect="storeCaret(this);"
onclick="storeCaret(this);" onkeyup="storeCaret(this);">{message}</textarea>
<br/>
Прикрепить: <input type="file" name="attach" size="40" />
<br/>
<input type="submit" name="submitForm" value="Отправить" />
<input type="submit" name="viewMessage" value="Предварительный просмотр" />
</td>
</tr>
</table>
</form>
Обработчик формы - функция addPost():
<?php
// Функция добавляет новое сообщение(пост) (новую запись в таблицу БД TABLE_POSTS)
function addPost()
{
// Если не переданы данные формы - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) or
!isset( $_GET['id_theme'] ) or
!isset( $_POST['message'] ) or
!isset( $_FILES['attach'] )
)
{
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Проверяем, не заблокирована ли тема?
$query = "SELECT locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при формировании формы для добавления нового сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_num_rows( $res ) == 0 ) {
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
die();
}
if ( mysql_result( $res, 0, 0 ) == 1 )
return showInfoMessage( 'Вы не можете добавить сообщение - тема заблокирована.',
'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
$msgLen = strlen( $_POST['message'] );
// Обрезаем сообщение (пост) до длины MAX_POST_LENGTH
$message = substr( $_POST['message'], 0, MAX_POST_LENGTH );
// Обрезаем лишние пробелы
$message = trim( $message );
// Если пользователь хочет посмотреть на сообщение перед отправкой
if ( isset( $_POST['viewMessage'] ) )
{
$_SESSION['viewMessage'] = $message;
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.
$_GET['idForum'].'&id_theme='.$id_theme );
die();
}
// Проверяем, правильно ли заполнены поля формы
$error = '';
if ( empty( $message ) ) $error = $error.'<li>не заполнено поле "Сообщение"</li>'."\n";
if ( $msgLen > MAX_POST_LENGTH )
$error = $error.'<li>длина сообщения больше '.MAX_POST_LENGTH.' символов</li>'."\n";
if ( !empty( $_FILES['attach']['name'] ) and $_FILES['attach']['size'] > MAX_FILE_SIZE )
$error = $error.'<li>размер файла вложения больше '.(MAX_FILE_SIZE/1024).' Кб</li>'."\n";
// Если были допущены ошибки при заполнении формы -
// перенаправляем пользователя для исправления ошибок
if ( !empty( $error ) )
{
$_SESSION['addPostForm'] = array();
$_SESSION['addPostForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'."\n".
'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
$_SESSION['addPostForm']['message'] = $message;
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=addPostForm&idForum='.
$_GET['idForum'].'&id_theme='.$id_theme );
die();
}
$file = '';
if ( !empty( $_FILES['attach']['name'] ) ) {
// Массив недопустимых расширений файла вложения
$extentions = array('.php', '.phtml', '.php3', '.html', '.htm', '.pl');
// Извлекаем из имени файла расширение
$ext = strrchr( $_FILES['attach']['name'], "." );
// Формируем путь к файлу
if ( in_array( $ext, $extentions ) )
$file = $id_theme.'-'.date("YmdHis",time()).'.txt';
else
$file = $id_theme.'-'.date("YmdHis",time()).$ext;
// Перемещаем файл из временной директории сервера в директорию files
if ( move_uploaded_file ( $_FILES['attach']['tmp_name'], './files/'.$file ) )
chmod( './files/'.$file, 0644 );
}
if ( isset( $_SESSION['user'] ) ) {
$name = $_SESSION['user']['name'];
$id_user = $_SESSION['user']['id_author'];
} else {
$name = NOT_REGISTERED_USER;
$id_user = 0;
}
// Все поля заполнены правильно - выполняем запрос к БД
$query = "INSERT INTO ".TABLE_POSTS."
(
name,
putfile,
author,
id_author,
time,
id_theme
)
VALUES
(
'".mysql_real_escape_string( $message )."',
'".$file."',
'".mysql_real_escape_string( $name )."',
".$id_user.",
NOW(),
".$id_theme."
)";
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при добавлении нового сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true,
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
}
// Обновляем количество сообщений для зарегистрированного пользователя
if ( isset( $_SESSION['user'] ) ) {
$query = "UPDATE ".TABLE_USERS." SET posts=posts+1 WHERE id_author = ".$_SESSION['user']['id_author'];
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при добавлении нового сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true,
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
}
}
return showInfoMessage( 'Ваше сообщение успешно добавлено',
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
}
?>
Функция getQuickReplyForm(), которая возвращает форму для быстрого ответа в тему, фактически полностью повторяет функцию getAddPostForm(). Соответственно, функция quickReply() - аналог функции addPost(). Так что не будем на них задерживаться - я просто приведу их исходные коды.
<?php
// Функция возвращает форму для быстрого ответа в тему
function getQuickReplyForm( $id_theme )
{
$html = file_get_contents( './templates/quickReplyForm.html' );
$action = $_SERVER['PHP_SELF'].'?action=quickReply&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
$html = str_replace( '{action}', $action, $html );
return $html;
}
?>
Обработчик формы - функция quickReply():
<?php
// Функция добавляет новое сообщение(пост) (новую запись в таблицу БД TABLE_POSTS)
function quickReply()
{
// Если не переданы данные формы - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) or
!isset( $_GET['id_theme'] ) or
!isset( $_POST['message'] )
)
{
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Проверяем, не заблокирована ли тема?
$query = "SELECT locked FROM ".TABLE_THEMES." WHERE id_theme=".$id_theme;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при формировании формы для добавления нового сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_num_rows( $res ) == 0 ) {
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=showForum&idForum='.$_GET['idForum'] );
die();
}
if ( mysql_result( $res, 0, 0 ) == 1 )
return showInfoMessage( 'Вы не можете добавить сообщение - тема заблокирована.',
'action=showForum&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
if ( isset( $_SESSION['user'] ) ) {
$name = $_SESSION['user']['name'];
$id_user = $_SESSION['user']['id_author'];
} else {
$name = NOT_REGISTERED_USER;
$id_user = 0;
}
// Обрезаем сообщение (пост) до длины MAX_POST_LENGTH
$message = substr( $_POST['message'], 0, MAX_POST_LENGTH );
// Обрезаем лишние пробелы
$message = trim( $message );
// Проверяем, правильно ли заполнены поля формы
if ( empty( $message ) )
return showInfoMessage( 'Не заполнено поле "Сообщение"',
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
// Все поля заполнены правильно - выполняем запрос к БД
$query = "INSERT INTO ".TABLE_POSTS."
(
name,
putfile,
author,
id_author,
time,
id_theme
)
VALUES
(
'".mysql_real_escape_string( $message )."',
'',
'".mysql_real_escape_string( $name )."',
".$id_user.",
NOW(),
".$id_theme."
)";
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при добавлении нового сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true,
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
}
// Обновляем количество сообщений для зарегистрированного пользователя
if ( isset( $_SESSION['user'] ) ) {
$query = "UPDATE ".TABLE_USERS." SET posts=posts+1 WHERE id_author = ".$_SESSION['user']['id_author'];
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при добавлении нового сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true,
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
}
}
return showInfoMessage( 'Ваше сообщение успешно добавлено',
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
}
?>
Кроме ответа в тему, пользователи должны иметь возможность отредактировать ранее опубликованные сообщения. Эту возможность предоставляют функции getEditPostForm() и updatePost().
<?php
// Функция возвращает форму для редактирования сообщения (поста)
function getEditPostForm()
{
// Если не передан ID форума - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID темы - значит функция была вызвана по ошибке
if ( !isset( $_GET['id_theme'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не передан ID сообщения - значит функция была вызвана по ошибке
if ( !isset( $_GET['id_post'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_post = (int)$_GET['id_post'];
if ( $id_post < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если сообщение пытается редактировать не зарегистрированный пользователь
if ( !isset( $_SESSION['user'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Получаем из БД сообщение
$query = "SELECT name, putfile, id_author, author, time, id_theme, locked
FROM ".TABLE_POSTS."
WHERE id_post=".$id_post;
$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_num_rows( $res ) == 0 )
return showInfoMessage( 'Ошибка при формировании формы для редактирования сообщения',
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme );
$post = mysql_fetch_array( $res );
$id_theme = $post['id_theme'];
// Проверяем, имеет ли пользователь право редактировать это сообщение (пост)
if ( !hasRightEditPost( $post ) ) {
$msg = 'У вас нет прав для редактирования этого сообщения';
$queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
return showInfoMessage( $msg, $queryString );
}
$message = htmlspecialchars( $post['name'] );
$html = '';
if ( isset( $_SESSION['viewMessage'] ) and !empty( $_SESSION['viewMessage'] ) ) {
$view = file_get_contents( './templates/previewMessage.html' );
$view = str_replace( '{message}', print_page( $_SESSION['viewMessage'] ), $view );
$html = $html.$view."\n";
$message = htmlspecialchars( $_SESSION['viewMessage'] );
unset( $_SESSION['viewMessage'] );
}
// Если при заполнении формы были допущены ошибки
if ( isset( $_SESSION['editPostForm'] ) ) {
$html = $html . $_SESSION['editPostForm']['error'];
$message = htmlspecialchars( $_SESSION['editPostForm']['message'] );
unset( $_SESSION['editPostForm'] );
}
$tpl = file_get_contents( './templates/editPostForm.html' );
$action = $_SERVER['PHP_SELF'].'?action=updatePost&idForum='.
$_GET['idForum'].'&id_theme='.$id_theme.'&id_post='.$id_post;
$tpl = str_replace( '{action}', $action, $tpl );
$tpl = str_replace( '{message}', $message, $tpl );
// Если ранее был загружен файл - надо предоставить возможность удалить его
$unlinkfile = '';
if ( !empty( $post['putfile'] ) and is_file( './files/'.$post['putfile'] ) ) {
$unlinkfile = '<input type="checkbox" name="unlink" value="1" /> Удалить загруженный ранее файл<br/>'."\n";
}
$tpl = str_replace( '{unlinkfile}', $unlinkfile, $tpl );
$html = $html . $tpl;
return $html."\n";
}
?>
Обработчик формы - функция updatePost()
<?php
function updatePost()
{
// Если не переданы данные формы - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) or
!isset( $_GET['id_post'] ) or
!isset( $_POST['message'] ) or
!isset( $_FILES['attach'] )
)
{
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_post = (int)$_GET['id_post'];
if ( $id_post < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Проверяем, имеет ли пользователь право редактировать это сообщение (пост)
$query = "SELECT * FROM ".TABLE_POSTS." WHERE id_post=".$id_post;
$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_num_rows( $res ) == 0 ) {
$msg = 'Ошибка при обновлении сообщения: сообщение не найдено';
return showInfoMessage( $msg, '' );
}
$post = mysql_fetch_array( $res );
$id_theme = $post['id_theme'];
if ( !hasRightEditPost( $post ) ) {
$msg = 'У вас нет прав для редактирования этого сообщения';
$queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
return showInfoMessage( $msg, $queryString );
}
// Обрезаем сообщение до длины MAX_POST_LENGTH
$message = substr( $_POST['message'], 0, MAX_POST_LENGTH );
// Обрезаем лишние пробелы
$message = trim( $message );
// Если пользователь хочет посмотреть на сообщение перед отправкой
if ( isset( $_POST['viewMessage'] ) )
{
$_SESSION['viewMessage'] = $message;
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editPostForm&idForum='.
$_GET['idForum'].'&id_theme='.$id_theme.'&id_post='.$id_post );
die();
}
// Проверяем, правильно ли заполнены поля формы
$error = '';
if ( empty( $message ) ) $error = $error.'<li>не заполнено поле "Сообщение"</li>'."\n";
if ( !empty( $_FILES['attach']['name'] ) and $_FILES['attach']['size'] > MAX_FILE_SIZE )
$error = $error.'<li>размер файла вложения больше '.(MAX_FILE_SIZE/1024).' Кб</li>'."\n";
// Если были допущены ошибки при заполнении формы -
// перенаправляем посетителя для исправления ошибок
if ( !empty( $error ) ) {
$_SESSION['editPostForm'] = array();
$_SESSION['editPostForm']['error'] = '<p class="errorMsg">При заполнениии формы были допущены ошибки:</p>'."\n".
'<ul class="errorMsg">'."\n".$error.'</ul>'."\n";
$_SESSION['editPostForm']['message'] = $message;
header( 'Location: '.$_SERVER['PHP_SELF'].'?action=editPostForm&idForum='.
$_GET['idForum'].'&id_theme='.$id_theme.'&id_post='.$id_post );
die();
}
$file = $post['putfile'];
// Такой ситуации быть не должно, но я случайтно удалил файл вложения
// вручную, и после этого нельзя было правильно загрузить файл
if ( !empty( $file ) and !is_file( './files/'.$post['putfile'] ) ) $file = '';
// Если выставлен флажок "Удалить загруженный ранее файл"
if ( isset( $_POST['unlink'] ) and !empty( $file ) and is_file( './files/'.$post['putfile'] ) ) {
if ( unlink( './files/'.$post['putfile'] ) ) $file = '';
}
if ( !empty( $_FILES['attach']['name'] ) ) {
// Если пользователь загружает новый файл - мы должны сперва удалить старый
// (при условии, что он вообще был загружен ранее)
if ( !empty( $file ) and is_file( './files/'.$post['putfile'] ) ) {
if ( unlink( './files/'.$post['putfile'] ) ) $file = '';
}
// Загружать новый файл мы будем только при условии, что был успешно
// удален ранее загруженный (или он не загружался вовсе)
if ( empty( $file ) ) {
// Массив недопустимых расширений файла вложения
$extentions = array('.php', '.phtml', '.php3', '.html', '.htm', '.pl');
// Извлекаем из имени файла расширение
$ext = strrchr( $_FILES['attach']['name'], "." );
// Формируем путь к файлу
if ( in_array( $ext, $extentions ) )
$new = $id_theme.'-'.date("YmdHis",time()).'.txt';
else
$new = $id_theme.'-'.date("YmdHis",time()).$ext;
// Перемещаем файл из временной директории сервера в директорию files
if ( move_uploaded_file ( $_FILES['attach']['tmp_name'], './files/'.$new ) ) {
chmod( './files/'.$new, 0644 );
$file = $new;
}
}
}
// Все поля заполнены правильно - выполняем запрос к БД
$query = "UPDATE ".TABLE_POSTS." SET
name='".mysql_real_escape_string( $message )."',
putfile='".$file."',
id_editor=".$_SESSION['user']['id_author'].",
edittime=NOW()
WHERE id_post=".$id_post;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при обновлении сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
$queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
return showErrorMessage( $msg, $err, true, $queryString );
}
$msg = 'Cообщение успешно исправлено';
$queryString = 'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$id_theme;
return showInfoMessage( $msg, $queryString );
}
?>
Функция hasRightEditPost() возвращает true или false в зависимости от того, имеет ли право пользователь редактировать сообщение (пост).
<?php
// Функция возвращает true или false в зависимости от того, имеет ли
// право пользователь редактировать сообщение (пост)
function hasRightEditPost( $post )
{
// Незарегистрированный пользователь не имеет право редактировать сообщения
if ( !isset( $_SESSION['user'] ) ) return false;
// Если пользователь - администратор или модератор, он имеет право
// редактировать любые сообщения (посты)
if ( $_SESSION['user']['status'] != 'user' ) return true;
// Обычный пользователь не может редактировать чужие сообщения (посты)
if ( $_SESSION['user']['id_author'] != $post['id_author'] ) return false;
// Пользователь не может редактировать сообщение, если оно заблокировано
if ( $post['locked'] == 1 ) return false;
// Обычный пользователь может редактировать свое сообщение,
// только если на него не было ответов
$query = "SELECT id_post FROM ".TABLE_POSTS."
WHERE id_theme=".$post['id_theme']." AND time>'".$post['time']."'";
$res = mysql_query( $query );
if ( !$res ) return false;
if ( mysql_num_rows( $res ) == 0 )
return true;
else
return false;
}
?>
И, наконец, функция deletePost()
<?php
// Функция удаляет сообщение (пост)
function deletePost()
{
// Если не передан ID форума - значит функция была вызвана по ошибке
if ( !isset( $_GET['idForum'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не прередан ID темы - значит функция вызвана по ошибке
if ( !isset( $_GET['id_theme'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_theme = (int)$_GET['id_theme'];
if ( $id_theme < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Если не прередан ID сообщения (поста) - значит функция вызвана по ошибке
if ( !isset( $_GET['id_post'] ) ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
$id_post = (int)$_GET['id_post'];
if ( $id_post < 1 ) {
header( 'Location: '.$_SERVER['PHP_SELF'] );
die();
}
// Получаем из БД информацию об удаляемом сообщении - это нужно,
// чтобы узнать, имеет ли право пользователь удалить это сообщение
$query = "SELECT * FROM ".TABLE_POSTS." WHERE id_post=".$id_post;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_num_rows( $res ) == 0 ) {
return showInfoMessage( 'Сообщение успешно удалено', 'action=showForum&idForum='.$_GET['idForum'] );
}
$post = mysql_fetch_array( $res );
if ( !hasRightDeletePost( $post ) ) {
return showInfoMessage( 'У вас нет прав, чтобы удалить это сообщение',
'action=showForum&idForum='.$_GET['idForum'] );
}
// Выдаем пользователю сообщение с просьбой подтвердить свое
// желание удалить сообщение (пост)
if ( !isset( $_GET['confirm'] ) ) {
$html = '<div align="center"><p>Вы действительно хотите удалить это сообщение?</p>'."\n";
$html = $html.'<input type="button" name="yes" value="Да"
onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=deletePost&idForum='.
$_GET['idForum'].'&id_theme='.$post['id_theme'].'&id_post='.$id_post.
'&confirm=yes\'" /> '."\n";
$html = $html.'<input type="button" name="no" value="Нет"
onClick="document.location.href=\''.$_SERVER['PHP_SELF'].'?action=showTheme&idForum='.
$_GET['idForum'].'&id_theme='.$post['id_theme'].'\'" /></div>'."\n";
$tpl = file_get_contents( './templates/infoMessage.html' );
$tpl = str_replace( '{infoMessage}', $html, $tpl );
return $tpl;
}
// Удаляем файл, если он есть
if ( !empty( $post['putfile'] ) and is_file( './files/'.$post['putfile'] ) )
unlink( './files/'.$post['putfile'] );
$query = "DELETE FROM ".TABLE_POSTS." WHERE id_post=".$id_post;
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true,
'action=showTheme&idForum='.$_GET['idForum'].'&id_theme='.$post['id_theme'] );
}
// Если это - единственное сообщение темы, то надо удалить и тему
$query = "SELECT COUNT(*) FROM ".TABLE_POSTS." WHERE id_theme=".$post['id_theme'];
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true,
'action=showForum&idForum='.$_GET['idForum'] );
}
if ( mysql_result( $res, 0, 0 ) == 0 ) {
// Прежде чем удалять тему, надо обновить таблицу TABLE_USERS
$query = "UPDATE ".TABLE_USERS."
SET themes=themes-1
WHERE id_author=
(SELECT id_author FROM ".TABLE_THEMES." WHERE id_theme=".$post['id_theme'].")";
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
$query = "DELETE FROM ".TABLE_THEMES." WHERE id_theme=".$post['id_theme'];
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true, 'action=showForum&idForum='.$_GET['idForum'] );
}
// Если мы удалили тему, то мы не можем в нее вернуться;
// поэтому редирект будет на страницу форума, а не страницу темы
$deleteTheme = true;
}
// Обновляем количество сообщений, оставленных автором сообщения
$query = "UPDATE ".TABLE_USERS." SET posts=posts-1 WHERE id_author=".$post['id_author'];
$res = mysql_query( $query );
if ( !$res ) {
$msg = 'Ошибка при удалении сообщения';
$err = 'Ошибка при выполнении запроса: <br/>'.
$query.'<br/>'.mysql_errno().': '.mysql_error().'<br/>'.
'(Файл '. __FILE__ .', строка '. __LINE__ .')';
return showErrorMessage( $msg, $err, true,
'action=showForum&idForum='.$_GET['idForum'] );
}
if ( isset( $deleteTheme ) ) {
return showInfoMessage( 'Сообщение успешно удалено', 'action=showForum&idForum='.$_GET['idForum'] );
} else {
return showInfoMessage( 'Сообщение успешно удалено', 'action=showTheme&idForum='.
$_GET['idForum'].'&id_theme='.$post['id_theme'] );
}
}
?>
Функция hasRightDeletePost() возвращает true или false в зависимости от того, имеет ли право пользователь удалить это сообщение (пост).
<?php
// Функция возвращает true или false в зависимости от того, имеет ли
// право пользователь удалить это сообщение (пост)
function hasRightDeletePost( $post )
{
// Незарегистрированный пользователь не имеет право удалять сообщения
if ( !isset( $_SESSION['user'] ) ) return false;
// Если пользователь - администратор или модератор, он имеет право
// удалять любые сообщения (посты)
if ( $_SESSION['user']['status'] != 'user' ) return true;
// Обычный пользователь не может удалять чужие сообщения (посты)
if ( $_SESSION['user']['id_author'] != $post['id_author'] ) return false;
// Пользователь не может удалять сообщение, если оно заблокировано
if ( $post['locked'] == 1 ) return false;
// Обычный пользователь имеет право удалять свои
// сообщения, если на них еще не было ответа
$query = "SELECT id_post FROM ".TABLE_POSTS."
WHERE id_theme=".$post['id_theme']." AND time>'".$post['time']."'";
$res = mysql_query( $query );
if ( !$res ) return false;
if ( mysql_num_rows( $res ) == 0 )
return true;
else
return false;
}
?>
Продолжение следует...
Если Вы не хотите тратить время и заморачиваться с проверками и поиском необходимой информации, предлагаем Вам обратить внимание на тройку лучших украинских казино - Пин АП. Участвуйте в денежных турнирах на официальном сайте онлайн казино Pin Up уже сегодня. Чаще всего, никакой прибыли на этом ресурсе получить невозможно, поскольку, если владельцам не хватило денег на разработку красивого, оригинального дизайна, то о выплате выигрышей говорить сложно.
|