PHP PDO问题与已清理的ORDER BY字段

时间:2012-10-21 15:36:19

标签: php jqgrid pdo

我有一个“ajax脚本/处理程序”,它将一堆产品类别返回给我的jqGrid。 sql最终看起来像这样:

$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();

现在,我已经遇到了'$ start'的问题,因为PDO显然存在LIMIT的问题所以我不得不明确地将它设置为(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

1 个答案:

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