НАЙКРАЩИЙ САЙТ ДЛЯ ВЕБ-РОЗРОБНИКІВ

PHP Підручник

PHP СТАРТ PHP Інтро PHP Встановлення PHP Синтаксис PHP Коментарі PHP Змінні PHP Echo / Print PHP Типи даних PHP Рядки PHP Числа PHP Математика PHP Константи PHP Оператори PHP If...Else...Elseif PHP Switch PHP Цикли PHP Функції PHP Масиви PHP Суперглобали PHP RegEx

PHP Форми

PHP Обробка форми PHP Перевірка форми PHP Обов'язкові поля форми PHP Форма URL/E-mail PHP Заповнення форми

PHP Розширений

PHP Дата і час PHP Підключення файлів PHP Обробка файлів PHP Файл відкрити/читати PHP Файл створити/записати PHP Файл Завантажити PHP Кукі PHP Сесії PHP Фільтри PHP Розширені фільтри PHP Callback функції PHP JSON PHP Винятки

PHP ООП

PHP Що таке ООП PHP класи/об'єкти PHP Конструктор PHP Деструктор PHP Модифікатори доступу PHP Спадкування PHP Константи PHP Абстрактні класи PHP Інтерфейси PHP Трейти PHP Статичні методи PHP Статичні властивості PHP Простори імен PHP Ітерація

MySQL База даних

MySQL База даних MySQL Підключення MySQL Створити БД MySQL Створити таблиці MySQL Вставити дані MySQL Отримати останній ID MySQL Вставити кілька записів MySQL Підготовлені інструкції MySQL Вибрати дані MySQL Where MySQL Order By MySQL Видалення даних MySQL Оновлення даних MySQL Обмеження даних

PHP XML

PHP XML Парсери PHP SimpleXML Парсер PHP SimpleXML - Get PHP XML Expat PHP XML DOM

PHP - AJAX

AJAX Інтро AJAX PHP AJAX База даних AJAX XML AJAX Живий пошук AJAX Опитування

PHP Приклади

PHP Приклади PHP Компілятор PHP Вікторина PHP Вправи PHP Сертифікат

PHP Довідник

PHP Огляд PHP Масив PHP Календар PHP Дата PHP Каталог PHP Помилка PHP Виняток PHP Файлова система PHP Фільтр PHP FTP PHP JSON PHP Ключові слова PHP Libxml PHP Пошта PHP Математика PHP Різне PHP MySQLi PHP Мережа PHP Output Control PHP RegEx PHP SimpleXML PHP Потік PHP Рядок PHP Обробка змінних PHP XML Парсер PHP Zip PHP Часові пояси

PHP. W3Schools українською. Уроки для початківців

En

PHP MySQL Підготовлені інструкції


Підготовлені інструкції дуже корисні проти SQL-ін’єкцій.


Підготовлені інструкції та зв’язані параметри

Підготовлена інструкція — це функція, яка використовується для багаторазового виконання тих самих (або схожих) SQL-інструкцій з високою ефективністю.

Підготовлені інструкції в основному працюють так:

  1. Підготувати: створюється шаблон SQL-інструкції і надсилається до бази даних. Певні значення залишаються невизначеними, вони називаються параметрами (позначаються "?"). Приклад: INSERT INTO MyGuest VALUES(?, ?, ?)
  2. База даних аналізує, компілює та виконує оптимізацію запитів у шаблоні SQL-інструкції і зберігає результат без його виконання
  3. Виконати: пізніше програма прив’язує значення до параметрів, а база даних виконує інструкцію. Програма може виконувати інструкцію скільки завгодно разів із різними значеннями

Порівняно з прямим виконанням SQL-інструкцій підготовлені інструкції мають три основні переваги:

  • Підготовлені інструкції скорочують час аналізу, оскільки підготовка запиту виконується лише один раз (хоча інструкція виконується кілька разів)
  • Прив’язані параметри мінімізують пропускну здатність сервера, оскільки кожного разу потрібно надсилати лише параметри, а не весь запит.
  • Підготовлені інструкції дуже корисні проти SQL-ін’єкцій, оскільки значення параметрів, які передаються пізніше за допомогою іншого протоколу, не потребують правильного екранування. Якщо оригінальний шаблон інструкції не отримано із зовнішнього введення, SQL-ін’єкція не відбудеться.

Підготовлені інструкції в MySQLi

У наступному прикладі використовуються підготовлені інструкції та зв’язані параметри в MySQLi:

Приклад (MySQLi із підготовленими інструкціями)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDB";

// Створити підключення
$conn = new mysqli($servername, $username, $password, $dbname);

// Перевірити підключення
if ($conn->connect_error) {
  die("Підключення не вдалося: " . $conn->connect_error);
}

// підготувати та зв’язати
$stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $firstname, $lastname, $email);

// встановити параметри та виконати
$firstname = "John";
$lastname = "Doe";
$email = "john@example.com";
$stmt->execute();

$firstname = "Mary";
$lastname = "Moe";
$email = "mary@example.com";
$stmt->execute();

$firstname = "Julie";
$lastname = "Dooley";
$email = "julie@example.com";
$stmt->execute();

echo "Нові записи успішно створено";

$stmt->close();
$conn->close();
?>

Рядки коду для пояснення з прикладу вище:

"INSERT INTO MyGuests (firstname, lastname, email) VALUES (?, ?, ?)"

У нашому SQL ми вставляємо знак питання (?), де ми хочемо замінити ціле число, рядок, значення типу double або blob.

Потім подивіться на функцію bind_param():

$stmt->bind_param("sss", $firstname, $lastname, $email);

Ця функція прив’язує параметри до SQL-запиту та повідомляє базі даних, що це за параметри. "sss" аргумент перелічує типи даних, якими є параметри. Символ s повідомляє mysql, що параметр є рядком.

Аргумент може бути одного з чотирьох типів:

  • i - integer
  • d - double
  • s - string
  • b - BLOB

Ми повинні мати один із них для кожного параметра.

Повідомляючи mysql, який тип даних очікувати, ми мінімізуємо ризик SQL-ін’єкцій.

Примітка: Якщо ми хочемо вставити будь-які дані із зовнішніх джерел (наприклад, введені користувачем), дуже важливо, щоб дані були оброблені та підтверджені.


Підготовлені інструкції в PDO

У наступному прикладі використовуються підготовлені інструкції та зв’язані параметри в PDO:

Приклад (PDO із підготовленими інструкціями)

<?php
$servername = "localhost";
$username = "username";
$password = "password";
$dbname = "myDBPDO";

try {
  $conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
  // встановити режим помилки PDO у виняток
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

  // підготуйте sql і параметри прив’язки
  $stmt = $conn->prepare("INSERT INTO MyGuests (firstname, lastname, email)
  VALUES (:firstname, :lastname, :email)");
  $stmt->bindParam(':firstname', $firstname);
  $stmt->bindParam(':lastname', $lastname);
  $stmt->bindParam(':email', $email);

  // вставити рядок
  $firstname = "John";
  $lastname = "Doe";
  $email = "john@example.com";
  $stmt->execute();

  // вставте інший рядок
  $firstname = "Mary";
  $lastname = "Moe";
  $email = "mary@example.com";
  $stmt->execute();

  // вставте інший рядок
  $firstname = "Julie";
  $lastname = "Dooley";
  $email = "julie@example.com";
  $stmt->execute();

  echo "Нові записи успішно створено";
} catch(PDOException $e) {
  echo "Error: " . $e->getMessage();
}
$conn = null;
?>