Множинні запити

MySQL підтримує наявність кількох SQL-запитів у тексті одного запиту, але потребує особливого звернення. Пересилання на сервер декількох виразів в одному запиті зменшує кількість клієнт-серверних взаємодій, але потребує спеціальної обробки.

Множинні запити або мультизапити повинні запускатися функцією mysqli::multi_query(). Окремі SQL-пропозиції у мультизапиті відокремлюються крапкою з комою. Після виконання мультизапиту, всі результуючі набори, які він повернув, необхідно витягти.

MySQL-сервер підтримує наявність в одному мультизапиті підзапитів, що повертають результуючий набір, так і не повертають.

Приклад #1 Множинні запити

Loading...

Результат виконання наведеного прикладу:

array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "0"
  }
}
array(1) {
  [0]=>
  array(1) {
    ["_num"]=>
    string(1) "1"
  }
}

Розгляд аспектів безпеки

Функции APImysqli::query() і mysqli::real_query() під час роботи не встановлюють на сервері спеціальний прапор, необхідний виконання мультизапросов. Окрема функція API для мультизапитів дозволяє знизити ймовірність випадкових SQL-ін'єкцій. Зловмисник може спробувати додати до кінця запиту виразу, на кшталт ; DROP DATABASE mysqlили; SELECT SLEEP(999). Якщо йому це вдасться, але не використовуватиметься функція mysqli::multi_query(), сервер не виконає впроваджений та небезпечний SQL-вираз.

Приклад #2 SQL-ін'єкція

Loading...

Результат виконання наведеного прикладу:

PHP Fatal error:  Uncaught mysqli_sql_exception: You have an error in your SQL syntax;
check the manual that corresponds to your MySQL server version for the right syntax to
use near 'DROP TABLE mysql.user' at line 1

Підготовлювані запити

Використання безлічі виразів у запиті, що готується, не підтримується.

Дивіться також