绑定数组中的条件变量

时间:2013-02-27 13:25:51

标签: arrays data-binding pdo conditional

我试图将旧的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和绑定变量,因此我很难开始研究这个变量。

正在构建$ query,例如,生成了$ country条件的WHERE语句:

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

那么为什么变量没有约束? 提前谢谢!

1 个答案:

答案 0 :(得分: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";
}