Урок 24

Редактирование поста

20 мин

Логика редактирования

  1. Получить ID поста из URL
  2. Загрузить пост из базы
  3. Проверить, что пользователь — автор поста
  4. Показать форму с текущими данными
  5. При отправке — обновить запись в базе

Страница редактирования

Создайте файл 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; ?>

Проверяем права доступа

  1. Создайте второго пользователя
  2. Войдите под ним
  3. Попробуйте открыть edit_post.php?id=1 (пост другого автора)
  4. Должны увидеть "Доступ запрещён"
Редактирование готово!
Осталось добавить удаление.

Мы используем файлы cookie для улучшения работы сайта и персонализации контента. Продолжая использовать сайт, вы соглашаетесь с использованием cookies в соответствии с нашей Политикой конфиденциальности.