Комментарии 4 — wpdb{} — Позволяет производить любые операции с базой данных WordPress: вставлять, обновлять, получать или удалять данные. Класс WordPress.
Опубликовано: 01.09.2018
Позволяет производить любые операции с базой данных WordPress: вставлять, обновлять, получать или удалять данные.
WordPress предоставляет возможность удобно манипулировать своей базой данных за счет php класса wpdb.
php класс - относится к ООП (объектно-ориентированному программированию) и в традиционном своем понимании представляет собой полностью самодостаточный код, который должен выполнять определенную функцию. Например, в этом случае через класс wpdb мы может производить всевозможные операции с Базой Данных WordPress зная всего несколько "рычагов" управления классом, которые называются методами. Если говорить условно, то методы - это обычные php функции, только внутри класса.
Обращаться к методам класса wpdb нужно обязательно через глобальную переменную $wpdb (это экземпляр класса wpdb). Также нужно помнить, что внутри обычных функций нужно обязательно глобализировать $wpdb, иначе она будет простой переменной внутри функции, делается это так:
global $wpdb;C помощью методов $wpdb можно управлять произвольными таблицами в базе данных, не обязательно только теми, которые были созданы WordPress. Допустим, среди прочих таблиц WP, есть таблица newtable и нам нужно выбрать все поля id из нее. Реализовать это можно таким SQL запросом используя $wpdb :
$newtable = $wpdb->get_results( "SELECT id FROM newtable" );Создавать свои таблицы рекомендуется с помощью функции dbDelta() . Или можно использовать обычный SQL запрос и метод $wpdb->query('CREATE TABLE ...');.
Для плагинов создание новых таблиц обычно вешается на хук активации плагина, см. register_activation_hook() .
Создание отдельного подключения к базе данных
Нужно понимать, что один объект класса wpdb{} работает с одной БД - с текущей базой данных WordPress. Если нужно работать параллельно с какой-либо другой БД, то нужно создать еще один объект класса wpdb с указанием новых параметров соединения, отличных от тех что указаны в wp-config.php. Делается это так:
global $wpdb2; $wpdb2 = new wpdb( 'имя_юзера', 'пароль', 'название_БД', 'localhost' ); // если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке if( ! empty($wpdb2->error) ) wp_die( $wpdb2->error ); // Готово, теперь используем функции класса wpdb $results = $wpdb2->get_results("SELECT * FROM table");Для сложных соединений с несколькими БД (репликами), есть хороший плаглин, который рекомендуют разработчики WP - hyperdb . Этот плагин расширяет возможности базового класса wpdb. Устанавливается он не как обычный плагин и требует определенных знаний работы с базами данных (в противном случае, толку от этого плагина не будет).
А теперь, перейдем к разбору класса wpdb.
Хуки из класса:
Возвращает
Экземпляр класса.
query - произвольный запрос к Базе Данных WordPress
Позволяет выполнять любые запросы к базе данных WordPress. В общем случае, она подразумевает выполнение не SELECT запросов, хотя и они могут также выполняться (но для них существуют $wpdb->get_results и другие функции см. ниже).
Возвращает
Число/false. Вернет количество строк, которые были задействованы в результате запроса (удалены/изменены/выбраны). Если запрос вызвал ошибку, то будет возвращено значение false.
$wpdb->query('query'); query(строка) Запрос который нужно выполнить.Имейте ввиду, что как и для всех функций класса wpdb, передаваемые параметры нужно очистить от SQL инъекций, сделать это можно двумя способами: esc_sql($user_entered_data_string) или $wpdb->prepare( 'query' , value_parameter[, value_parameter ... ] ). Подробнее читайте в секции "Защита запросов от SQL инъекций". см. ниже.
Примеры
#1. Удалить произвольное поле 'gargle' и его значение у поста 13
$wpdb->query("DELETE FROM $wpdb->postmeta WHERE post_id = '13' AND meta_key = 'gargle'");#2. Установить родительскую страницу 7 для страницы 15
$wpdb->query(" UPDATE $wpdb->posts SET post_parent = 7 WHERE ID = 15 AND post_status = 'static'");get_var - получение определенной ячейки таблицы
Получает значение первой колонки и первой строки из результата запроса.
Чтобы получить значение второй ячейки из второй строки результата, используйте второй и третий параметры: $column_offset = 1, $row_offset = 1.
Возвращает
Значение колонки: число, строку, дату и т.д.
Если запрос получает значение одной колонки, то функция вернет это значение (без всяких массивов). Если запрос получает одну строку и несколько колонок, то функция вернет значение первой колонки (ячейки). Если запрос получает несколько строк и колонок, то вернется значение первой строки первой колонки. Вернет NULL, если результата нет. $wpdb->get_var('query', $column_offset, $row_offset ); query(строка) Запрос который нужно выполнить. Можно установить этот параметр в значение null, тогда функция вернет результат последнего запроса, который был выполнен классом (сохранился в переменной). column_offset(число) Нужная колонка (отступ по колонкам). по умолчанию 0 - первая колонка. row_offset(число) Нужная строка (отступ по строкам). по умолчанию 0 - первая строка.Примеры
#1. Выведем на экран количество пользователей
$user_count = $wpdb->get_var($wpdb->prepare("SELECT COUNT(*) FROM $wpdb->users;")); echo '<p>Количество пользователей равно: ' . $user_count . '</p>';#2. Выведем на экран количество определенных произвольных полей
// определяем произвольный ключ, который нужно посчитать $meta_key = 'miles'; $allmiles=$wpdb->get_var($wpdb->prepare("SELECT sum(meta_value) FROM $wpdb->postmeta WHERE meta_key = %s", $meta_key)); echo '<p>Общее количество произвольных полей miles: '.$allmiles . '</p>';#3. Набор выводов статистики блога
### Общее Количество авторов блога function get_totalauthors() { global $wpdb; $totalauthors = intval($wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->users LEFT JOIN $wpdb->usermeta ON $wpdb->usermeta.user_id = $wpdb->users.ID WHERE $wpdb->users.user_activation_key = '' AND $wpdb->usermeta.meta_key = '".$wpdb->prefix."user_level' AND (meta_value+0.00) > 1")); return $totalauthors; } ### Общее Количество постов function get_totalposts() { global $wpdb; $totalposts = intval($wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->posts WHERE post_type = 'post' AND post_status = 'publish'")); return $totalposts; } ### Общее Количество страниц function get_totalpages() { global $wpdb; $totalpages = intval($wpdb->get_var("SELECT COUNT(ID) FROM $wpdb->posts WHERE post_type = 'page' AND post_status = 'publish'")); return $totalpages; } ### Общее Количество комментариев function get_totalcomments() { global $wpdb; $totalcomments = intval($wpdb->get_var("SELECT COUNT(comment_ID) FROM $wpdb->comments WHERE comment_approved = '1'")); return $totalcomments; } ### Общее Количество комментаторов function get_totalcommentposters() { global $wpdb; $totalcommentposters = intval($wpdb->get_var("SELECT COUNT(DISTINCT comment_author) FROM $wpdb->comments WHERE comment_approved = '1' AND comment_type = ''")); return $totalcommentposters; } ### Общее Количество ссылок function get_totallinks() { global $wpdb; $totallinks = intval($wpdb->get_var("SELECT COUNT(link_id) FROM $wpdb->links")); return $totallinks; }get_row - выбор строки таблицы
Получает одну строку таблицы в виде объекта. Если результат запроса содержит больше одной строки, то функция получит только первую строку результата. Чтобы получить вторую строку из запроса, укажите параметр $row_offset = 1.
Возвращает
Объект/массив/null. Вернет null, если не удалось получить данные.
$wpdb->get_row('query', $output_type, $row_offset); query(строка) Запрос который нужно выполнить. output_type Одна из трех констант. по умолчанию OBJECT. Может быть: OBJECT - результат будет возвращен в виде объекта. ARRAY_A - результат будет возвращен в виде ассоциативного массива. ARRAY_N - результат будет возвращен в виде пронумерованного массива. row_offset(число) Номер возвращаемой строки результата запроса. 0 - это первая строка (установлено по умолчанию)Примеры
#1. Получим всю информацию о ссылке 10
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10"); // Теперь, свойства (переменные) $mylink - это названия //колонок из таблицы $wpdb->links со значениями полей таблицы: echo $mylink->link_id; // выведет на экран "10"#2. С использованием константы:
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A); // результатом будет ассоциативный массив echo $mylink['link_id']; // выведет на экран "10"или
$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_N); // результатом будет пронумерованный массив echo $mylink[1]; // выведет на экран"10"get_col - выбор столбца таблицы
Функция выбирает данные целой колонки таблицы и возвращает их в виде одномерного массива.
Если запрос вернул больше чем одну колонку (столбец), то функция вернет только данные первого столбца, остальное можно будет получить из переменной last_result. Можно указать отступ в $column_offset, чтобы получить данные не первого столбца, а, например, второго: $column_offset = 1.
Возвращает
Массив с данными запроса. Пустой массив, если не удалось получить данные.
$wpdb->get_col( $query, $column_offset ); $query(строка) Запрос который нужно выполнить. Можно установить этот параметр в значение null, тогда функция вернет результат последнего запроса, который был произведен. $column_offset(число) Флаг указывающий какую колонку возвращать. По умолчанию 0 (первая колонка).Примеры
#1. Выбор столбца из результатов запроса
Для этого примера представим, что у нас блог об автомобилях. Каждый пост описывает какой-либо автомобиль (например, Ford Mustang 1969 года). Для каждого поста предусмотрено по 3 произвольных поля: manufacturer (производитель), model(модель) и year(год выпуска). Этот пример выведет на экран заголовки постов, отфильтрованных по производителю (ford) и отсортированных по модели и году.
get_col здесь используется для того, чтобы получить массив ID всех записей, удовлетворяющих определенным критериям и отсортированных в нужном порядке. Затем через цикл foreach мы выводим заголовки по имеющимся у нас ID:
<?php $meta_key1 = 'model'; $meta_key2 = 'year'; $meta_key3 = 'manufacturer'; $meta_key3_value = 'Ford'; $postids = $wpdb->get_col($wpdb->prepare(" SELECT key3.post_id FROM $wpdb->postmeta key3 INNER JOIN $wpdb->postmeta key1 on key1.post_id = key3.post_id and key1.meta_key = %s INNER JOIN $wpdb->postmeta key2 on key2.post_id = key3.post_id and key2.meta_key = %s WHERE key3.meta_key = %s and key3.meta_value = %s ORDER BY key1.meta_value, key2.meta_value",$meta_key1, $meta_key2, $meta_key3, $meta_key3_value)); if ($postids) { echo 'List of ' . $meta_key3_value . '(s), sorted by ' . $meta_key1 . ', ' . $meta_key2; foreach( $postids as $id ){ $post = get_post(intval($id)); setup_postdata($post); ?> <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p> <?php } }#2. Список постов которые имеют определенное произвольное поле (Color), но отсортированы они по значению другого произвольного поля (Display_Order).
$meta_key1 = 'Color'; $meta_key2 = 'Display_Order'; $postids = $wpdb->get_col($wpdb->prepare(" SELECT key1.post_id FROM $wpdb->postmeta key1 INNER JOIN $wpdb->postmeta key2 on key2.post_id = key1.post_id and key2.meta_key = %s WHERE key1.meta_key = %s ORDER BY key2.meta_value+(0) ASC", $meta_key2,$meta_key1)); if ($postids) { echo 'List of '. $meta_key1 . ' posts, sorted by ' . $meta_key2 ; foreach ($postids as $id) { $post=get_post(intval($id)); setup_postdata($post);?> <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p> <?php } }get_results - выборка комбинированных результатов
Получает различные данные из нескольких строк таблицы. Функция возвращает результат запроса в массиве, каждый элемент которого представляет собой результат функции get_row, т.е. в каждом элементе массива находятся все запрашиваемые данные одной строки таблицы или строки из полей указанных в запросе.
Возвращает
Массив/объект/null.
Результат запроса в виде массива объектов (OBJECT, OBJECT_K), массива массивов (ARRAY_A, ARRAY_N). Вернет пустой массив: array() — когда строк по запросу не найдено или ошибка запроса. Вернет NULL — когда запрос пустая строка или передан неправильный тип вывода ($output_type). $wpdb->get_results('query', output_type); query(строка) Запрос который нужно выполнить. Можно установить этот параметр в значение null, тогда функция вернет результат последнего запроса, который был произведен. output_type(строка)Флаг указывающий как нужно вернуть данные. По умолчанию OBJECT. есть 4 варианта:
OBJECT - вернет массив объектов с числовыми ключами - элементы массива будут объекты полученных данных. OBJECT_K - похож на предыдущий, только в индексах главного массива будут значения первой колонки результата запроса. Обратите внимание, если в индекс будут попадать одинаковые значения, то данные будут стирать друг друга... ARRAY_A - вернет нумерованный двумерный массив, каждый вложенный элемент которого будет ассоциативным массивом, в котором ключом будет название колонки. ARRAY_N - вернет нумерованный двумерный массив, каждый вложенный элемент которого будет так же нумерованным массивом.Примеры
#1. Получим ID и заголовки черновиков, ID автора которых равен 5 и выведем на экран заголовки постов.
$fivesdrafts = $wpdb->get_results("SELECT ID, post_title FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5"); foreach ($fivesdrafts as $fivesdraft) { echo $fivesdraft->post_title; }#2. Выведем на экран ссылки на черновики автора с ID = 5
<?php $fivesdrafts = $wpdb->get_results("SELECT * FROM $wpdb->posts WHERE post_status = 'draft' AND post_author = 5"); if ($fivesdrafts) : foreach ($fivesdrafts as $post) : setup_postdata($post); ?> <h2><a href="<?php the_permalink(); ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>"><?php the_title(); ?></a></h2> <?php endforeach; else : ?> <h2> Не найдено</h2> <?php endif; ?>#3. Пример сложного запроса с GROUP BY (отзывов в WooCommerce)
/** * Возвращает результаты рейтинга (отзывов в WooCommerce) сгрупированный по оценкам * * @param int $post_id идентификатор поста * * @return array массив объектов, где каждый объект - сгрупированные данные по одной из оценок */ function get_cnt_rating_reviews_one_product($post_id){ global $wpdb; return $wpdb->get_results( $wpdb->prepare(" SELECT COUNT(meta.meta_id) as num, meta.meta_value FROM $wpdb->comments as comments INNER JOIN $wpdb->commentmeta as meta ON comments.comment_ID = meta.comment_id WHERE comments.comment_post_ID = %d AND meta_key = 'rating' GROUP BY meta.meta_value; ", $post_id ) ); } // использование get_cnt_rating_reviews_one_product( 4350 );insert - вставка новой записи (строки) в таблицу
Вставляет указанные данные в указанную таблицу.
$wpdb->insert() включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']...
Возвращает
true/false.
true — при успешной записи данных; false — если данные не были вставлены в таблицу.После добавления данных созданное значение AUTO_INCREMENT можно получить в переменной: $wpdb->insert_id
$wpdb->insert( $table, $data, $format ); table(строка) Название таблицы в которую будем вставлять данные. data(строка) Данные которые нужно вставить ('колонка куда вставлять' => 'что вставлять'). format(строка)Формат данных который будет ассоциирован с указанными значениями в параметре $data. Если не указать, то для всех значений $data будет указан формат строки. При указании формата, WordPress переводит переданные данные в указанный формат перед тем, как сохранить данные в базу данных. Возможные форматы данных:
%s - строка %d - целое число %f - дробное числоПримеры
#1. Вставим в значение в строку таблицы table, где первое значение строка, а второе число:
$wpdb->insert( 'table', array( 'column1' => 'value1', 'column2' => 123 ), array( '%s', '%d' ) )update - обновление записи (строки) в таблице
Возвращает
Число (кол-во обраб. строк), 0 или false.
число - сколько строк было обработано 0 - запрос был выполнен корректно, но ни одна строка не была обработана. false - запрос провалился или ошибка запроса.Так как возвращается 0, если никакие поля не были обновлены (изменены), но запрос был выполнен корректно, проверку результата запроса на ошибку нужно делать с учетом типа возвращаемых данных $res === false.
$wpdb->update() включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']...
$wpdb->update( $table, $data, $where, $format = null, $where_format = null ); table(строка) Название таблицы, которую нужно обновить. data(массив) Данные, которые нужно обновить ('название колонки' => 'новое значение'). where(массив) Ассоциированный массив с условием для замены (WHERE) ( 'название колонки' => 'чему равно'). format(массив/строка) Формат данных который будет ассоциирован с указанными значениями в параметре $data. По умолчанию: null where_format(массив/строка) Формат данных который будет ассоциирован с указанными значениями в параметре $where. Возможные значения формата: %s - строка; %d - любое число; %f - FLOAT число. Если не указать формат, то все значения в WHERE будут обработаны как строки. По умолчанию: nullПримеры
#1. Обновим строку ID которой равен 1
Значение первой колонки строка, значение второй колонки число:
$wpdb->update( 'table', array( 'column1' => 'value1', 'column2' => $_GET['val'] ), array( 'ID' => 1 ) );#2. Тоже самое с указанием типов передаваемых данных
$wpdb->update( 'table', array( 'column1' => 'value1', 'column2' => $_GET['val'] ), array( 'ID' => 1 ), array( '%s', '%d' ), array( '%d' ) );replace - замена строки
Обновляет или создает строку в таблице. Если строка с указанным ключом PRIMARY KEY уже есть все остальные указанные поля будут обновлены у строки. Если такой строки в таблице еще нет, то функция вставит (insert) новую строку.
После вставки, ID созданный для колонки AUTO_INCREMENT можно получить в свойстве $wpdb->insert_id .
PRIMARY KEY может состоять из нескольких ключей. В этом случае при поиске для замены или для создания новой строки всегда будут использоваться колонки указанные в PRIMARY KEY. Например PRIMARY KEY состоит из двух колонок ID и type, т.е. ключ при создании указывался так: PRIMARY KEY (ID,type). Тогда для замены существующей строки в $data нужно указать значение этих двух колонок. Если например указать ID и не указать type, то существующая строка не будет найдена и будет создана новая строка с указанным ID и пустым значением type. Все остальные поля кроме полей из PRIMARY KEY в поиске существующей строки не участвуют.
Если длина строки в параметре $data больше чем допускается в ячейке таблицы MySQL, вставка провалиться и функция вернет false. При этом в свойство $wpdb->last_error сообщение об ошибке НЕ будет записано!
Поэтому очень важно убедиться, что вставляемые данные подходят под размер ячеек (колонок). Иначе просто ничего не произойдет и вы не увидите никаких ошибок или предупреждений...
Возвращает
Число (кол-во обработанных строк), 0 или false.
число - сколько строк было обработано (удалено или вставлено). Если была замена (обновление), то для каждой обновленной строки вернется +2 (удаление и вставка). Если была просто вставка, то для каждой вставленной строки вернется +1. 0 - запрос был выполнен корректно, но ни одна строка не была обработана. false - запрос провалился - ошибка запроса. Или когда невозможно заменить или создать новую строку в таблице.Вернет количество затронутых строк - это сумма вставленных и удаленных строк. Если вернулось 1 при замене одной строки - это значит что одна строка была вставлена и ни одна не была удалена. Если число больше 1 - это значит, что одна или больше строк были удалены перед вставкой новой строки.
Иногда может произойти замена сразу нескольких старых строк - это когда заменяемые данные совпадают с существующими, а уникальный индекс у старых строк при этом разный.
$wpdb->replace( $table, $data, $format = null ); $table(строка) Название таблицы, в которой нужно заменить данные. $data(массив) Данные, которые нужно заменить/вставить: 'название колонки' => 'новое значение'. $format(массив/строка) Формат данных который будет ассоциирован с указанными значениями в параметре $data. Если не указать, то все поля будут считаться строками, если другого не указано в свойстве wpdb::$field_types. Возможные значения формата: %s - строка, %d - число (любые числа), %f - дробное число (с плавающей точкой). По умолчанию: nullПримеры
Заменим строку с главным ключом ID = 1, заменим в ней значения колонок column1 и column2:
$wpdb->replace( 'table_name', array( 'ID' => 1, 'column1' => 'value1', 'column2' => 123 ), array( '%d', '%s', '%d' ) );delete - удаление строки из таблицы
Удаляет строки из таблицы по переданному в параметр $where условию.
$wpdb->delete() включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']...
Возвращает
Число/0. Число удаленных строк или 0, если ничего не удалено.
$wpdb->delete( $table, $where, $where_format = null ); $table(строка) (обязательный) Название таблицы. $where(массив) (обязательный) Массив условий, по которым будут выбираться строки для удаления. Например: array('id' => 25, 'title' => 'книги') удалит строку с полями id=25 и title=книги. $where_format(строка/массив) Формат данных который будет ассоциирован с указанными значениями в параметре $where. Возможные значения формата: %s - строка; %d - любое число; %f - FLOAT число. Если не указать формат, то все значения в WHERE будут обработаны как строки. По умолчанию: nullПримеры
// Удалим строку с полем ID=1 из таблицы table $wpdb->delete( 'table', array( 'ID' => 1 ) ); // Укажем формат значения $where $wpdb->delete( 'table', array( 'ID'=>'1' ), array( '%d' ) ); // 1 будет обработано как число (%d)...prepare - защита запроса от SQL инъекций
В SQL есть такое понятие как "внедрение в запрос SQL кода", сделать это можно когда в запрос передаются динамические данные. Например, в запрос передаются значение input полей формы, тогда в поле формы можно указать данные, которые в итоге станут частью SQL запроса. Так можно внедриться в запрос и что-нибудь испортить или просто нарушить код самого запроса. Выглядит это примерно так:
SELECT * FROM table WHERE id = '$var' // если $var будет равно например "2' AND id = (DROP TABLE table2)" // то у получиться SELECT * FROM table WHERE id = '2' AND id = (DROP TABLE table2)'Таким образом можно внедриться в сам запрос и изменить его.
Чтобы этого не произошло запросы с передаваемыми в них переменными нужно обрабатывать методом wpdb::prepare():
$sql = $wpdb->prepare( 'query' [ parameter1, parameter2 ... ] ); query(строка)Запрос. В нем можно использовать заменители:
%d - число %s - строка %f - дробное число (число с плавающей точкой, с версии 3.3).Использование знака % в любых других случаях может вызывать ошибку, поэтому его нужно претворять еще одним %. Например, чтобы использовать команду LIKE %вхождение%, её нужно записать так: LIKE %%вхождение%%.
ВАЖНО! Плейсхолдеры вида %1$d запрещены с версии 4.8.2 в целях безопасности. Запросы с ними Работать не будут. Например:
$wpdb->prepare( 'SELECT * FROM table WHERE field = %1$s OR field2 = %1$s', 'foo' ); //> SELECT * FROM table WHERE field = %1$s OR field2 = %1$sДо версии 4.8.2 можно было делать так:
$wpdb->prepare('SELECT * FROM table WHERE field = %1$d OR field2 = %1$d', 2 ); //> SELECT * FROM table WHERE field = 2 OR field2 = 2Но для строк в таком случае крайние скобки не ставятся, их нужно ставить в самом запросе:
$wpdb->prepare("SELECT * FROM table WHERE field = '%1$s' OR field2 = '%1$s'", '"str' ); //> SELECT * FROM table WHERE field = "\"str" OR field2 = "\"str" parameter(строка/массив) Переменные, которые относятся к заменителям. Считаются слева на право. Переменные можно указать через запятую, как в php функции sprintf() или во втором параметре можно передать массив для замены.Заметка: с версии WP 3.5 wpdb::prepare() обязательно должны быть переданы минимум 2 параметра: запрос и значение переменной, иначе появится php ошибка.
esc_sql()
Кроме метода $wpdb->prepare(), который предпочтительнее, потому что исправляет некоторые ошибки форматирования, запрос можно очистить функцией esc_sql() .
$name = esc_sql( $name ); $status = esc_sql( $status ); $wpdb->get_var( "SELECT something FROM table WHERE foo = '$name' and status = '$status'" );Обратите внимание что после esc_sql() очищенную строку можно использовать только внутри кавычек '' или "". Т.е. так писать нельзя: ORDER BY $value, где $value = esc_sql($value);
Примеры
#1. Добавим произвольное поле к посту 10:
$metakey = "'крах' БД"; $metavalue = "WordPress может 'сломать' Базу Данных если не экранировать запрос."; $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", 10, $metakey, $metavalue ) );Как видно из примера, с prepare() нет необходимости заботиться об экранировании кавычек и прочего, что может навредить запросу.
#2. Такой же пример
Только тут все переменные передаются во втором параметре в виде массива:
$metakey = "'крах' БД"; $metavalue = "WordPress может 'сломать' Базу Данных если не экранировать запрос."; $wpdb->query( $wpdb->prepare( "INSERT INTO $wpdb->postmeta ( post_id, meta_key, meta_value ) VALUES ( %d, %s, %s )", array( 10, $metakey, $metavalue ) ) );Передавать параметры в виде массива, может быть полезно, когда мы заранее не знаем количество аргументов, которые нужно будет передать.
esc_like - очистка LIKE строки
Чтобы подготовить строку для использования в LIKE части SQL запроса, используйте $wpdb->esc_like( $text ):
global $wpdb; $link = $wpdb->esc_like( $link ); // подготовим строку для LIKE аргумента $link = esc_sql( $link ); // очистим переменную $link = '%' . $link . '%'; // создадим полную переменную поиска LIKE // найдем комментарии в тексте или ссылке автора, есть указанная ссылка $spammy = $wpdb->query("SELECT comment_approved FROM $wpdb->comments WHERE (comment_content LIKE '$link' OR comment_author_url LIKE '$link') AND comment_approved = 'spam' LIMIT 1;" );Короткая запись с prepare()
global $wpdb; $link = '%' . $wpdb->esc_like( $link ) . '%'; $comment = $wpdb->get_row( $wpdb->prepare("SELECT * FROM $wpdb->comments WHERE comment_author_url LIKE %s LIMIT 1", $link ) );Функция like_escape( $string ) запрещена с версии 4.0. Используйте вместо нее $wpdb->esc_like( $string )
(show/hide/print)_error - показать или спрятать ошибки SQL
Есть возможность управлять ошибками, включать или выключать показ ошибок для последнего запроса:
$wpdb->show_errors(); // включит показ ошибок $wpdb->hide_errors(); // выключит показ ошибокТак же можно вывести на экран саму ошибку, если таковая имеется:
$wpdb->print_error();get_col_info - получить информацию о колонке
Получает информацию о колонках последнего запроса. Функция вернет массив с информацией об определенных в запросе колонках. Если в запросе колонки не определены, то функция вернет информацию о всех колонках таблицы. Это может пригодится, когда был возвращен объект, о данных которого мы ничего не знаем.
Работает на основе кэша, поэтому сначала нужно запустить запрос с помощью get_resiults(), get_col(), get_var() и т.д. а потом вызвать wpdb::get_col_info() которая вернет данные колонок последнего запроса.
$wpdb->get_col_info( $type, $offset ); $type(строка)В этом параметре указывается какую информацию нам нужно получить. По умолчанию: name. Вот список возможных вариантов:
name - название колонки. table - название таблицы к которой принадлежит колонка. max_length - максимальная длинна данных колонки not_null - 1 если ячейка колонки не может принимать значение NULL primary_key - 1 если колонка является первичным ключом unique_key - 1 если ячейки колонки должны быть всегда уникальны multiple_key - 1 если ячейки колонки могут быть не уникальны numeric - 1 если колонка содержит числовые данные blob - 1 если колонка содержит данные типа BLOB (двоичные данные) type - тип колонки unsigned - 1 если колонка имеет тип данных UNSIGNED zerofill - 1 если колонка имеет тип данных ZEROFILLПо умолчанию: name
$offset(число)Указатель, информацию о какой колонке нужно получить:
Примеры
global $wpdb, $table_name; $wpdb->show_errors(); // включим показ SQL ошибок $results = $wpdb->get_results("SELECT * FROM $table_name"); $cols_name = $wpdb->get_col_info('name'); echo 'Колонки таблицы `'. $table_name .'`:'; if( is_array($cols_name) ){ foreach( $cols_name as $name ) echo " $name"; } else { echo 'Ошибка, нет данных: '; $wpdb->print_error(); } $wpdb->hide_errors(); // выключим показ SQL ошибокflush - сброс кэша
Можно сбросить последние сохраненные данные в свойствах класса:
$wpdb->flush();Эта команда очистит следующие свойства (переменные): $wpdb->last_result, $wpdb->last_query и $wpdb->col_info.
Свойства (переменные) класса
$show_errors Показывать ошибки или нет, когда возвращается результат. По умолчанию: Да (true) $suppress_errors Подавлять ли ошибки в процессе построения запроса. $last_error Последняя ошибка из любого запроса. $num_queries Количество запросов которые выполняются. $num_rows Количество строк возвращенных последним запросом. $rows_affected Сохраняет число задействованных строк из последнего запроса $insert_id Идентификатор (ID) сгенерированный последним запросом, для SQL параметра AUTO_INCREMENT $last_query Последний запрос, который был выполнен классом. $last_result Результат последнего запроса. $func_call Текстовое описание последнего вызова query/get_row/get_var $queries Можно сохранить все запросы которые были сделаны к БД и их время выполнения, для этого нужно определить константу SAVEQUERIES как TRUE (например в config.php). По умолчанию она выключена (false). После того как эта константа включена в эту переменную будут собираться все запросы в виде массива данных. $col_info Информация о колонках последнего запроса. $prefix Префикс таблиц БД определенный для WordPress. Может пригодиться для мульти-сайтов. $base_prefix Префикс базовой таблицы WordPress. В мультисайте для сайтов сети префик отличается. Тут храниться префикс таблиц основного сайта сети. $ready Логический. Готов ли класс к выполнению запросов. $blogid Идентификатор текущего блога. $siteid ID сайта. $tables Список названий таблиц сайта (без префикса). $global_tables Глобальные таблицы: 'users', 'usermeta' $ms_global_tables Глобальные таблицы в режиме MU: 'blogs', 'signups', 'site', 'sitemeta', 'sitecategories', 'registration_log', 'blog_versions' $collate Режим сопоставления (сравнивания) данных в колонках базы данных.Таблицы Базы Данных WordPress
Схема базы данных WordPress - структура всех таблицПодробное описание базы данных смотрите по этой ссылке: http://codex.wordpress.org/Database_Description
Записи
$wpdb->posts Таблица куда записываются посты, постоянные страницы, произвольные типы записей, вложения и т.п. $wpdb->postmeta Таблица с записями о произвольных полях. Мета поля для таблицы $wpdb->postmeta.Пользователи
$wpdb->users Таблица с данными о зарегистрированных пользователях. $wpdb->usermeta Дополнительная информация о пользователях, такая как Имя, Ник, права и прочее. Мета поля для таблицы $wpdb->users.Комментарии
$wpdb->comments Таблица с записями комментариев. $wpdb->commentmeta Мета поля для таблицы $wpdb->comments.Таксономии
$wpdb->terms Таблица содержащая в себе информацию о названии категорий, меток, категорий ссылок и других таксономий. $wpdb->termmeta Таблица содержащая в себе дополнительные поля для таблицы $wpdb->terms. $wpdb->term_taxonomy Таблица с информацией о различных таксономиях их описание. $wpdb->term_relationships Таблица связывающая таксономии с контентом (постами, записями и т.п.)Остальное
$wpdb->links Таблица с записями ссылок. $wpdb->options Таблица опций (настроек).