如何在SQL中转义表名或列名?Esc_SQL不执行此操作

时间:2017-09-20 作者:Flimm

如果要在SQL查询中转义字符串值,可以使用WordPress的esc_sql 功能:

<?php

$wpdb->get_var( "SELECT * FROM something WHERE foo = \'" . esc_sql( $foo ) . "\'" );
您还可以使用更方便的prepare 功能如下:

<?php

$wpdb>-get_var(
    $wpdb->prepare(
        "SELECT * FROM something WHERE foo = %s",
        $foo
    )
);
然而,esc_sql 不适合转义表名或列名(仅限字符串值)。而且没有办法使用prepare 用于转义表名或列名。

我怎样才能逃脱$foo$bar 在这个示例中,SQL查询是否正确?

SELECT * FROM $foo WHERE $bar = "example";

2 个回复
最合适的回答,由SO网友:Flimm 整理而成

我找不到WordPress附带的可实现此功能的函数,因此我创建了自己的:

 function esc_sql_name( $name ) {
     return str_replace( "`", "``", $name );
 }
您可以这样使用它:

 $escaped_name = esc_sql_name( $column_name );

 $sql = $wpdb->prepare(
       "SELECT * FROM example WHERE `$escaped_name` = %s",
       $foobar
 );
参考号:

SO网友:JonShipman

使用该功能sanitize_key

请参见此处的开发人员文档:https://developer.wordpress.org/reference/functions/sanitize_key/

注意:它确实执行strtolower,因为WordPress核心标准确实需要小写列名。

结束

相关推荐

将mysqli查询迁移到wp_Query

我已经用纯PHP代码创建了我的网站,现在开始将其迁移到Wordpress平台。将身份验证从自己的系统更改为WP用户元非常容易。但是,当我将用户会话数据用于站点功能时,我现在必须查询用户元,而不是简单的MySqli查询。我的老问题如下。页面正在获取$provider, 什么是电子邮件地址。使用它,可以从数据库中获取所需的其余值:$provider=$_GET[\'provider\']; $providername=mysqli_query($db,\"SELECT name,email,phone