Wpdb->Get_row正在选择变量作为列名

时间:2021-02-25 作者:Mohammad Afzali

我正在使用wpdb获取一行表

$file = $wpdb->get_row( "SELECT *
                         FROM {$wpdb->prefix}vip_files 
                         WHERE {$file_hash} = `hashcode`" );
错误是:

[Unknown column \'4075c8514267d7926cd7f0cde577da2c\' in \'where clause\']   
SELECT * FROM wp_vip_files WHERE 4075c8514267d7926cd7f0cde577da2c = `hashcode`
4075c8514267d7926cd7f0cde577da2c是$file\\u哈希的值

它使用变量作为列名。如果我输入值而不是变量,它将起作用,但对于变量我会出错。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

出现问题的错误是因为您没有正确构建SQL查询/语句:

查询中的列名为hashcode, 您正在尝试获取列值与$file_hash 变量,即。WHERE {$file_hash} = `hashcode`.

但由于值是字符串/文本(而不是数字),因此需要用引号括起来,如下所示:\'$file_hash\'.

如果不这样做,那么该值将被视为列名,而不是假定的列值。

因此,解决问题基本上很容易-只需将变量用引号括起来,如下所示:

SELECT *
FROM {$wpdb->prefix}vip_files 
WHERE \'$file_hash\' = `hashcode`
但是,该查询很容易受到SQL注入攻击,因为$file_hash 不是逃避,所以你需要逃避它,我建议你使用wpdb::prepare() 像这样:

$query = $wpdb->prepare( "SELECT *
    FROM {$wpdb->prefix}vip_files 
    WHERE %s = `hashcode`",
    $file_hash
);

$file = $wpdb->get_row( $query );
还有,记住wpdb::prepare() 至少需要两个参数:带有占位符的SQL查询%s;以及SQL查询中使用的占位符的替换值,如下所示:$wpdb->prepare( "SELECT * FROM table_name WHERE some_column = %s", \'column value\' ).

所以这实际上是不正确的(这是你在评论中所说的)

$wpdb->prepare("SELECT * FROM {$wpdb->prefix}vip_files WHERE \'{$file_hash}\' = `hashcode`")

更具体地说,是的,该代码在MySQL不会引发任何错误的情况下工作。但这将导致PHP发布一条通知,上面写着;wpdb::调用了prepareincorrectly"E;。更糟糕的是,上面的代码实际上无法逃脱$file_hash 变量

正确的代码是这样的-我使用了%s 占位符和$file_hash 现在是的第二个参数$wpdb->prepare():

$wpdb->prepare("SELECT * FROM {$wpdb->prefix}vip_files WHERE %s = `hashcode`", $file_hash)

wpdb::prepare() 请注意,转义变量值不仅可以确保查询不受SQL注入的影响,还可以帮助我们避免SQL中的语法错误。我的意思是,当变量值是90\'s favorites (请注意报价)。

我希望这会有所帮助,请查看全班reference 有关该类及其方法/函数和属性的详细信息:)

相关推荐

构建具有多个赞的动态WPDB查询

我需要使用多个字符串查询数据库表。只有当;“标签”;列匹配所有字符串。我事先不知道字符串的数量(它是动态的)。我想我很熟悉这段代码,但我没有从数据库中获得任何匹配项: function getMatchingRecipes() { // get the search query: $tags = ($_POST["tagsToSearchWith"]); // clean it up: