我有一个“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
答案 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();