我在下面遇到了错误,但似乎无法获得正确的错误日志。
WordPress数据库错误进行的查询的查询为空
我有这样的代码,会抛出几乎类似于上面的错误。
$query_select = $wpdb->get_results($wpdb->prepare(
" % "
, 1
),ARRAY_A);
我的问题是,在我上面的代码中,可能会抛出query was empty
的代码是什么。
有一些可能的方法可以获得这些类型的错误。以下用法可能对您有用,也可能对您没有用处。
使用$wpdb对象
1st方法-将$wpdb声明为全局,并使用它执行返回PHP对象的SQL查询语句
global $wpdb;
$results = $wpdb->get_results( 'SELECT * FROM wp_options WHERE option_id = 1', OBJECT );
第二种方法-使用$GLOBALS超全局。不需要全局关键字(但可能不是最佳实践)
$results = $GLOBALS['wpdb']->get_results( 'SELECT * FROM wp_options
WHERE option_id = 1', OBJECT );
一些用户在下面的堆栈交换链接中询问了这些类型的问题参考:
另一个链接引用
$wpdb->prepare
方法为WordPress执行此功能,WordPress同时支持类似sprintf()和类似vsprintf()的语法。
支持%s(字符串)、%d(整数)和%f(浮点)格式。
SQL字符串文字中的所有%字符(包括LIKE通配符)都必须是双字符-%转义为%%。
因此,如果我们调试您的代码,我们喜欢这样:
$sql = $wpdb->prepare(" % ", 1);
die( var_dump($sql) );
结果将是:string ' ' (length=1)
天哪,一个空字符串!这就是我们看到query was empty
错误的原因。
prepare方法要求格式字符串包含以下任何内容;%d
、%s
或%f
。因此,如果您希望SQL查询为1
,则需要将代码更改为:
$query_select = $wpdb->get_results( $wpdb->prepare('%d', 1), ARRAY_A );
或者,如果您希望SQL为%
,则需要使用另一个%
来转义它,如下所示:
$query_select = $wpdb->get_results( $wpdb->prepare('%%', 1), ARRAY_A );
您可以在这里找到更多关于prepare方法和占位符的信息ClassReference/wpdb«WordPress Codex
当我们执行wp-db查询时,它会更改上次查询中的属性。我不理解你的问题,但下面的代码,如果这对你有帮助的话。
global $wpdb;
$wpdb->get_results( $wpdb->prepare(" % " , 1 ) );
if( $wpdb->last_error ){
//print_r( $wpdb->dbh)
$dbh = $wpdb->dbh;
echo $dbh->errno; // if no == 1065 then query was empty
echo $dbh->error; // Query was empty
}
https://codex.wordpress.org/Class_Reference/wpdb请参阅示例。Prepare必须有一个有效的sql查询,其中包含查询中所需变量的占位符:
$wpdb->prepare(
"
SELECT sum(meta_value)
FROM $wpdb->postmeta //valid sql statements here
WHERE meta_key = %s
",
$meta_key)
与此同时,你的代码什么也不做:
$wpdb->prepare(
" % " //no sql statements here
, 1 ...)
看起来你想
select * from someTable where someField % 1 -- (it will return no rows)
因此,任何空查询都将返回此错误。