Używanie wpdb do łączenia się z osobną bazą danych


86

Chcę połączyć się wpdbz inną bazą danych. Jak utworzyć instancję i przekazać jej nazwę bazy danych / nazwę użytkownika / hasło?

Dzięki


Inna baza danych MySQL lub inny typ bazy danych? Czy nadal chcesz mieć dostęp do zwykłej bazy danych WordPress, czy przenosisz witrynę z jednej bazy danych do drugiej?
EAMann

1
Tak, kolejna baza danych MySQL. To oddzielna baza danych na tym samym serwerze i nie jest to Wordpress. To niestandardowa baza danych z informacjami, które chcę wyświetlić w wordpress.
Wadih M.,

1
Jeśli zrobiłbyś to z obiektem $ wpdb, gdyby to było w ogóle możliwe, odłączyłby resztę WordPressa od istniejącej bazy danych. Więc nie polecam. Inną opcją jest utworzenie nowej instancji za pomocą EZSQL, który jest używany przez WordPress. Myślę, że EZSQL jest używany, ponieważ jest to warstwa, która abstrahuje od konieczności korzystania z php-pdo-mysql, php-mysql lub php-mysqli, nie wiedząc, które mogą być zainstalowane na danym serwerze.
Volomike,

3
Tak, to możliwe. wpdb może być utworzony w celu uzyskania dostępu do dowolnej bazy danych i zapytania do dowolnej tabeli.
Wadih M.,

Odpowiedzi:


138

Tak, to możliwe.

Obiekt wpdb może służyć do uzyskiwania dostępu do dowolnej bazy danych i przeszukiwania dowolnej tabeli. Absolutnie nie trzeba być związanym z Wordpress, co jest bardzo interesujące.

Korzyścią jest możliwość korzystania ze wszystkich klas i funkcji wpdb, takich jak get_resultsitp., Dzięki czemu nie trzeba ponownie wymyślać koła.

Oto jak:

$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>";
endforeach;
echo "</ul>";

3
Boja Szkoda, że ​​wszystkie te komentarze zostały dodane do samego pytania, aby zablokować dokładną odpowiedź.
jerclarke

@Jeremy Clarke: Zgadzam się. Mając nadzieję, że nasi współbraciarze będą bardziej uważać, aby nie wyrządzić w niewinny sposób dezinformacji.
Wadih M.

1
Możesz także zaoszczędzić czas, używając global $wpdb. Ale przed uruchomieniem metody $ wpdb-> get_results, musisz dołączyć wp-load.php jako: require_once('/your/wordpress/wp-load.php');
Junior M

Ustaw prefiks WPDB, aby WP_Query i get_post wygenerowały poprawne zapytanie SQL, dzwoniąc$mydb->set_prefix('wp_');
MR

30

Połączenie z drugą bazą danych jest łatwe w WordPressie, wystarczy utworzyć nową instancję klasy WPDB i używać jej w taki sam sposób, jak zwykłej instancji $ wpdb, którą wszyscy znamy i lubimy.

Zakładając, że druga baza danych zawiera te same dane logowania, co główna WP, możesz nawet użyć predefiniowanych stałych z wp-config.php, aby uniknąć twardego wpisania danych logowania.

/**
 * Instantiate the wpdb class to connect to your second database, $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
 * Use the new database object just like you would use $wpdb
 */
$results = $second_db->get_results($your_query);

Jest to nieco zbędne w stosunku do odpowiedzi Wadiha, ale myślę, że mój przykład kodu jest nieco jaśniejszy i ważne jest również, aby pamiętać stałe loginu db, ponieważ są one prawie zawsze odpowiednie do użycia, w przeciwnym razie ryzykujesz problemy podczas przechodzenia z dev-> stage- > środowiska na żywo, w których dane logowania mogą ulec zmianie.
jerclarke

Ustaw prefiks WPDB, aby WP_Query i get_post wygenerowały poprawne zapytanie SQL, dzwoniąc$second_db->set_prefix('wp_');
MR

21

nikt tego nie powiedział, więc pomyślałem, że dodałbym jeszcze prostszy sposób ...

tak długo, jak twoja dodatkowa baza danych ma takie same dane użytkownika / przepustki, aby uzyskać do niej dostęp, jak twoja baza danych wordpress, możesz użyć nazwy bazy danych przed nazwą tabeli w ten sposób

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);

Z mojego doświadczenia wynika, że działa to tylko w celu uzyskania danych, tj SELECT. Użycia . Nie możesz wstawić danych.
Protektor jeden

nie będzie działać zewnętrznie
Wasim A.

7

Chociaż będą działać, stracisz możliwość korzystania z „innych” niestandardowych funkcji, takich jak zapytania get_post_custom i wordpress. Proste rozwiązanie to

$wpdb->select('database_name');

co zmienia bazę danych w całym systemie (mysql select_db). Metoda database.table działa, jeśli chcesz tylko wykonać proste zapytanie, ale jeśli chcesz uzyskać dostęp do innego bloga wordpress, możesz użyć select. Musisz tylko zmienić to z powrotem, gdy skończysz, lub twój blog może robić dziwne rzeczy.


Korzystam z tego rozwiązania i działa świetnie, z wyjątkiem jednej rzeczy. Z jakiegoś nieznanego powodu wp_get_post_terms()nie wydaje się korzystać z nowo wybranego DB? Każda inna funkcja próbowałem (jak get_post_meta(), get_posts()etc) wydaje się działać dobrze, ale wp_get_post_terms()wydaje się działać w kierunku DB_NAMEbazy. Jakieś pomysły?
powerbuoy

7

Nie mogę jeszcze komentować, ale chciałem rozwinąć odpowiedź Wadih M. (co jest świetne).

Klasa bazy danych WP to dostosowana wersja ezSQL Justina Vincenta. Jeśli podoba Ci się interfejs i chcesz stworzyć stronę, która nie jest oparta na WordPressie, możesz go sprawdzić: http://justinvincent.com/ezsql


ezSQL był dla mnie naprawdę frustrujący, pochodzący z WPDB. Brak instrukcji „przygotowywania”, brak „wstawiania” lub „aktualizacji” ... Lubię używać całej istniejącej klasy WPDB, co jest możliwe dzięki dołączeniu kilku plików z BackPress do twojego projektu.
goldenapples

@ gabrielk Link jest martwy - nowy to: [1] [1]: justinvincent.com/ezsql
Hexodus

4

Miałem problem z $wpdbłączeniem się z drugą bazą danych blogów z witryny nadrzędnej, która musi zaktualizować dwa blogi. Kiedyś wybrałem $wpdb->select($dbname, $dbh)drugą bazę danych, ale wciąż otrzymywałem wyniki z pierwszej bazy danych.

Rozwiązałem problem, dzwoniąc wp_cache_flush()do wyczyszczenia pamięci podręcznej WordPress przed wywołaniem funkcji WP w drugiej bazie danych.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.