我对查询生成器有疑问。 当我删除参数并选择变量时,它将返回良好的值;
参数值:
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'
答案 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
部分(如果需要)
希望这对您有帮助...