2012-07-26 26 views
2

不管是否執行PDO PDO::ATTR_EMULATE_PREPARES設置爲,如何判斷PDO是否真的在模擬語句或者它們是否由本機驅動程序處理?如何判斷PDO是否正在模擬語句?

+0

不確定它是否可能,因爲它的全部目的是隱藏到php代碼,如果PDO正在模擬或不。 – T0xicCode 2013-01-16 17:02:49

回答

0

好吧,它似乎不可用作爲PDO連接處理程序屬性,因爲此設置可以在運行時更改。
但有可能爲語句處理程序獲取它。
因此,如果您想在啓動任何實際語句之前知道仿真狀態,則必須使用假查詢。作爲一個附加的證明,我的上露出仿真小動作可以使用:

try { 
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, FALSE); 
    $sth = $pdo->prepare("SELECT 1"); 
    $emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES); 
    var_dump($emul); 
    $sth = $pdo->prepare("SELECT 1 LIMIT ?,?"); 
    $sth->execute(array(1,2));  

    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, TRUE); 
    $sth = $pdo->prepare("SELECT 1"); 
    $emul = $sth->getAttribute(PDO::ATTR_EMULATE_PREPARES); 
    var_dump($emul); 
    $sth = $pdo->prepare("SELECT 1 LIMIT ?,?"); 
    $sth->execute(array(1,2));  
} catch (PDOException $e) { 
    echo $e->getMessage(); 
} 

輸出

bool(false) 
bool(true) 
SQLSTATE[42000]: Syntax error or access violation: 
1064 You have an error in your SQL syntax; 
check the manual that corresponds to your MySQL server version 
for the right syntax to use near ''1','2'' at line 1 

意味着在第二種情況下PDO只是模擬,進而使格式化爲字符串值導致一個解析錯誤。

雖然我沒有看到這種信息很多用途。爲什麼不把它設置爲你想要的任何條件?

相關問題