Как проверить наличие эмулированных подготовленных операторов в ADOdb? - PullRequest
0 голосов
/ 01 декабря 2010

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

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

Проверка переменной оператора с помощью:

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

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

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

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

1 Ответ

0 голосов
/ 01 декабря 2010

Могу ли я принять это как определенное доказательство реального подготовленного оператора

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

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

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

// Prepare() not supported because mysqli_stmt_execute does not return a recordset, but
// returns as bound variables.
...