Utilizarea wpdb pentru conectarea la o bază de date separată

10 sept. 2010, 05:31:00
Vizualizări: 172K
Voturi: 108

Vreau să conectez wpdb la o altă bază de date. Cum pot crea instanța și să îi transmit numele bazei de date/numele de utilizator/parola?

Mulțumesc

4
Comentarii

O altă bază de date MySQL, sau un alt tip de bază de date? Doriți în continuare acces la baza de date obișnuită WordPress, sau mutați site-ul de la o bază de date la alta?

EAMann EAMann
10 sept. 2010 06:39:00

Da, o altă bază de date MySQL. Este o bază de date separată pe același server și nu este una WordPress. Este o bază de date personalizată, cu informații pe care doresc să le afișez în WordPress.

Wadih M. Wadih M.
10 sept. 2010 06:41:20

Dacă ai face asta cu obiectul $wpdb, dacă ar fi chiar posibil, ar deconecta restul WordPress de la baza sa de date existentă. Deci, nu este recomandat. O altă opțiune este să creezi o nouă instanță folosind EZSQL, care este folosit de WordPress. Cred că EZSQL este folosit pentru că este un strat care te abstractizează de necesitatea de a folosi php-pdo-mysql, php-mysql sau php-mysqli, fără a ști care ar putea fi instalat pe un anumit server.

Volomike Volomike
10 sept. 2010 08:18:58

Da, este posibil. wpdb poate fi instanțiat pentru a accesa orice bază de date și a interoga orice tabel.

Wadih M. Wadih M.
10 sept. 2010 15:43:21
Toate răspunsurile la întrebare 6
7
169

Da, este posibil.

Obiectul wpdb poate fi folosit pentru a accesa orice bază de date și pentru a interoga orice tabel. Nu este necesar să fie legat de WordPress, ceea ce este foarte interesant.

Beneficiul este capacitatea de a utiliza toate clasele și funcțiile wpdb precum get_results, etc., astfel încât nu este nevoie să reinventezi roata.

Iată cum:

$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 sept. 2010 15:48:08
Comentarii

Bravo. Păcat că toate acele comentarii adăugate la întrebare au blocat răspunsul tău precis.

jerclarke jerclarke
11 sept. 2010 23:46:41

@Jeremy Clarke: Sunt de acord. Sperăm ca colegii noștri din comunitatea WordPress să fie mai atenți pentru a nu răspândi nevinovăți informații greșite.

Wadih M. Wadih M.
20 sept. 2010 19:27:06

poți economisi timp folosind global $wpdb. Dar înainte de a apela metoda $wpdb->get_results, trebuie să incluzi wp-load.php astfel: require_once('/calea/ta/catre/wordpress/wp-load.php');

Junior Mayhe Junior Mayhe
20 sept. 2015 01:25:12

Setează prefixul WPDB pentru ca WP_Query și get_post să genereze interogări SQL corecte prin apelarea $mydb->set_prefix('wp_');

M-R M-R
13 oct. 2015 13:58:07

Știu că acesta este un fir vechi, dar nu pot să nu simt că suprascrierea variabilei $mydb cu un obiect nou ar putea lăsa o conexiune deschisă (aș putea greși). Aș verifica dacă $mydb este deja instanțiat dintr-un apel anterior și, dacă da, aș închide conexiunea înainte de a crea o nouă instanță. ex (scuze că nu pot face blocuri de cod Markdown frumoase în comentarii): if ($mydb != null) { $mydb->close(); }

joehanna joehanna
21 ian. 2020 03:35:30

@JuniorMayhé Nu pot folosi required_once deoarece îmi dă eroarea PHP Fatal error: require_once(): Failed opening required

Faisal Faisal
23 mar. 2021 07:50:42

@M-R. Cum poate fi folosit wp_query ulterior. Încerc, dar apoi primesc rezultate din wp local, nu din baza de date la distanță la care mă conectez.

stemon stemon
14 apr. 2022 00:02:41
Arată celelalte 2 comentarii
2
34

Conectarea la o a doua bază de date este ușoară în WordPress, pur și simplu creezi o nouă instanță a clasei WPDB și o folosești în același mod în care ai folosi instanța standard $wpdb pe care o știm și o iubim cu toții.

Presupunând că a doua bază de date are aceleași credențiale de autentificare ca cea principală WordPress, poți folosi chiar constantele predefinite din wp-config.php pentru a evita hardcodarea informațiilor de conectare.

/**
 * Instantiezi clasa wpdb pentru a te conecta la a doua bază de date, $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
 * Folosești noul obiect de bază de date exact cum ai folosi $wpdb
 */
$results = $second_db->get_results($your_query);
11 sept. 2010 23:53:01
Comentarii

Acest lucru este oarecum redundant cu răspunsul lui Wadih, dar cred că exemplul meu de cod este un pic mai clar și, de asemenea, este important să ne amintim constantele de conectare la baza de date, deoarece acestea sunt aproape întotdeauna cele corecte de utilizat. În caz contrar, riști să întâmpini probleme la trecerea de la medii de dezvoltare -> staging -> live, unde detaliile de conectare s-ar putea schimba.

jerclarke jerclarke
11 sept. 2010 23:55:02

Setează prefixul WPDB pentru a face ca WP_Query și get_post să genereze interogări SQL corecte prin apelarea $second_db->set_prefix('wp_');

M-R M-R
13 oct. 2015 13:58:53
2
23

nimeni nu a menționat acest lucru, așa că am crezut că voi adăuga o metodă și mai ușoară...

atâta timp cât baza ta de date suplimentară are aceleași detalii de utilizator/parolă pentru acces ca și baza de date WordPress, poți folosi numele bazei de date înaintea numelui tabelei, astfel:

$query = $wpdb->prepare('SELECT * FROM dbname.dbtable WHERE 1');
$result = $wpdb->get_results($query);
29 dec. 2010 16:27:16
Comentarii

Din experiența mea, acest lucru funcționează doar pentru a obține date, adică folosind SELECT. Nu poți insera date.

Protector one Protector one
28 iun. 2015 18:06:51

nu va funcționa extern,

Wasim A. Wasim A.
31 ian. 2019 15:57:21
1
11

Deși aceste metode vor funcționa, veți pierde abilitatea de a utiliza alte funcționalități personalizate precum get_post_custom și interogările WordPress. Soluția simplă este

$wpdb->select('nume_baza_de_date');

care schimbă baza de date la nivel de sistem (un select_db mysql). Metoda bază_de_date.tabel funcționează dacă doriți doar să faceți o interogare simplă, dar dacă doriți să accesați un alt blog WordPress, puteți folosi select. Va trebui doar să o schimbați înapoi când ați terminat, altfel blogul vostru poate avea comportamente neașteptate.

8 apr. 2011 15:02:04
Comentarii

Folosesc această soluție și funcționează excelent, cu excepția unui singur lucru. Din motive necunoscute, wp_get_post_terms() nu pare să utilizeze noua bază de date selectată?? Orice altă funcție pe care am încercat-o (cum ar fi get_post_meta(), get_posts() etc.) pare să funcționeze perfect, dar wp_get_post_terms() pare să lucreze cu baza de date DB_NAME. Aveți idei?

powerbuoy powerbuoy
9 iul. 2013 05:54:58
2

Încă nu pot comenta, dar am vrut să extind răspunsul lui Wadih M. (care este excelent).

Clasa de bază de date din WP este o versiune personalizată a ezSQL-ului lui Justin Vincent. Dacă vă place interfața și doriți să faceți un site care nu se bazează pe WordPress, ar putea fi util să verificați: http://justinvincent.com/ezsql

10 sept. 2010 19:38:36
Comentarii

ezSQL a fost foarte frustrant pentru mine, venind din WPDB. Nu există declarații "prepare", nici funcții "insert" sau "update"... Prefer să folosesc întreaga clasă WPDB așa cum există, ceea ce este posibil prin includerea a câteva fișiere din BackPress în proiectul tău.

goldenapples goldenapples
22 apr. 2011 22:23:30

@gabrielk Linkul este mort - cel nou este: [1] [1]: http://justinvincent.com/ezsql

Hexodus Hexodus
23 nov. 2013 10:20:16
0

Am avut dificultăți în utilizarea $wpdb pentru a mă conecta la o a doua bază de date a unui blog dintr-un site părinte care trebuie să actualizeze două bloguri. Am folosit $wpdb->select($dbname, $dbh) pentru a selecta a doua bază de date, dar tot primeam rezultate din prima bază de date.

Am rezolvat problema apelând wp_cache_flush() pentru a goli cache-ul WordPress înainte de a apela funcțiile WP pe a doua bază de date.

22 apr. 2011 22:13:59