Как проверить наличие эмулированных подготовленных операторов в ADOdb?

0

Я использовал ADOdb в течение многих лет в качестве уровня абстракции базы данных и кэширования запросов. В последнее время я перешел на подготовленные заявления, в основном для обеспечения безопасности, и стал любопытно, как они реализованы (или не реализованы).

Цитата из документации для метода Prepare: " Возвращает массив, содержащий исходный оператор sql в первом элементе массива, остальные элементы массива зависят от драйвера. Если есть ошибка или мы эмулируем Prepare(), мы возвращаем исходную строку $sql."

Тестирование переменной оператора с помощью:

$stmt = $db->Prepare("SELECT * FROM pages WHERE id = ?");
print_r($stmt);

При подключениях, открытых с помощью параметра mysql или 'mysqli, возвращается только исходная строка запроса - что означает, что подготовленный оператор эмулируется, я думаю. Соединение, открытое с 'pdo_mysql возвращает (from print_r()):

Array (
    [0] => SELECT * FROM pages WHERE id = ? 
    [1] => PDOStatement Object ([queryString]=>SELECT * FROM pages WHERE id = ?) 
) 

Можно ли считать это определенным доказательством реального подготовленного заявления? Если нет, знает ли кто-нибудь быстрый и грязный способ проверить серверную сторону (что-то искать в журнале запросов или, возможно, в MySQLProxy)? Я попытался прочитать источник библиотеки, но потерялся на полпути...

Теги:
pdo
adodb

1 ответ

0
Лучший ответ

Можно ли считать это определенным доказательством реального подготовленного заявления

Как говорится в документах, если вы пытаетесь подготовить оператор с использованием драйвера, который не поддерживает подготовленные операторы, возвращается только заданный запрос, в противном случае массив с запросом в качестве первого элемента. Поэтому, чтобы проверить, будет ли готовый оператор эмулироваться, просто проверьте, есть ли $stmt массив. Я предполагаю, что вы не попытались бы подготовить, передав массив, так что этого должно быть достаточно:

$stmt = $db->Prepare("SELECT * FROM pages WHERE id = ?");
if(is_array($stmt)){
    //prepared
}
else{
    //emulated
}

Если вы запутались, почему драйвер mysqli возвращает SQL, несмотря на драйвер mysqli, поддерживающий подготовленные отчеты, он объясняется в строке 662 драйверов /adodb -mysqli.inc.php:

// Prepare() not supported because mysqli_stmt_execute does not return a recordset, but
// returns as bound variables.
  • 0
    Ну, я пошел на тестовый перерыв, настраивая журнал запросов в MySQL и пробуя разные соединения: все дело сложнее, чем я думал! ADOdb с драйвером pdo_mysql действительно выдает инструкцию PDO-> prepare () - это PDO, которое затем эмулирует подготовленный оператор! Кажется, что единственный способ получить настоящий PS - это использовать собственные функции mysqli и отказаться от SELECT *.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню