2014-03-03 60 views
0

所以我有PDO的這個奇怪的問題,由於某些原因,綁定變量的查詢無法正確執行。讓我展示一些代碼:PDO沒有正確執行綁定變量

$conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pwd); 
$sth=$conn->prepare("select count(*) from article"); 
$sth->execute(); 
var_dump($sth->fetchColumn()); 

這會在表格「article」中打印出正確數量的條目。

但是,如果我們改變它咯,通過使表命名參數,而不是一個常數:

$conn = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pwd); 
$sth=$conn->prepare("select count(*) from :article"); 
$sth->execute(array(":article"=>"article")); 
var_dump($sth->fetchColumn()); 

這將打印一個布爾值false。這兩個語句應該返回相同的結果,但我不知道爲什麼第二個不起作用。我懷疑我的地方有一個拼寫錯誤,但我查了幾次,但沒有看到任何問題。任何人有任何想法?

回答

3

不可能。您正在嘗試爲表名使用佔位符。這是不允許的。佔位符只能替換值。

SELECT count(*) FROM :table WHERE field=:article 
        ^^^^^^--illegal ^^^^^^^^--legal 

對於這一點,你必須使用舊時尚串建設:

$table = "article"; 
$sth=$conn->prepare("select count(*) from $table"); 

,然後重新打開SQL注入攻擊漏洞,因爲你現在可直接插入外部數據導入一個SQL字符串。

+0

我正在將一個內部項目從mysql()移動到PDO,以避免SQL注入。主要的危險來自搜索查詢,哪些PDO應該能夠參數化。然而,即使我使用字符串連接,該應用程序也不適合SQL注入,因爲這是一個永遠不會被用戶觸及的值,所以我應該是安全的。 表名佔位符限制是否也適用於JOIN,或僅適用於FROM子句?我會認爲是的,但我會檢查確定。 – Ermir