nmk

Лабораторна робота №13 (2 години)

Тема: Додавання завдань у БД. Виконання операції INSERT та збереження отриманих валідованих даних із форми (POST) у реальну таблицю бази даних.

Мета: Навчитись відправляти дані до бази даних, використовуючи SQL-запити. Зрозуміти різницю між прямими запитами та підготовленими виразами (Prepared Statements) для захисту від SQL-ін’єкцій.

Технологічний стек: PHP (PDO::prepare(), execute()), MySQL (INSERT INTO).

Завдання

  1. Відкрити розроблений раніше обробник POST-форми (create.php).
  2. Підключити файл db.php для доступу до бази даних.
  3. Написати базовий SQL-запит на створення нового запису (INSERT INTO).
  4. Використати метод prepare() для захищеної передачі параметрів користувача у запит (замість прямого вклеювання змінних).

Хід виконання роботи

Крок 1. Підключення бази до сторінки форми

Відкрийте файл create.php. На самому початку (але після session_start(), якщо ви його використовуєте) додайте підключення до бази за допомогою функції: require_once 'db.php'; Це надасть можливість користуватися об’єктом $pdo безпосередньо у блоці обробки форми.

Крок 2. Написання SQL-запиту з плейсхолдерами

Знайдіть місце в коді (після перевірки empty($errors)), де раніше виводився var_dump() масиву $_POST. Замість цього ми будемо вставляти дані у БД. SQL-запит вставки виглядає так:

INSERT INTO tasks (title, description, priority, user_id) VALUES (:title, :description, :priority, :user_id)

Замість того, щоб формувати рядок запиту зі змінними PHP (VALUES ('$title', ...)), ми використовуємо іменовані плейсхолдери (знаки питання або імена з двокрапкою на кшталт :title). Це обов’язкова умова для запобігання атакам SQL-ін’єкції.

Крок 3. Підготовка та виконання (Prepare and Execute)

Об’єкт $pdo має метод prepare($sql). Він відправляє “скелет” запиту до бази для оптимізації та перевірки:

$stmt = $pdo->prepare('INSERT INTO tasks (title, description, priority, user_id) VALUES (:title, :description, :priority, :user_id)');

Далі викликаємо виконання, передавши в метод execute() масив реальних значень, які база надійно зіставить з плейсхолдерами:

// Для спрощення уявимо, що ви вже маєте $title, $desc, $priority
// та хардкод $user_id (наприклад 1)
$success = $stmt->execute([
    ':title' => $title,
    ':description' => $desc,
    ':priority' => $priority,
    ':user_id' => 1
]);

Крок 4. Зворотний зв’язок (Перенаправлення)

Після успішного виконання методу execute() (він повертає true) зробіть перенаправлення користувача на головну сторінку, щоб він побачив своє новостворене завдання у загальному списку. Використовуйте header('Location: index.php'); exit;.

Якщо після переходу на головну сторінку ви бачите створене завдання, яке можна редагувати і воно переживає перезавантаження сервера – вітаємо, форма повністю працездатна!

Контрольні запитання

  1. Поясніть механізм класичної атаки “SQL-ін’єкція”. Яким чином зловмисник може видалити базу даних через звичайне поле “Опис завдання”?
  2. Чому конкатенація рядків під час побудови SQL-запиту є поганою і небезпечною практикою? Наведіть приклад вразливого запиту.
  3. Що таке Prepared Statements (Підготовлені вирази) і як вони вирішують проблему SQL-ін’єкцій?
  4. Яка роль методу execute()? Чи можна виконати його кілька разів поспіль із різними масивами параметрів для об’єкта $stmt?
  5. Назвіть щонайменше 2 різних ключових слова SQL для додавання нових рядків до таблиці. (Підказка: INSERT та… )

Вимоги до звіту

  1. У Markdown lab13.md прикласти скриншот вікна браузера зі сторінкою index.php, на якій видно тільки що введене “свіже” завдання.
  2. Фрагмент коду обробника POST (блок prepare() -> execute()) вивести у вигляді блоку з підсвіткою PHP-коду.
  3. Експортувати .sql або просто надіслати посилання на Git-репозиторій із оновленнями.
  4. Надати відповіді на контрольні запитання.