Урок 24
Редактирование поста
20 минЛогика редактирования
- Получить ID поста из URL
- Загрузить пост из базы
- Проверить, что пользователь — автор поста
- Показать форму с текущими данными
- При отправке — обновить запись в базе
Страница редактирования
Создайте файл public/edit_post.php:
<?php
require_once "includes/config.php";
// Только для авторизованных
requireLogin();
// Получаем ID поста
$id = isset($_GET["id"]) ? (int)$_GET["id"] : 0;
// Загружаем пост
$post = getPostById($id);
// Если пост не найден
if (!$post) {
header("HTTP/1.0 404 Not Found");
$page_title = "Пост не найден — $site_name";
include "includes/header.php";
echo "<h2>Пост не найден</h2>";
include "includes/footer.php";
exit;
}
// Проверяем, что текущий пользователь — автор
if (!isPostAuthor($post["user_id"])) {
header("HTTP/1.0 403 Forbidden");
$page_title = "Доступ запрещён — $site_name";
include "includes/header.php";
echo "<h2>Доступ запрещён</h2>";
echo "<p>Вы можете редактировать только свои посты.</p>";
include "includes/footer.php";
exit;
}
$page_title = "Редактировать: " . escape($post["title"]) . " — $site_name";
$errors = [];
// Значения полей (изначально — из базы)
$title = $post["title"];
$content = $post["content"];
// Обработка формы
if ($_SERVER["REQUEST_METHOD"] === "POST") {
$title = trim($_POST["title"] ?? "");
$content = trim($_POST["content"] ?? "");
// Валидация (такая же как при создании)
if (empty($title)) {
$errors[] = "Введите заголовок";
} elseif (strlen($title) < 5) {
$errors[] = "Заголовок слишком короткий";
} elseif (strlen($title) > 255) {
$errors[] = "Заголовок слишком длинный";
}
if (empty($content)) {
$errors[] = "Введите содержимое";
} elseif (strlen($content) < 20) {
$errors[] = "Содержимое слишком короткое";
}
// Если ошибок нет — обновляем
if (empty($errors)) {
$updated = updatePost($id, $title, $content);
if ($updated) {
header("Location: post.php?id=" . $id);
exit;
} else {
$errors[] = "Ошибка при обновлении поста";
}
}
}
include "includes/header.php";
?>
<h2>Редактировать пост</h2>
<?php if (!empty($errors)): ?>
<div style="background: #f8d7da; border: 1px solid #f5c6cb; padding: 15px; border-radius: 8px; margin-bottom: 20px;">
<ul style="margin: 0; padding-left: 20px;">
<?php foreach ($errors as $error): ?>
<li><?= escape($error) ?></li>
<?php endforeach; ?>
</ul>
</div>
<?php endif; ?>
<form method="POST" style="max-width: 600px;">
<div style="margin-bottom: 15px;">
<label style="display: block; margin-bottom: 5px; font-weight: bold;">Заголовок:</label>
<input
type="text"
name="title"
value="<?= escape($title) ?>"
style="width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; font-size: 16px;"
required
>
</div>
<div style="margin-bottom: 20px;">
<label style="display: block; margin-bottom: 5px; font-weight: bold;">Содержимое:</label>
<textarea
name="content"
rows="12"
style="width: 100%; padding: 12px; border: 1px solid #ddd; border-radius: 4px; box-sizing: border-box; font-size: 16px; line-height: 1.6;"
required
><?= escape($content) ?></textarea>
</div>
<button
type="submit"
style="background: #F36049; color: white; padding: 12px 30px; border: none; border-radius: 4px; font-size: 16px; cursor: pointer;"
>
Сохранить изменения
</button>
<a href="post.php?id=<?= $id ?>" style="margin-left: 15px; color: #666;">Отмена</a>
</form>
<?php include "includes/footer.php"; ?>
Обновляем страницу поста
В post.php добавим кнопки для автора:
<?php if (isPostAuthor($post["user_id"])): ?>
<div style="margin-top: 30px; padding-top: 20px; border-top: 1px solid #eee;">
<a
href="edit_post.php?id=<?= $post["id"] ?>"
style="color: #F36049; margin-right: 15px;"
>
Редактировать
</a>
<a
href="delete_post.php?id=<?= $post["id"] ?>"
style="color: #dc3545;"
onclick="return confirm('Вы уверены, что хотите удалить этот пост?')"
>
Удалить
</a>
</div>
<?php endif; ?>
Проверяем права доступа
- Создайте второго пользователя
- Войдите под ним
- Попробуйте открыть
edit_post.php?id=1(пост другого автора) - Должны увидеть "Доступ запрещён"
Редактирование готово!
Осталось добавить удаление.
Осталось добавить удаление.
Материалы по теме
- Глоссарий digital-терминов Глоссарий
- Статьи блога по разработке и SEO Блог
- Практические чеклисты по внедрению Чеклисты