繁体   English   中英

Wordpress $wpdb->get_results 返回一个空数组,但 phpMyAdmin 返回多行。 为什么?

[英]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) 语句中变量的值。

  1. select 语句应按以下方式使用“sprintf 格式”创建:

其中值是一个数字:

"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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM