2010-11-30 69 views
0

我多年來一直在使用ADOdb作爲我的數據庫抽象和查詢緩存層。最近,我轉向準備好的聲明,主要是爲了安全,並對他們(或不)實施的方式感到好奇。如何檢查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中查找的東西)?我試着讀庫源,但迷路了一半......

回答

0

我能把這個作爲一個真正準備好的語句

由於單證說的確實的證據,如果你試圖準備發言使用不支持預準備語句的驅動程序,只返回給定查詢,否則返回查詢作爲第一個元素的數組。因此,要檢查準備好的語句是否將被模擬,只需檢查$stmt是否爲數組。我想你不會試圖通過傳遞一個數組做準備,所以這應該是足夠了:

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

如果你是困惑,爲什麼的mysqli司機儘管mysqli driver supporting prepared statements返回SQL,它司機的662生產線的解釋/adodb-mysqli.inc.php

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

好吧,我去了一個狂歡的測試設置查詢日誌在MySQL和嘗試不同的連接:整個事件的混亂比我想象的!帶有pdo_mysql驅動程序的ADOdb確實發出PDO-> prepare()指令 - 它是PDO itsef,然後模擬一個準備好的語句!似乎真正PS的唯一方法是使用本機mysqli函數並放棄SELECT *。 – djn 2010-12-02 06:25:04