【发布时间】:2012-10-21 15:36:18
【问题描述】:
我有一个“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
【问题讨论】:
-
您是否让用户能够按列和方向输入自己的订单??
-
jqGrid 向上述脚本处理程序发送列顺序字段和方向,例如:script.php?_search=false&nd=1350834280848&rows=10&page=1&sidx=product_category&sord=desc 表示脚本将按 product_category 字段排序下降方向
-
我见过 Alex,但它没有帮助。第一个答案告诉您不能绑定列名;但是我将如何清理变量?第二个答案告诉您直接使用变量,但在我的情况下,那很危险。我需要手动清理 $sidx 和 $sord 并直接在 $sql 中使用它们 - 但是,如何“手动”清理?加斜线够吗?
-
只是做了一些研究并添加了斜杠 ISNT 不够;所以需要以其他方式手动对其进行消毒吗? mysql_real_escape_string 仅适用于其前面的有效 mysql_connect;并且手动 pdo::quote() 无论如何都会添加引号,所以这也无济于事!