当传递诸如“ASC”或“DESC”之类的值以进行类似的准备时:
[...]
$order = \'DESC\';
[... (the whole query)], $order); // (as a prepare param)
它不起作用,因为结果查询来自以下内容:
[...] group_concat(p.id ORDER BY p.post_date %s)
将是:
[...] group_concat(p.id ORDER BY p.post_date \'DESC\')
而应为:
[...] group_concat(p.id ORDER BY p.post_date DESC)
如何解决?
最合适的回答,由SO网友:Christian Lescuyer 整理而成
您不需要使用$wpdb->prepare()
对于ORDER BY
条款。$wpdb->prepare()
将始终引用您的变量。
假设您在请求中收到了排序,则可以通过根本不使用用户输入的值来防止SQL注入:
$sql = "SELECT....";
if ( \'asc\' == $_GET[\'order\'] ) {
$sql .= \' ORDER BY p.post_date ASC\';
} else {
$sql .= \' ORDER BY p.post_date DESC\';
}
$wpdb->prepare( $sql , $value_parameter );