Я использовал 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)? Я попытался прочитать источник библиотеки, но потерялся на полпути...
Можно ли считать это определенным доказательством реального подготовленного заявления
Как говорится в документах, если вы пытаетесь подготовить оператор с использованием драйвера, который не поддерживает подготовленные операторы, возвращается только заданный запрос, в противном случае массив с запросом в качестве первого элемента. Поэтому, чтобы проверить, будет ли готовый оператор эмулироваться, просто проверьте, есть ли $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.