【问题标题】:What are the possible reason of WordPress database error: [Query was empty]?WordPress数据库错误的可能原因是什么:[查询为空]?
【发布时间】:2016-07-28 05:01:03
【问题描述】:

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

WordPress 数据库错误 查询为空

我的这段代码会抛出几乎类似于上面的错误。

$query_select = $wpdb->get_results($wpdb->prepare(
    " % "
    , 1
),ARRAY_A);

我的问题是,有哪些可能的代码会像我上面的代码一样抛出query was empty

【问题讨论】:

  • 任何时候都有mysqli_error
  • 这是一个应该结束的可怕问题。在一个可怕的问题上添加赏金并不能使它成为一个更好的问题
  • 尝试完全删除插件并删除所有 wp_support_* 数据库表,然后重新安装并再次激活它们。
  • @PieterGoosen 我添加了赏金,因为没有人回答。

标签: php mysql wordpress wordpress-theming


【解决方案1】:

$wpdb->prepare 方法为 WordPress 执行此功能,它支持类似 sprintf() 和 vsprintf() 的语法。

支持 %s(字符串)、%d(整数)和 %f(浮点数)格式。

SQL 字符串文字中的所有 % 字符,包括 LIKE 通配符,都必须以 %% 形式进行双 % 转义。

因此,如果我们调试您的代码,我们会喜欢这样:

$sql = $wpdb->prepare(" % ", 1);
die( var_dump($sql) );

结果将是:string ' ' (length=1)

OMG 一个空字符串!这就是我们看到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 );

你可以在这里Class Reference/wpdb « WordPress Codex找到更多关于prepare方法和占位符的信息

【讨论】:

    【解决方案2】:

    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)
    

    所以,任何空查询都会返回此错误。

    【讨论】:

      【解决方案3】:

      当我们执行 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          
         }    
      

      【讨论】:

        【解决方案4】:

        有一些可能的方法来获取这些类型的错误。以下用法可能对您有用,也可能没用。

        使用 $wpdb 对象

        第一种方法 - 将 $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 );
        

        一些用户在下面的堆栈交换链接中提出了这类问题 To refer:

        Another link to refer

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-09-29
          • 2013-06-25
          • 2011-11-18
          • 2014-10-08
          • 2022-07-01
          • 1970-01-01
          • 2018-12-02
          • 1970-01-01
          相关资源
          最近更新 更多