Админ-страница редактирования на PHP: методы, код и рекомендации

Раздел: Управление -> Администрирование сайта

Разработка страницы редактирования в админ-панели на PHP

Основное эффективное решение: CRUD с PDO и подготовленными запросами

Этот подход обеспечивает безопасность, производительность и простоту поддержки. Используется единая точка входа (index.php) с параметром action, а CRUD-операции выносятся в отдельные файлы.


// index.php - единая точка входа
$action = $_GET['action'] ?? 'list';
switch ($action) {
    case 'edit':
        require 'edit.php';
        break;
    case 'list':
        require 'list.php';
        break;
    // другие действия
}
  

Admin page edit php (админ страница редактирования php)

Файл edit.php содержит логику получения данных по ID, отображения формы и обработки POST-запроса.


// edit.php
$id = (int)$_GET['id'];
$pdo = new PDO('mysql:host=localhost;dbname=test', 'user', 'pass');
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = htmlspecialchars($_POST['name']);
    $email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
    if ($email === false) {
        $error = 'Некорректный email';
    } else {
        $stmt = $pdo->prepare('UPDATE users SET name=?, email=? WHERE id=?');
        $stmt->execute([$name, $email, $id]);
        header('Location: index.php?action=list');
        exit;
    }
}
?>
<form method="post">
    <input type="text" name="name" value="<?= $user['name'] ?>" required>
    <input type="email" name="email" value="<?= $user['email'] ?>" required>
    <?php if (isset($error)): ?>
        <p class="fw-bold" style="color:red"><?= $error ?></p>
    <?php endif; ?>
    <button type="submit">Сохранить</button>
</form>
  

Site test php (тестирование сайта php)

Типичные ошибки:

  • SQL-инъекции при конкатенации строк вместо prepared statements.
  • Отсутствие валидации ID (должен быть integer).
  • Неверная настройка PDO (например, отсутствие режима исключений).

Решение:

  • Всегда использовать prepare и execute.
  • Приводить ID к целому числу: (int)$_GET['id'].
  • Добавлять $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);.

Вариант 1: Как создать простую админ-страницу без фреймворков?

Использование обычных PHP-файлов с прямым включением HTML. Форма редактирования размещается в отдельном файле edit_user.php, а данные передаются через GET/POST. Этот вариант подходит для небольших проектов с 2-3 таблицами.


// edit_user.php?id=5
$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$id = (int)$_GET['id'];
$result = $mysqli->query("SELECT * FROM products WHERE id = $id");
$product = $result->fetch_assoc();
if ($_POST) {
    $name = $mysqli->real_escape_string($_POST['name']);
    $price = (float)$_POST['price'];
    $mysqli->query("UPDATE products SET name='$name', price=$price WHERE id=$id");
    header('Location: list_products.php');
}
  

Php admin login (админ-логин php)

Проблемы:

  • Риск SQL-инъекций при неаккуратном использовании real_escape_string.
  • Смешивание логики и представления усложняет поддержку.

Вариант 2: Как организовать редактирование через AJAX без перезагрузки страницы?

Используется jQuery или fetch для отправки данных на сервер, после чего страница динамически обновляется. Сервер возвращает JSON с результатом.


// save_ajax.php
$pdo = new PDO(...);
$id = (int)$_POST['id'];
$value = $_POST['value'];
$column = $_POST['column']; // опасность! нужно белый список
$allowed = ['name', 'email'];
if (!in_array($column, $allowed)) die('invalid column');
$stmt = $pdo->prepare("UPDATE users SET $column=? WHERE id=?");
$stmt->execute([$value, $id]);
echo json_encode(['success' => true]);
  

Ошибка: SQL-инъекция через имя колонки. Решение: белый список допустимых полей.

Вариант 3: Как использовать шаблонизатор (Twig) для редактирования?

Отделяем логику от представления. Контроллер подготавливает данные и передаёт их в шаблон.


// controller.php
$loader = new \Twig\Loader\FilesystemLoader('templates');
$twig = new \Twig\Environment($loader);
echo $twig->render('edit.twig', ['user' => $user]);
  

<!-- templates/edit.twig -->
<form method="post">
    <input name="name" value="{{ user.name }}" />
    <input name="email" value="{{ user.email }}" />
    <button>Сохранить</button>
</form>
  

Вариант 4: Как реализовать редактирование через REST API?

Создаём отдельный эндпоинт для обновления (PUT /api/users/{id}), фронтенд вызывает его через fetch. Подходит для SPA и мобильных приложений.


// api/update_user.php
$id = (int)$_SERVER['REQUEST_URI']); // упрощённо
$data = json_decode(file_get_contents('php://input'), true);
$stmt = $pdo->prepare('UPDATE users SET name=:name, email=:email WHERE id=:id');
$stmt->execute([':name' => $data['name'], ':email' => $data['email'], ':id' => $id]);
http_response_code(200);
echo json_encode(['status' => 'updated']);
  

Расширенные примеры программного кода для админ-страницы редактирования

Пример 1: Редактирование с загрузкой файла (аватар пользователя)

Пример

// edit_with_avatar.php
$pdo = new PDO(...);
$id = (int)$_GET['id'];
$user = $pdo->prepare('SELECT * FROM users WHERE id=?')->execute([$id])->fetch();

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $name = $_POST['name'];
    $avatar = $_FILES['avatar'];
    $path = '';
    if ($avatar['error'] === UPLOAD_ERR_OK) {
        $ext = pathinfo($avatar['name'], PATHINFO_EXTENSION);
        $filename = uniqid().'.'.$ext;
        move_uploaded_file($avatar['tmp_name'], 'uploads/'.$filename);
        $path = 'uploads/'.$filename;
        // удаляем старый файл, если есть
        if ($user['avatar'] && file_exists($user['avatar'])) {
            unlink($user['avatar']);
        }
    }
    $stmt = $pdo->prepare('UPDATE users SET name=?, avatar=? WHERE id=?');
    $stmt->execute([$name, $path ?: $user['avatar'], $id]);
    header('Location: index.php?action=edit&id='.$id);
    exit;
}
?>
<form method="post" enctype="multipart/form-data">
    <input type="text" name="name" value="<?= $user['name'] ?>">
    <input type="file" name="avatar">
    <?php if ($user['avatar']): ?>
        <img src="<?= $user['avatar'] ?>" width="100">
    <?php endif; ?>
    <button type="submit">Сохранить</button>
</form>

Результат: при отправке формы файл сохраняется в папке uploads, путь записывается в БД. Если файл не загружен, остаётся старое значение.

Пример 2: Редактирование нескольких записей одновременно (inline editing)

Пример

// inline_edit.php (фрагмент списка с кнопкой "Сохранить все")
$pdo = new PDO(...);
$users = $pdo->query('SELECT id, name, email FROM users')->fetchAll();
?>
<form method="post" action="save_all.php">
<table>
<tr><th>ID</th><th>Имя</th><th>Email</th></tr>
<?php foreach ($users as $user): ?>
    <tr>
        <td><?= $user['id'] ?></td>
        <td><input type="text" name="name[<?= $user['id'] ?>]" value="<?= $user['name'] ?>"></td>
        <td><input type="email" name="email[<?= $user['id'] ?>]" value="<?= $user['email'] ?>"></td>
    </tr>
<?php endforeach; ?>
</table>
<button type="submit">Сохранить все изменения</button>
</form>

// save_all.php
$pdo = new PDO(...);
$stmt = $pdo->prepare('UPDATE users SET name=?, email=? WHERE id=?');
foreach ($_POST['name'] as $id => $name) {
    $email = $_POST['email'][$id];
    $stmt->execute([$name, $email, $id]);
}
header('Location: inline_edit.php');

Результат: все изменения сохраняются одним запросом к БД (в цикле). Этот подход удобен для массового редактирования.

Пример 3: Редактирование с использованием транзакций и проверки целостности

Пример

// edit_with_transaction.php
$pdo = new PDO(...);
$pdo->beginTransaction();
try {
    $id = (int)$_POST['id'];
    $new_email = filter_var($_POST['email'], FILTER_VALIDATE_EMAIL);
    if (!$new_email) throw new Exception('Неверный email');
    // проверка уникальности email
    $check = $pdo->prepare('SELECT COUNT(*) FROM users WHERE email=? AND id!=?');
    $check->execute([$new_email, $id]);
    if ($check->fetchColumn() > 0) throw new Exception('Email уже занят');
    $stmt = $pdo->prepare('UPDATE users SET email=? WHERE id=?');
    $stmt->execute([$new_email, $id]);
    $pdo->commit();
    echo 'Обновлено';
} catch (Exception $e) {
    $pdo->rollBack();
    echo 'Ошибка: ' . $e->getMessage();
}

Результат: при нарушении уникальности или невалидном email транзакция откатывается, данные не меняются.

Пример 4: Редактирование с использованием ORM (Doctrine)

Пример

// edit_doctrine.php (фрагмент)
$entityManager = GetEntityManager();
$userRepository = $entityManager->getRepository(User::class);
$user = $userRepository->find($id);
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $user->setName($_POST['name']);
    $user->setEmail($_POST['email']);
    $entityManager->flush();
    header('Location: list.php');
}
?>
<form method="post">
    <input type="text" name="name" value="<?= $user->getName() ?>">
    <input type="email" name="email" value="<?= $user->getEmail() ?>">
    <button>Сохранить</button>
</form>

Результат: ORM автоматически генерирует UPDATE-запрос, управляет состоянием сущности. Подходит для сложных моделей данных.

Админ страница редактирования PHP - comments

En
Admin page edit php (php)