Использование wpdb для подключения к отдельной базе данных

10 сент. 2010 г., 05:31:00
Просмотры: 172K
Голосов: 108

Я хочу подключить wpdb к другой базе данных. Как создать экземпляр и передать ему имя базы данных/имя пользователя/пароль?

Спасибо

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

Другая база данных MySQL или другой тип базы данных? Вам по-прежнему нужен доступ к основной базе данных WordPress, или вы переносите сайт с одной БД на другую?

EAMann EAMann
10 сент. 2010 г. 06:39:00

Да, другая база данных MySQL. Это отдельная БД на том же сервере, и она не связана с WordPress. Это пользовательская база данных с информацией, которую я хочу отображать внутри WordPress.

Wadih M. Wadih M.
10 сент. 2010 г. 06:41:20

Если бы вы сделали это через объект $wpdb (если бы это вообще было возможно), это отключило бы остальную часть WordPress от его текущей базы данных. Так что не рекомендуется. Другой вариант — создать новый экземпляр с помощью EZSQL, который используется WordPress. Думаю, EZSQL используется потому, что это слой, который абстрагирует вас от необходимости использовать php-pdo-mysql, php-mysql или php-mysqli, не зная, что может быть установлено на конкретном сервере.

Volomike Volomike
10 сент. 2010 г. 08:18:58

Да, это возможно. wpdb можно инстанцировать для доступа к любой базе данных и запросов к любым таблицам.

Wadih M. Wadih M.
10 сент. 2010 г. 15:43:21
Все ответы на вопрос 6
7
169

Да, это возможно.

Объект wpdb можно использовать для доступа к любой базе данных и выполнения запросов к любым таблицам. Совершенно необязательно, чтобы это было связано с WordPress, что очень удобно.

Преимущество заключается в возможности использовать все классы и функции wpdb, такие как get_results и другие, что избавляет от необходимости изобретать велосипед.

Вот как это сделать:

$mydb = new wpdb('username','password','database','localhost');
$rows = $mydb->get_results("select Name from my_table");
echo "<ul>";
foreach ($rows as $obj) {
   echo "<li>".$obj->Name."</li>";
}
echo "</ul>";
10 сент. 2010 г. 15:48:08
Комментарии

Бух. Жаль, что все эти комментарии на самом вопросе помешали вашему точному ответу.

jerclarke jerclarke
11 сент. 2010 г. 23:46:41

@Jeremy Clarke: Согласен. Надеюсь, наши коллеги по WordPress будут осторожнее, чтобы случайно не распространять дезинформацию.

Wadih M. Wadih M.
20 сент. 2010 г. 19:27:06

вы также можете сэкономить время, используя global $wpdb. Но перед вызовом метода $wpdb->get_results необходимо подключить wp-load.php следующим образом: require_once('/ваш/путь/wordpress/wp-load.php');

Junior Mayhe Junior Mayhe
20 сент. 2015 г. 01:25:12

Установите префикс WPDB, чтобы WP_Query и get_post генерировали корректный SQL-запрос с помощью вызова $mydb->set_prefix('wp_');

M-R M-R
13 окт. 2015 г. 13:58:07

Я знаю, что это старая тема, но не могу избавиться от ощущения, что перезапись переменной $mydb новым объектом может оставить соединение открытым (возможно, я ошибаюсь). Я бы проверил, был ли $mydb уже создан предыдущим вызовом, и если да, закрыл бы соединение перед созданием нового экземпляра. Например (извините, не могу сделать аккуратные блоки кода Markdown в комментариях): if ($mydb != null) { $mydb->close(); }

joehanna joehanna
21 янв. 2020 г. 03:35:30

@JuniorMayhé Я не могу использовать required_once, так как получаю ошибку PHP Fatal error: require_once(): Failed opening required

Faisal Faisal
23 мар. 2021 г. 07:50:42

@M-R. Как можно использовать wp_query после этого. Я пытаюсь, но получаю результаты локальной WordPress, а не удаленной базы данных, к которой я подключаюсь.

stemon stemon
14 апр. 2022 г. 00:02:41
Показать остальные 2 комментариев
2
34

Подключение ко второй базе данных в WordPress выполняется просто - вам нужно создать новый экземпляр класса WPDB и использовать его так же, как стандартный экземпляр $wpdb, который мы все знаем и любим.

Если вторая база данных использует те же учетные данные для входа, что и основная база WordPress, вы можете использовать предопределенные константы из wp-config.php, чтобы избежать жесткого кодирования учетных данных.

/**
 * Создаем экземпляр класса wpdb для подключения ко второй базе данных $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
 * Используем новый объект базы данных так же, как используется $wpdb
 */
$results = $second_db->get_results($your_query);
11 сент. 2010 г. 23:53:01
Комментарии

Это в некоторой степени повторяет ответ Wadih, но я думаю, что мой пример кода немного понятнее. Также важно помнить о константах для входа в базу данных, так как почти всегда лучше использовать именно их. В противном случае вы рискуете столкнуться с проблемами при переходе между средами разработки, тестирования и продакшена, где данные для входа могут меняться.

jerclarke jerclarke
11 сент. 2010 г. 23:55:02

Установите префикс WPDB, чтобы WP_Query и get_post генерировали правильные SQL-запросы, вызвав $second_db->set_prefix('wp_');

M-R M-R
13 окт. 2015 г. 13:58:53
2
23

никто об этом не упомянул, поэтому я решил добавить ещё более простой способ..

если ваша дополнительная база данных имеет такие же данные пользователя/пароль для доступа, как и ваша WordPress база данных, вы можете использовать имя базы данных перед именем таблицы, вот так:

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);
29 дек. 2010 г. 16:27:16
Комментарии

По моему опыту, это работает только для получения данных, то есть с использованием SELECT. Вставить данные таким способом нельзя.

Protector one Protector one
28 июн. 2015 г. 18:06:51

это не будет работать извне,

Wasim A. Wasim A.
31 янв. 2019 г. 15:57:21
1
11

Хотя эти методы будут работать, вы потеряете возможность использовать другие пользовательские функции, такие как get_post_custom и запросы WordPress. Простое решение - это:

$wpdb->select('название_базы_данных');

что изменяет базу данных на уровне всей системы (аналог mysql select_db). Метод database.table работает, если вам нужно выполнить простой запрос, но если вы хотите получить доступ к другому блогу WordPress, вы можете использовать select. Вам просто нужно будет вернуть обратно исходную базу данных после завершения работы, иначе ваш блог может вести себя странно.

8 апр. 2011 г. 15:02:04
Комментарии

Я использую это решение, и оно отлично работает, за исключением одной проблемы. По какой-то неизвестной причине wp_get_post_terms() не использует новую выбранную базу данных?? Все остальные функции, которые я пробовал (например get_post_meta(), get_posts() и т.д.), работают нормально, но wp_get_post_terms() продолжает работать с базой данных DB_NAME. Есть идеи?

powerbuoy powerbuoy
9 июл. 2013 г. 05:54:58
2

Я пока не могу оставлять комментарии, но хотел бы дополнить ответ Wadih M. (который отличный).

Класс базы данных в WordPress — это модифицированная версия ezSQL от Justin Vincent. Если вам нравится этот интерфейс и вы хотите использовать его для сайта, не основанного на WordPress, стоит ознакомиться с оригиналом: http://justinvincent.com/ezsql

10 сент. 2010 г. 19:38:36
Комментарии

ezSQL был для меня очень разочаровывающим после работы с WPDB. Нет "prepare" запросов, нет "insert" или "update"... Мне нравится использовать весь класс WPDB как есть, что возможно, включив несколько файлов из BackPress в ваш проект.

goldenapples goldenapples
22 апр. 2011 г. 22:23:30

@gabrielk Ссылка не работает - новая вот: [1] [1]: http://justinvincent.com/ezsql

Hexodus Hexodus
23 нояб. 2013 г. 10:20:16
0

У меня возникли трудности с использованием $wpdb для подключения к базе данных второго блога с родительского сайта, которому необходимо обновлять два блога. Я использовал $wpdb->select($dbname, $dbh) для выбора второй базы данных, но всё равно получал результаты из первой базы.

Я решил проблему, вызвав wp_cache_flush() для очистки кеша WordPress перед вызовом функций WP для второй базы данных.

22 апр. 2011 г. 22:13:59