2015-03-26 1 views
1

Я использую в Wordpress функция $ wpdb-> get_results()Wordpress - get_results() - Как узнать, не удалось или нет?

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

Он говорит:

«Если нет соответствующих строк не найдено, или если есть ошибка базы данных, то возвращаемое значение будет пустым массивом. "

Затем, как я могу узнать, если запрос был неудачным или он пуст?

ответ

7

Использование

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

} 

Но если вы хотите знать, если запрос не удалось

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

Затем я получаю последнюю ошибку, если последний запрос имеет ошибку или нет. Последней ошибкой могло быть 10 запросов назад. –

+0

Можете ли вы проверить мое обновление –

2

бит поздно к партии здесь, но я просто смотрю на то же самое. Я просмотрел код wp-db.php версии 4.4.2.

В строке 1422, внутри метода flush() есть немного кода, который сбрасывает last_error свойство:

$this->last_error = ''; 

Этот flush() метод вызывается в методе query() на линии 1693:

$this->flush(); 

Метод get_results() вызывает query() по строке 2322:

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; 
} 

Надеюсь, это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^