2014-02-09 89 views
-2

由於PDOStatement::執行文檔中說,「所有的值都爲PDO::PARAM_STR處理 所以我有以下問題綁定值和參數在PDO預處理語句:PHP

1)假設我有一個變量$_SESSION['id']=2和查詢

$sql='select * from articles where id=?'; 
$query=$con->prepare($sql); 
$query->execute(array($_SESSION['id'])); 

當我執行語句,它成功地執行。 這意味着它作爲一個整數.Does它做自動注入或違反該文件的語句將變量?

2)Suppse我有另一個查詢

select * from articles where id=? and category=? 

現在,這裏第一個參數是int和最後一個參數是string所以當我綁定參數$query->bindValue(2, $_GET['category'],PDO::PARAM_STR);做我需要指定PDO::PARAM_STR或者我可以依靠的默認實現,它默認情況下視爲string,如文檔所述。 3)我想從$_GET['category']到查詢中指定表名,但是我得到了以下格式的字符串(注意引用表名),從而導致SQL error.How我可以糾正它嗎?

select * from 'article'........... 

回答

2

1)當我執行語句,它成功地執行。它 表示它以整數形式傳遞變量。它是否自動執行 強制轉換或違反文檔聲明?

不,它傳遞參數作爲字符串。 MySQL正在透明地將其重新轉換爲int,因爲該列是一個int值,在這種情況下,它沒有副作用。

2)做我需要指定PDO::PARAM_STR或者我可以依靠的默認 實現,它默認爲 文件說,被視爲字符串。

除非API發生變化,否則可以肯定的是,如果文檔中有這樣的說明,它將被綁定爲一個字符串。我懷疑API會很快改變,或者根本不會改變。我仍然可以明確地將它綁定爲字符串,只是爲了讓讀者瞭解源代碼。

3)我想指定的$ _GET [ '類']表名到查詢 ...

你不能。您只能「置入」,而不是查詢的標識符或其他結構元素。參數化語句是明確地向結構查詢的動態內插到它之間分開;如果你可以動態插入結構元素,那麼這種分離就沒有意義了。

+0

在最後一個問題我想動態改變表名,其中我通過獲取'GET'.Isn't有什麼辦法來創建動態表名這樣的查詢。這就是最後一個問題 –

+0

的目的,你必須這麼做:'「SELECT * FROM $ table ...」'。您必須保留*允許的表名稱*白名單*!在以這種方式將查詢插入查詢之前,檢查「$ table」是否是一些允許的值之一。 – deceze

+0

@InsaneCoder如果你需要的話,這意味着你的數據庫設計是*瘋狂*,你最好使它*正常* –