• Главная
  • Карта сайта
Не найдено

Главная Новости

Комментарии 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 Таблица опций (настроек).

Таблицы в MU (Multisite) сборке

$wpdb->blogs Все сайты подсети. $wpdb->blog_versions Содержит текущую версию базы данных каждого сайта. Данные обновляются при обновлении БД для каждого сайта сети. $wpdb->registration_log Содержит данные администраторов сайтов, которые создаются при создании сайтов. $wpdb->signups Содержит пользователей, которые были зарегистрированы через базовую регистрацию WordPress со страницы: Администрация > Супер Админ > Настройки. $wpdb->site Содержит, адреса основных сайтов. $wpdb->sitemeta Данные сайтов: различные опции, включая администратора сайта. $wpdb->users Список пользователей всех сайтов сети. Это общая таблица пользователей для всей сети. Это привычная таблица, только в мультисайт версии добавляются еще 2 поля: spam и delete. $wpdb->usermeta Содержит мета-данные пользователей. Настройки пользователя для разных сайтов сети отличаются префиксом в индексе ключа. Например роли хранятся в таких метаполях: wp_capabilities, wp_1_capabilities, wp_2_capabilities ... Базовые таблицы каждого сайта сети Таблицы сайта сети: wp_posts, wp_options и т.д.. Для каждого сайта сети создаются одинаковые таблицы, но с разным префиксом, например: wp_options, wp_1_options, wp_2_options ...

Код wpdb : wp-includes/wp-db.php VER 4.9.6

Код слишком большой, смотрите его на отдельной странице...

Cвязанные функции

Из раздела: Классы

Провайдеры:
  • 08.09.2015

    Batyevka.NET предоставляет услуги доступа к сети Интернет на территории Соломенского района г. Киева.Наша миссия —... 
    Читать полностью

  • 08.09.2015
    IPNET

    Компания IPNET — это крупнейший оператор и технологический лидер на рынке телекоммуникаций Киева. Мы предоставляем... 
    Читать полностью

  • 08.09.2015
    Boryspil.Net

    Интернет-провайдер «Boryspil.net» начал свою работу в 2008 году и на данный момент является одним из крупнейших поставщиков... 
    Читать полностью

  • 08.09.2015
    4OKNET

    Наша компания работает в сфере телекоммуникационных услуг, а именно — предоставлении доступа в сеть интернет.Уже... 
    Читать полностью

  • 08.09.2015
    Телегруп

    ДП «Телегруп-Украина» – IT-компания с 15-летним опытом работы на рынке телекоммуникационных услуг, а также официальный... 
    Читать полностью

  • 08.09.2015
    Софтлинк

    Высокая скоростьМы являемся участником Украинского центра обмена трафиком (UA — IX) с включением 10 Гбит / сек... 
    Читать полностью

rss