0

我有一个“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
4

1 回答 1

1

也许最好的解决方案是直接传递$sidxand$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();
于 2012-10-21T17:38:02.520 回答