Множинні запити
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
Підготовлювані запити
Використання безлічі виразів у запиті, що готується, не підтримується.
Дивіться також