Как вывести SQL-запрос сразу после его выполнения
Я ищу способ, с помощью которого можно вывести выполненный SQL-запрос сразу после:
$wpdb->query(
$wpdb->prepare("INSERT
INTO tbl_watchprosite SET
keywords=%s,url_to_post=%s,description=%s,
date_captured=%s,crawl_id=%d,
image_main=%s,images=%s,brand=%s,
series=%s,model=%s,condition=%s,box=%s,
papers=%s,year=%s,case_size=%s,status=%s,listed=%s,
asking_price=%s,retail_price=%s,payment_info=%s,forum_id=%d",
$this->getForumSettings()->search_meta,$element->href,$post_meta['description'],current_time('mysql'),$cid,$post_meta['image_main'],$images,$post_meta[0],$post_meta[1],$post_meta[2],$post_meta[3],$post_meta[4],$post_meta[5],$post_meta[6],$post_meta[7],$status,$post_meta[9],$post_meta[10],$post_meta[11],$this->getForumSettings()->ID)
);
Было бы здорово увидеть, какие значения передаются в запрос.
Спасибо
Объект $wpdb
имеет несколько свойств, которые можно использовать для этой цели:
global $wpdb;
// Вывести последний SQL-запрос
echo $wpdb->last_query;
// Вывести результат последнего SQL-запроса
echo $wpdb->last_result;
// Вывести ошибку последнего SQL-запроса
echo $wpdb->last_error;
Примечание: Сначала необходимо установить define( 'SAVEQUERIES', true );
в вашем файле wp-config.php
, находящемся в корневой папке WordPress.

Вы добавили define( 'SAVEQUERIES', true );
в ваш wp-config.php
или что-то вроде ! defined( 'SAVEQUERIES' ) AND define( 'SAVEQUERIES', true );
в ваш скрипт? Иначе это не будет работать.

Да, добавил. Думаю, запрос вообще не выполняется, поэтому в $wpdb->last_query ничего не записывается. :(

Включите wp_debug, чтобы увидеть ошибки или предупреждения, если они есть.

Попробуйте использовать $wpdb->get_results()
и ознакомьтесь с документацией Codex по $wpdb
.

Я знаю, что ваш исходный запрос был сделан давно, но похоже, что вы столкнулись с проблемой размера столбца. Для всех, кто ищет решение проблемы отсутствия результатов запроса без ошибок — предупреждаю, что wpdb завершает работу молча, без сообщения или ошибки, когда столбец в вашем запросе превышает размер столбца в вашей базе данных. Почти невозможно заметить, что это произошло, и WordPress, на мой взгляд, безответственно сопротивляется исправлению этого. Есть небольшой патч, который можно применить к wpdb.php в среде разработки, чтобы сделать эту проблему более заметной.

Я перечислил здесь 3 подхода:
- Использование
SAVEQUERIES
и вывод всех запросов в подвале сайта - Использование
$wpdb->last_query
для вывода только последнего выполненного запроса, что полезно для отладки функций. - Использование плагина, такого как Query Monitor.
Вам нужно добавить это в ваш wp-config.php
define('SAVEQUERIES', true);
Затем в подвале вашей темы добавьте этот код:
<?php
if (current_user_can('administrator')){
global $wpdb;
echo "<pre>Список запросов:";
print_r($wpdb->queries);
echo "</pre>";
}//Выводит все запросы, выполненные на странице
?>
Или если вы хотите вывести только последний выполненный запрос, вы можете использовать этот код сразу после вызова вашей функции $wpdb
запроса.
global $wpdb;
echo $wpdb->last_query;//выводит только один запрос
Третий подход — использовать плагин, такой как Query Monitor, который детально отображает все запросы, выполненные на странице, а также другую связанную информацию, такую как количество возвращенных строк, время выполнения или является ли запрос медленным. http://wordpress.org/plugins/query-monitor/
Хорошей практикой будет использовать этот плагин только в DEV-среде, и его не следует оставлять активным на рабочем сайте. Кроме того, Query Monitor иногда может вызывать проблемы с вашей страницей, например, ошибку 5XX на вашем шаблоне/странице, если слишком много ошибок.

Я хотел бы добавить, что лучший ответ с наибольшим количеством голосов от @kaiser не совсем корректен:
// Вывод последней SQL-запроса
$wpdb->last_query
Возвращаемое значение - это МАССИВ, а не строка. Поэтому для вывода последнего запроса следует сделать так:
echo 'Последний запрос: '.var_export($wpdb->last_query, TRUE);

Иногда последний запрос не очень релевантен. Например, $wpdb->last_query
выдал мне следующее:
SELECT wp_posts.* FROM wp_posts WHERE ID IN (410,337,350,353,352,351)
Очевидно, я искал запрос перед этим... Для достижения этой цели я использовал фильтр query
:
add_filter('query', function($query) {
echo $query;
return $query;
});
$my_query = new WP_Query($my_args);
// -> SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts WHERE 1=1 AND wp_posts.post_parent = 0 AND wp_posts.post_type IN ('attachment') AND ((wp_posts.post_status = 'inherit')) ORDER BY wp_posts.post_type DESC, wp_posts.post_date DESC LIMIT 0, 100
// -> SELECT FOUND_ROWS()
// -> SELECT wp_posts.* FROM wp_posts WHERE ID IN (410,337,350,353,352,351)
