Symfony QueryBuilder setParameters替换值

时间:2018-08-03 07:45:08

标签: symfony parameters query-builder

我对查询生成器有疑问。 当我删除参数并选择变量时,它将返回良好的值;

参数值:

dbpetrolcolumn = petrol_type

dbpricecolumn =价格

dbcitycolumn =城市

$qb = $conn->createQueryBuilder();
                $result =$qb
                    ->select(':city,:petrol,:price')
                    ->from($form['dbtable']->getData(), 'p')
                    ->setParameters([
                        'petrol'=>$form['dbpetrolcolumn']->getData(),
                        'price'=>$form['dbpricecolumn']->getData(),
                        'city'=>$form['dbcitycolumn']->getData(),
                    ])
                    ->execute()
                    ->fetchAll();
                var_dump($result);

并返回此数组:

array (size=6)
  0 => 
    array (size=3)
      'city' => string 'city' (length=4)
      'petrol_type' => string 'petrol_type' (length=11)
      'price' => string 'price' (length=5)
  1 => 
    array (size=3)
      'city' => string 'city' (length=4)
      'petrol_type' => string 'petrol_type' (length=11)
      'price' => string 'price' (length=5)
  2 => 
    array (size=3)
      'city' => string 'city' (length=4)
      'petrol_type' => string 'petrol_type' (length=11)
      'price' => string 'price' (length=5)

好人应该是

array (size=6)
      0 => 
        array (size=3)
          'city' => string 'Katowic' (length=4)
          'petrol_type' => string 'Pb95' (length=11)
          '4.50' 

1 个答案:

答案 0 :(得分:0)

如果您需要提供任意的列名称并在准备好的语句中替换它们,这确实表明设计不佳。我是否可以建议您更改数据库设计,以使列名恒定(按查询方式)?

如果上述方法不适合您,则需要回退以手动清理输入内容(例如列名)并将其与查询连接。与此相反,您仍然可以在WHERE谓词查询部分中使用准备好的语句。

有点像金达:您可以在桌子上方创建一个VIEW,然后让您的应用与该视图对话...

类似这样的东西:

$validColumnNames = [ ... ];
$validTableNames = [ ... ];

$inputColumns = [ 
    $form['dbpetrolcolumn']->getData(),
    $form['dbpricecolumn']->getData(),
    $form['dbcitycolumn']->getData()
];

$inputTableName = $form['dbtable']->getData();

if (!in_array($inputTableName, $validTableNames, TRUE)){
    throw new InvalidArgumentException("Go away!");
}

foreach ( $inputColumns as $col ){
    if ( !in_array($col, $validColumnNames, TRUE){
        throw new InvalidArgumentException("Go away!");
    }
}

$query = sprintf("SELECT %s, %s, %s FROM %s",
    $inputColumns[0], 
    $inputColumns[1], 
    $inputColumns[2], 
    $inputTableName
);

然后,您可以继续PreparedStatement并应用WHERE部分(如果需要)

希望这对您有帮助...