出现问题的错误是因为您没有正确构建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::调用了prepare
incorrectly"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 有关该类及其方法/函数和属性的详细信息:)