Может ли PDO PHP быть ограничен одним запросом? - PullRequest
5 голосов
/ 10 мая 2010

PHP PDO позволяет одновременно выполнять несколько запросов, либо с помощью метода query (), либо в виде подготовленного оператора. Оба следующих примера работают:

// Two SQL queries
$query = "SELECT * FROM table; DROP table;"

// Execute via query()
$pdo->query($query);

// Execute via prepared statement
$stmt = $pdo->prepare($query);
$stmt->execute();

Есть ли способ ограничить PDO одним запросом за раз, так же, как функция mysql_query ()?

Ответы [ 2 ]

7 голосов
/ 02 августа 2015

Это более актуальный ответ на этот вопрос.

Старый способ предотвращения выполнения нескольких запросов состоял в отключении эмулированных приготовлений, однако это было применимо только к методу PDO::prepare(). В более новых версиях PHP (> = 5.5.21 и> = 5.6.5) была введена новая константа, чтобы отключить выполнение нескольких запросов как в PDO::prepare(), так и PDO::query(). (Константы обычно не добавляются в версии исправлений, но это было сделано из-за серьезности атаки Drupal SQL-инъекции , вызванной этой возможностью).

Новая константа PDO::MYSQL_ATTR_MULTI_STATEMENTS, и должен быть установлен при создании объекта (как четвертый аргумент для конструктора PDO) - установка его на ранее существующий объект с PDO::setAttribute() не будет работать

$pdo = new PDO('mysql:host=_;dbname=_', '', '', [PDO::MYSQL_ATTR_MULTI_STATEMENTS => false]);
6 голосов
/ 10 мая 2010

Ммм, есть способ добиться этого, отключив эмуляцию подготовленных операторов в PDO, чтобы вместо этого использовать собственный API-интерфейс mysql (многократный запрос не поддерживается в подготовленных инструкциях на стороне сервера):

$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

Однако один из недостатков этого параметра заключается в том, что кэш запросов теряется.

...