WordPress数据库错误的可能原因是什么:[查询为空]


What are the possible reason of WordPress database error: [Query was empty]?

我在下面遇到了错误,但似乎无法获得正确的错误日志。

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)

因此,任何空查询都将返回此错误。