Я знаю, что PDO не поддерживает выполнение нескольких запросов в одном операторе. Я поискал в Google и нашел несколько сообщений о PDO_MYSQL и PDO_MYSQLND.
PDO_MySQL - более опасное приложение, чем любые другие традиционные приложения MySQL. Традиционный MySQL допускает только один SQL-запрос. В PDO_MySQL такого ограничения нет, но вы рискуете получить несколько запросов.
Источник: Защита от внедрения SQL с помощью PDO и Zend Framework (июнь 2010 г .; автор Джулиан)
Кажется, что PDO_MYSQL и PDO_MYSQLND действительно поддерживают несколько запросов, но я не могу найти о них больше информации. Эти проекты были прекращены? Есть ли способ запустить несколько запросов с использованием PDO.
Ответы:
Насколько я знаю,
PDO_MYSQLND
замененоPDO_MYSQL
в PHP 5.3. Смущает то, что имя все ещеPDO_MYSQL
. Итак, теперь ND является драйвером по умолчанию для MySQL + PDO.В целом, для одновременного выполнения нескольких запросов вам необходимо:
PDO::ATTR_EMULATE_PREPARES
установлено значение1
(по умолчанию). В качестве альтернативы вы можете избежать использования подготовленных операторов и использовать$pdo->exec
напрямую.Использование exec
Использование операторов
Записка:
При использовании эмулированных подготовленных операторов убедитесь, что вы установили правильную кодировку (которая отражает фактическую кодировку данных) в DSN (доступно с версии 5.3.6). В противном случае может быть небольшая вероятность SQL-инъекции, если используется некоторая нечетная кодировка .
источник
После полудня возиться с этим выяснилось, что в PDO есть ошибка, когда ...
-
-
-
Он выполнит
"valid-stmt1;"
, остановится"non-sense;"
и никогда не выдаст ошибку. Не буду запускать"valid-stmt3;"
, вернуть истину и солгать, что все прошло хорошо.Я ожидал, что он выйдет из строя,
"non-sense;"
но это не так.Вот где я нашел эту информацию: Недействительный запрос PDO не возвращает ошибку
Вот ошибка: https://bugs.php.net/bug.php?id=61613
Итак, я попытался сделать это с помощью mysqli и на самом деле не нашел твердого ответа о том, как это работает, поэтому я подумал, что просто оставлю его здесь для тех, кто хочет его использовать ...
источник
$pdo->exec("valid-stmt1; non-sense; valid-stmt3;");
без двух предыдущих исполнителей? Я могу заставить его выдавать ошибки посередине, но не при выполнении после успешного выполнения .$pdo->exec("")
независимы друг от друга. Теперь я разделил их, чтобы указать, что они не должны быть в последовательности, чтобы возникла проблема. Эти 3 представляют собой 3 конфигурации выполнения нескольких запросов в одном операторе exec.exec
на странице, но если я запустил несколько,exec
каждый с несколькими операторами SQL в них, я воспроизвожу здесь ту же ошибку. Но если он единственныйexec
на странице, то я не могу его воспроизвести.exec
на вашей странице есть несколько операторов?Быстрый и грязный подход:
Разбивается в разумных конечных точках оператора SQL. Нет ни проверки ошибок, ни защиты от впрыска. Перед тем, как использовать, изучите свое использование. Лично я использую его для заполнения необработанных файлов миграции для тестирования интеграции.
источник
;
разрывы, если ваш SQL содержит определения процедур или триггеров ... причины, почему это нехорошо.Как и тысячи людей, я ищу этот вопрос:
может выполнять несколько запросов одновременно, и если была одна ошибка, ни одна из них не запустилась. Я заходил на эту страницу везде.
Но хотя друзья здесь давали хорошие ответы, эти ответы не подходили для моя проблема
Итак, я написал функцию, которая хорошо работает и почти не имеет проблем с sql Injection.
Это может быть полезно для тех, кто ищет похожие вопросы, поэтому я помещаю их здесь, чтобы использовать
для использования (пример):
и моя связь:
Примечание:
это решение помогает вам запускать несколько операторов вместе.
Если возникает неправильный оператор, он не выполняет никаких других операторов.
источник
Пробовал следующий код
затем
И получил
Если добавлено
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
после$db = ...
Затем появилась пустая страница
Если вместо этого
SELECT
попыталсяDELETE
, то в обоих случаях получил ошибку вродеИтак, мой вывод, что инъекция невозможна ...
источник
but you risk to be injected with multiple queries.
Речь идет о словах. Мой ответ об инъекцииПопробуйте эту функцию: несколько запросов и вставка нескольких значений.
источник
PDO поддерживает это (по состоянию на 2020 год). Просто выполните вызов query () для объекта PDO как обычно, разделяя запросы по; а затем nextRowset () для перехода к следующему результату SELECT, если у вас их несколько. Наборы результатов будут в том же порядке, что и запросы. Очевидно, подумайте о последствиях для безопасности - поэтому не принимайте пользовательские запросы, не используйте параметры и т. Д. Я использую это, например, с запросами, сгенерированными кодом.
источник