首页 文章

Wordpress - get_results() - 如何知道失败还是空?

提问于
浏览
2

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

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

It says:

"If no matching rows are found, or if there is a database error, the return value will be an empty array."

然后我怎么知道查询是否失败或者它是否为空?

2 回答

  • 3

    使用

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

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

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

    在这里聚会迟到了,但我已经浏览了版本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
    }
    

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

    就个人而言,为了自己的利益,我已经围绕_1415286编写了自己的课程 . 这是我的 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;
    }
    

    希望这可以帮助 .

相关问题