【问题标题】:Wordpress - get_results() - How to know if failed or empty?Wordpress - get_results() - 如何知道是失败还是空?
【发布时间】:2015-05-30 05:19:35
【问题描述】:

我使用 Wordpress 函数 $wpdb->get_results()

https://codex.wordpress.org/Class_Reference/wpdb#SELECT_Generic_Results

上面写着:

“如果没有找到匹配的行,或者数据库出错,返回值将是一个空数组。”

那我怎么知道查询是失败还是为空呢?

【问题讨论】:

    标签: database select wordpress


    【解决方案1】:

    Wpdb->get_results 函数来自 wordpress,如果成功则返回结果,否则返回 null。查询失败可能有多种原因。请参阅有关调试 get_results() 返回empty results here的深入文章

    虽然您可以使用 wpdb->show_error() 之类的函数来检查执行 sql 查询后的最后一个错误是什么。有时此错误返回空 然后尝试使用wpdb->last_query 检查形成的最终查询。

    【讨论】:

      【解决方案2】:

      在这里聚会有点晚了,但我只是在寻找同样的东西。我浏览了 4.4.2 版的 wp-db.php 代码。

      在第 1422 行,在方法 flush() 中有一段代码重置了 last_error 属性:

      $this->last_error  = '';
      

      这个flush()方法在第1693行的query()方法中被调用:

      $this->flush();
      

      get_results() 方法在第 2322 行调用 query()

      if ( $query ) {
          $this->query( $query );
      } else {
          return null;
      }
      

      有了这个,我们可以非常确定每次调用get_results()(或者get_row())时,query()flush() 都被调用,这确保last_error 是在执行查询之前设置为空字符串。

      因此,假设查询运行(如果没有运行,则返回 null - 例如,如果查询为空),如果查询由于某种原因失败,last_error 应该包含错误消息。

      由于last_error 每次都是flush()ed/reset,它应该只包含上次运行的查询的错误,而不是之前运行的任何查询的最后一个错误。考虑到这一点,依靠last_error 来确定查询是否有问题应该是安全的。

      $results = $wpdb->get_results($sql);
      if (is_null($results) || !empty($wpdb->last_error)) {
          // Query was empty or a database error occurred
      } else {
          // Query succeeded. $results could be an empty array here
      }
      

      在我看来不是最直观的,但似乎已经足够了。

      就我个人而言,为了自己的利益,我围绕wpdb 编写了自己的课程。这是我的getResults() 方法。

      public function getResults($query, $bindings = [])
      {
          // Prepare the statement (My prepare method inspects $query and just returns it if there's no bindings, otherwise it uses $wpdb->prepare()        
          $prepared = $this->prepare($query, $bindings);
      
          // Execute the statement
          $rows = $this->db->get_results($prepared, ARRAY_A);
      
          // If an array was returned and no errors occurred, return the result set
          if (is_array($rows) && empty($this->db->last_error)) {
              return $rows;
          }
      
          // On failure, return false
          return false;
      }
      

      希望这会有所帮助。

      【讨论】:

        【解决方案3】:

        使用

        $results=$wpdb->get_results($yoursql);
        if (count($results)> 0){
            //do here
        
        }
        

        但是如果你想知道查询是否失败

        $wpdb -> show_errors ();
        $wpdb -> get_results ($wpdb -> prepare($sql));
        $wpdb -> print_error ();
        

        【讨论】:

        • 然后我得到最后一个错误,而不是最后一个查询是否有错误。最后一个错误可能是 10 次查询前。
        猜你喜欢
        • 2020-03-01
        • 2019-01-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多