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

Jen*_*ell 5 database wordpress select wpdb

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

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

它说:

"如果找不到匹配的行,或者存在数据库错误,则返回值将为空数组."

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

Sag*_*ota 14

使用

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

}
Run Code Online (Sandbox Code Playgroud)

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

$wpdb -> show_errors ();
$wpdb -> get_results ($wpdb -> prepare($sql));
$wpdb -> print_error ();
Run Code Online (Sandbox Code Playgroud)


Jon*_*hon 5

在这里参加聚会有点晚,但我只是在寻找相同的东西。我浏览了wp-db.php4.4.2版中的代码。

在1422行中,方法内部flush()有一些代码可以重置last_error属性:

$this->last_error  = '';
Run Code Online (Sandbox Code Playgroud)

在第1693行的flush()方法中调用此方法query()

$this->flush();
Run Code Online (Sandbox Code Playgroud)

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

if ( $query ) {
    $this->query( $query );
} else {
    return null;
}
Run Code Online (Sandbox Code Playgroud)

有了这个,我们可以确定每次都或多或少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
}
Run Code Online (Sandbox Code Playgroud)

在我看来,这不是最直观的方法,但这似乎足够了。

我个人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;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。