Как вывести SQL-запрос сразу после его выполнения

16 авг. 2013 г., 14:04:29
Просмотры: 166K
Голосов: 42

Я ищу способ, с помощью которого можно вывести выполненный 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)
            );

Было бы здорово увидеть, какие значения передаются в запрос.

Спасибо

1
Комментарии

Я знаю, что уже поздно, но на будущее. Вы можете просто вывести подготовленный оператор с помощью echo перед передачей его в запрос. Так будет точно проще.

Maciej Paprocki Maciej Paprocki
20 окт. 2016 г. 20:08:32
Все ответы на вопрос 5
8
91

Объект $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.

16 авг. 2013 г. 14:08:31
Комментарии

Хм, но в моем случае в $wpdb->last_query ничего нет.

Ravi Soni Ravi Soni
16 авг. 2013 г. 14:11:19

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

kaiser kaiser
16 авг. 2013 г. 14:32:09

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

Ravi Soni Ravi Soni
16 авг. 2013 г. 14:36:10

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

Kumar Kumar
16 авг. 2013 г. 14:38:21

Ошибка базы данных WordPress: [Запрос был пустым]

Ravi Soni Ravi Soni
16 авг. 2013 г. 14:45:23

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

kaiser kaiser
16 авг. 2013 г. 15:12:16

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

Brian C Brian C
22 дек. 2019 г. 08:19:38

@BrianC Возможно, вы захотите добавить ссылку на патч? Или, что еще лучше: добавить его в ответ? Или [отредактировать] этот ответ?

kaiser kaiser
26 дек. 2019 г. 23:23:01
Показать остальные 3 комментариев
2
19

Я перечислил здесь 3 подхода:

  1. Использование SAVEQUERIES и вывод всех запросов в подвале сайта
  2. Использование $wpdb->last_query для вывода только последнего выполненного запроса, что полезно для отладки функций.
  3. Использование плагина, такого как 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 на вашем шаблоне/странице, если слишком много ошибок.

16 авг. 2013 г. 14:15:34
Комментарии

Как получить запросы, инициированные через ajax?

itsazzad itsazzad
18 сент. 2015 г. 14:36:29

вы можете вывести то же самое в функции-обработчике ajax-действия.

Kumar Kumar
18 сент. 2015 г. 18:56:57
0

Необходимо добавить обе функции, иначе ошибки никогда не будут отображаться

$wpdb->show_errors(); 
$wpdb->print_error();

Эти функции покажут вам подробные ошибки, например такие:

Пример отображения ошибки в WordPress

15 апр. 2017 г. 14:04:35
0

Я хотел бы добавить, что лучший ответ с наибольшим количеством голосов от @kaiser не совсем корректен:

// Вывод последней SQL-запроса
$wpdb->last_query

Возвращаемое значение - это МАССИВ, а не строка. Поэтому для вывода последнего запроса следует сделать так:

echo 'Последний запрос: '.var_export($wpdb->last_query, TRUE);
4 июл. 2017 г. 23:36:06
0

Иногда последний запрос не очень релевантен. Например, $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)
7 июл. 2022 г. 11:02:18