使用wpdb->Prepare for`ORDER BY`列名

时间:2014-03-24 作者:Sudar

在我当前的插件中,我选择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()的正确方法吗?我应该自己手动逃脱吗?

2 个回复
最合适的回答,由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 为了这个。

SO网友:Tom Auger

对于“ASC”“DESC”,白名单是一个很好的选项,但对于ORDERBY子句上的表名,WordPress有一个专门为您提供的内置函数!

https://codex.wordpress.org/Function_Reference/sanitize_sql_orderby

$order_by_col = sanitize_sql_orderby( $order_by_col );

结束

相关推荐

使用SQL查询更新用户元数据

我有一个Wordpress网站,需要导入9000多名用户才能建立目录列表。我从一个现有的MySQL(非wordpress)数据库导入了它们,导入的一切都很好。用户名、密码和显示名(MD5哈希,但我已测试,WP将在第一次登录时将密码更改为phpass)。事情是。。。它们都是在用户角色为NONE的情况下导入的。我需要将此更改为订阅服务器。现在,我可以进入phpMyAdmin,在wp\\u usermeta表中可以看到wp\\u capabilities字段。我可以看到我的管理员帐户是a:1:{s:13:“管理