2012-10-21 112 views
0

我有一個「ajax腳本/處理程序」,它返回一堆產品類別到我的jqGrid。在SQL最終看起來就像這樣:PHP PDO問題與清理OR​​DER BY字段

$sql = 'SELECT * FROM product_categories ORDER BY :sidx :sord LIMIT :start , :limit'; 
$sth = $dbh->prepare($sql); 
$sth->bindParam(':sidx', $sidx); 
$sth->bindParam(':sord', $sord); 
$sth->bindParam(':start', $start, PDO::PARAM_INT); 
$sth->bindParam(':limit', $limit, PDO::PARAM_INT); 
$sth->execute(); 

現在,我已經與「$開始」的問題,因爲PDO顯然有一些問題與限制,使我不得不明確地將其設置爲(INT),所以上述可以工作。我的下一個問題是ORDER BY字段被引用。我如何停止報價?我可以直接傳遞'$ sidx'和'$ sord'的值而不消毒它們,但這會很危險。 眼下,獲取生成上面的SQL爲:

SELECT * FROM product_categories ORDER BY 'product_category' 'asc' LIMIT 0 , 10 

當我真正需要它看起來像:

SELECT * FROM product_categories ORDER BY product_category asc LIMIT 0 , 10 
+0

您是否允許用戶按列和方向輸入自己的訂單? –

+0

什麼是$ sord –

+0

jqGrid發送上述腳本處理程序的列順序字段和方向,例如:script.php?_search = false&nd = 1350834280848&rows = 10&page = 1&sidx = product_category&sord = desc將意味着腳本按照product_category字段順序排列方向 – SupaMonkey

回答

1

也許最好的解決方案將直接通過$sidx$sord值不消毒它們,但之前已經過驗證。如:

$sidx = (!in_array($sidx,array('name','slug','description'))) ? 'name' : $sidx; 
$sord = (!in_array($sord,array('asc','desc'))) ? 'asc' : $sord; 
$sql = 'SELECT * FROM product_categories ORDER BY '.$sidx.' '.$sord.' LIMIT :start , :limit'; 
$sth = $dbh->prepare($sql); 
$sth->bindParam(':start', $start, PDO::PARAM_INT); 
$sth->bindParam(':limit', $limit, PDO::PARAM_INT); 
$sth->execute(); 
+0

這可能是一個解決方案,是的,但是因爲我在許多數據庫表上使用了這個'代碼模板';每次獲得此設置將會花費更多的工作量。我不明白爲什麼不只是一個普通的mysql_real_escape_string類型的PDO功能!我開始希望我堅持MySQLi! – SupaMonkey

+1

'mysql_real_escape_string()'不用於這些目的。如果我通過'sidx'就像'name ASC; DROP TABLE product_categories;''mysql_real_escape_string()'不保護您的查詢。如果你在控制結構中使用變量,你應該像上面那樣檢查它們。如果你會找到其他解決方案,請告訴我們 – Mikhail

+0

謝謝,我必須這樣做,直到有更好的事情發生 - 如果它曾經做過:) – SupaMonkey