[英]MySQL query works from phpMyAdmin and returns rows, but $wpdb->get_results return nothing
[英]Wordpress $wpdb->get_results returns an empty array but phpMyAdmin returns multiple rows. Why?
我的 WordPress 插件代码如下所示:
$table = $wpdb->prefix."cf_form_entry_values";
$where = "entry_id = ".$entryid;
$select = "SELECT id FROM {$table} WHERE {$where}";
$query = $wpdb->prepare( $select );
$result = $wpdb->get_results( $query );
它产生以下 mysql 查询:SELECT id FROM wpqs_cf_form_entry_values WHERE entry_id = 49
WordPress 返回一个空数组。 没有报告 SQL 错误(我设置了 show_errors()),var_dump 为空。 但是,如果我将该查询剪切并粘贴到 phpMyAdmin 中,它会返回预期的行。 我不明白为什么 WordPress 给我的结果是空的。 我也试过 SELECT * FROM wpqs_cf_form_entry_values WHERE entry_id = 49
我注意到如果我删除 WHERE 子句,WordPress 很乐意将整个表返回给我,但为什么我不能用 WHERE 子句过滤它?
进一步测试后的更多信息……很好奇什么有效,什么无效。
这两个查询不起作用:
SELECT * FROM wpqs_cf_form_entry_values WHERE entry_id = 55 AND slug = 'photo'
SELECT * FROM wpqs_cf_form_entry_values WHERE entry_id = 55
但是这个确实:
SELECT * FROM wpqs_cf_form_entry_values WHERE slug = 'photo'
我试过将 entry_id 值放在引号中和不加引号。 这些额外的信息对任何人有帮助吗?
您能否尝试添加此代码?
$wpdb->show_errors( true )
也许它会显示一些关于它为什么不起作用的信息。 您是否尝试在没有 PHP 变量的情况下编写,例如完整的字符串?
也试着把桌子放在 qoutes
SELECT * FROM `wpqs_cf_form_entry_values`
我还注意到 SELECT 中缺少 entry_id 你应该像这样:
SELECT id,entry_id FROM `wpqs_cf_form_entry_values`
也尝试放在文件的顶部
global $wpdb
$where = "entry_id = ".$entryid; 我想 $entryid 应该被包裹在 ''
没有为wpdb->prepare()
方法正确设置 select 语句。
$wpdb->prepare()
需要 2 arguments。1) select 语句 2) 语句中变量的值。
其中值是一个数字:
"select * from table where id = %d";
其中值是一个字符串:
"select * from table where name = %s";
价值是“浮动”的地方:
"select * from table where id = %f";
其中 value 是混合的(任何数字或混合都是可能的):
"select * from table where id = %d OR name = %s OR price = %f";
%d
, %s
, %f
是 select 语句中唯一应该为 go 的 3 个值,该语句将被发送到wpdb->prepare()
在您的情况下,ASSUMING entry_id 是 integer,应按如下方式创建语句:
$table = $wpdb->prefix."cf_form_entry_values";
$where = "entry_id = %d";
$select = "SELECT id FROM $table WHERE $where";
第二个参数是替换“sprintf 格式”的一个或多个值。 这些必须按照它们在 select 语句中出现的顺序排列。 在您的情况下,唯一的值是$entryid
。 我在数组中传递这些值,但它们可以单独传递。 在您的情况下,我将按如下方式传递 select 语句和$entryid
:
$prepared_statement = $wpdb->prepare( $select,[$entryid] );
$results = $wpdb->get_results($prepared_statement);
请注意,我已将您的$result
变量更改为$results
因为此$wpdb->get_results()
用于返回多行。 如果您期望单行,最好将$wpdb->get_row()
与您准备好的语句一起使用。
更多信息:https://developer.wordpress.org/reference/classes/wpdb/prepare/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.