2013-02-27 71 views
0

我試圖將我的舊MySQLI查詢轉換爲PDO,同時綁定所有變量以防止注入。這個特定的查詢從數組中獲取它的「WHERE」條件。從數組中綁定條件變量

$w=array(); 
if ($pos!='') $w[]="PositionId=':pos'"; 
if ($country!='') $w[]="CountryId=':country'"; 
if ($current!='') $w[]="IsCurrent=':current'"; 
if ($c1stat!='') $w[]=":c1stat :c1comp ':c1val'"; 
if ($c2stat!='') $w[]=":c2stat :c2comp ':c2val'"; 
if ($c3stat!='') $w[]=":c3stat :c3comp ':c3val'"; 
if ($c4stat!='') $w[]=":c4stat :c4comp ':c4val'"; 
if (count($w)) $where="WHERE ".implode(' AND ',$w); else $where=''; 

$query="SELECT * FROM table $where"; 
$result = $pdo->prepare($query); 
$result->bindParam(':pos', $pos); 
$result->bindParam(':country', $country); 
$result->bindParam(':iscurrent', $current); 
$result->bindParam(':c1stat', $c1stat); $result->bindParam(':c1comp', $c1comp); $result->bindParam(':c1val', $c1val); 
$result->bindParam(':c2stat', $c2stat); $result->bindParam(':c2comp', $c2comp); $result->bindParam(':c2val', $c2val); 
$result->bindParam(':c3stat', $c3stat); $result->bindParam(':c3comp', $c3comp); $result->bindParam(':c3val', $c3val); 
$result->bindParam(':c4stat', $c4stat); $result->bindParam(':c4comp', $c4comp); $result->bindParam(':c4val', $c4val); 
$result->execute(); 

我仍然試圖理解PDO和綁定變量,所以我正在努力實現這一目標。

的$查詢被正確地構建,例如,一條帶$國家條件語句生成:

SELECT * FROM skaterRScareer WHERE PositionId>='2' AND CountryId=':country' 

那麼,爲什麼不變量的約束? 在此先感謝!

回答

1

您不能綁定任何東西,但數據常量

  • 字符串文字 - 好吧
  • 數量文字 - 好吧字符串文字的
  • 部分 - 失敗
  • 標識符 - 失敗
  • 運營商 - 失敗
  • 功能 - 失敗
  • 語法關鍵字 - 失敗
  • 任意查詢部分 - 失敗

所以 - 唉! - 沒有操作員或標識符的佔位符。 您必須將其列入白名單。

你的代碼還有另一個問題。 你必須綁定變量只有真正把它做成查詢

看佔位符,如果$c3stat是空的,會出現在查詢中沒有:c3stat :c3comp :c3val佔位符 - 所以,你不應該綁定對應的變量以及

做它

if ($c3val) { 
    $w[] = "some field > :c3val"; 
    $values[":c3val"] = $c3val; 
} 

此外,沒有必要在佔位符周圍添加引號。

這裏是白名單

$fields  = array("name","price","qty"); 
$operators = array(">","<","="); 
$fkey  = array_search($_GET['sort'],$orders)); 
$okey  = array_search($_GET['sort'],$orders)); 
if ($fkey !== FALSE && $okey !== FALSE) { 
    $field = $fields[$fkey]; 
    $op  = $operators[$okey]; 
    $query .= "$field $op :placeholder"; 
} 
+0

感謝您的例子。我想我明白。 – dsol828 2013-02-27 14:04:30

+0

您可以舉一個如何將標識符列入白名單的例子嗎? – dsol828 2013-02-27 14:04:55

+0

我已經更新了我的答案。順便說一下,它似乎你使用我的舊代碼來處理條件查詢:)很高興它爲你工作之前,很高興再次幫助。如果我有時間,我會將舊代碼重新導入PDO。 – 2013-02-27 14:23:45