在我当前的插件中,我选择order by
列作为用户输入。所以我想用wpdb->prepare
为了逃避它。
$wpdb->get_results($wpdb->prepare("Select id from $wpdb->posts order by %s %s", $order_by_col, $order_by);
这不起作用,因为它会变成
select id from wp_posts order by \'post_date\' \'asc\'
(注意引号)
那么有没有办法删除引号呢?这也是使用$wpdb->prepare()的正确方法吗?我应该自己手动逃脱吗?
最合适的回答,由SO网友:s_ha_dum 整理而成
您不能使用prepare
对于列名,也不能真正将其用于排序顺序。prepare
将始终引用字符串。您需要自己交换这些值。与其尝试“清理”数据,我会使用白名单方法。
$orderby = array(
\'date\' => \'post_date\',
// etc
);
$sortorder = array(
\'asc\' => \'ASC\',
\'desc\' => \'DESC\',
);
$orderbycol = \'ID\'; // just a default
if (isset($_GET[\'orderby\'])
&& isset($allowed[$_GET[\'orderby\']])) {
$orderbycol = $allowed[$_GET[\'orderby\']];
}
$order = \'ASC\';
if (isset($_GET[\'order\'])
&& isset($sortorder[$_GET[\'order\']])) {
$order = $sortorder[$_GET[\'order\']];
}
$sql = "Select id from $wpdb->posts order by $orderbycol $order";
echo $sql;
不过,我想知道你为什么不使用
WP_Query
为了这个。