Utilizzare wpdb per connettersi a un database separato

10 set 2010, 05:31:00
Visualizzazioni: 172K
Voti: 108

Voglio connettere wpdb a un altro database. Come posso creare l'istanza e passargli il nome del database/username/password?

Grazie

4
Commenti

Un altro database MySQL, o un altro tipo di database? Vuoi ancora avere accesso al database regolare di WordPress, o stai spostando il sito da un DB a un altro?

EAMann EAMann
10 set 2010 06:39:00

Sì, un altro database MySQL. È un DB separato sullo stesso server, e non è un database WordPress. È un database personalizzato, con informazioni che voglio visualizzare all'interno di WordPress.

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

Se lo facessi con l'oggetto $wpdb, se fosse anche possibile, disconnetterebbe il resto di WordPress dal suo database esistente. Quindi, non raccomandato. Un'altra opzione è creare una nuova istanza utilizzando EZSQL, che è utilizzato da WordPress. Penso che EZSQL sia usato perché è uno strato che ti astrae dall'uso di php-pdo-mysql, php-mysql o php-mysqli, senza sapere quale potrebbe essere installato su un determinato server.

Volomike Volomike
10 set 2010 08:18:58

Sì, è possibile. wpdb può essere istanziato per accedere a qualsiasi database e interrogare qualsiasi tabella.

Wadih M. Wadih M.
10 set 2010 15:43:21
Tutte le risposte alla domanda 6
7
169

Sì, è possibile.

L'oggetto wpdb può essere utilizzato per accedere a qualsiasi database e interrogare qualsiasi tabella. Non deve assolutamente essere correlato a WordPress, il che è molto interessante.

Il vantaggio è la possibilità di utilizzare tutte le classi e funzioni di wpdb come get_results, ecc., quindi non c'è bisogno di reinventare la ruota.

Ecco come fare:

$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 set 2010 15:48:08
Commenti

Booyah. Peccato che tutti quei commenti aggiunti alla domanda stessa abbiano bloccato la tua risposta accurata.

jerclarke jerclarke
11 set 2010 23:46:41

@Jeremy Clarke: Concordo. Spero che i nostri colleghi wordpressiani siano più attenti a non diffondere involontariamente disinformazione.

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

puoi anche risparmiare tempo usando global $wpdb. Ma prima di utilizzare il metodo $wpdb->get_results, devi includere wp-load.php come: require_once('/percorso/del/tuo/wordpress/wp-load.php');

Junior Mayhe Junior Mayhe
20 set 2015 01:25:12

Imposta il prefisso WPDB per fare in modo che WP_Query e get_post generino query SQL corrette chiamando $mydb->set_prefix('wp_');

M-R M-R
13 ott 2015 13:58:07

So che questo è un thread vecchio, ma non posso fare a meno di pensare che sovrascrivere la variabile $mydb con un nuovo oggetto potrebbe lasciare una connessione aperta (potrei sbagliarmi). Controllerei se $mydb è già stata istanziata da una chiamata precedente e, in tal caso, chiuderei la connessione prima di crearne una nuova istanza. Ad esempio (scusa non posso fare blocchi di codice Markdown ordinati nei commenti): if ($mydb != null) { $mydb->close(); }

joehanna joehanna
21 gen 2020 03:35:30

@JuniorMayhé Non riesco a usare required_once perché mi dà PHP Fatal error: require_once(): Failed opening required

Faisal Faisal
23 mar 2021 07:50:42

@M-R. Come posso utilizzare wp_query successivamente. Sto provando ma ottengo i risultati del wp locale, non del database remoto a cui mi sto connettendo.

stemon stemon
14 apr 2022 00:02:41
Mostra i restanti 2 commenti
2
34

Connettere un secondo database in WordPress è semplice, basta creare una nuova istanza della classe WPDB e usarla nello stesso modo in cui useremmo la standard $wpdb che tutti conosciamo e amiamo.

Assumendo che il secondo database abbia le stesse credenziali di accesso del database principale di WordPress, puoi persino usare le costanti predefinite da wp-config.php per evitare di hardcodare le informazioni di login.

/**
 * Istanzia la classe wpdb per connetterti al tuo secondo database, $database_name
 */
$second_db = new wpdb(DB_USER, DB_PASSWORD, $database_name, DB_HOST);
/**
 * Usa il nuovo oggetto database esattamente come useresti $wpdb
 */
$results = $second_db->get_results($your_query);
11 set 2010 23:53:01
Commenti

Questo è in parte ridondante rispetto alla risposta di Wadih, ma penso che il mio esempio di codice sia un po' più chiaro ed è anche importante ricordare le costanti di accesso al database, poiché sono quasi sempre quelle corrette da utilizzare. Altrimenti si rischiano problemi quando si passa da ambienti di sviluppo a staging e poi a produzione, dove i dettagli di accesso potrebbero cambiare.

jerclarke jerclarke
11 set 2010 23:55:02

Imposta il prefisso WPDB per far sì che WP_Query e get_post generino la query SQL corretta chiamando $second_db->set_prefix('wp_');

M-R M-R
13 ott 2015 13:58:53
2
23

nessuno l'ha ancora detto, quindi ho pensato di aggiungere un modo ancora più semplice...

fintanto che il tuo database aggiuntivo ha le stesse credenziali di accesso (utente/password) del tuo database WordPress, puoi utilizzare il nome del database prima del nome della tabella in questo modo

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

Dalla mia esperienza, questo funziona solo per ottenere dati, cioè usando SELECT. Non puoi inserire dati.

Protector one Protector one
28 giu 2015 18:06:51

non funzionerà esternamente,

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

Anche se queste soluzioni funzioneranno, perderai la possibilità di utilizzare le funzionalità personalizzate "altre" come get_post_custom e le query di WordPress. La soluzione semplice è

$wpdb->select('nome_database');

che cambia il database a livello di sistema (un select_db di mysql). Il metodo database.tabella funziona se vuoi solo fare una semplice query, ma se vuoi accedere a un altro blog WordPress puoi usare select. Dovrai solo ripristinare il database originale quando hai finito, altrimenti il tuo blog potrebbe comportarsi in modo strano.

8 apr 2011 15:02:04
Commenti

Sto utilizzando questa soluzione e funziona benissimo, tranne per una cosa. Per qualche motivo sconosciuto wp_get_post_terms() sembra non utilizzare il nuovo database selezionato?? Tutte le altre funzioni che ho provato (come get_post_meta(), get_posts() ecc.) sembrano funzionare perfettamente, ma wp_get_post_terms() sembra lavorare sul database DB_NAME. Qualche idea?

powerbuoy powerbuoy
9 lug 2013 05:54:58
2

Non posso ancora commentare, ma volevo ampliare la risposta di Wadih M. (che è ottima).

La classe database di WP è una versione personalizzata dell'ezSQL di Justin Vincent. Se ti piace l'interfaccia e vuoi realizzare un sito che non sia basato su WordPress, potresti dare un'occhiata a: http://justinvincent.com/ezsql

10 set 2010 19:38:36
Commenti

ezSQL è stato davvero frustrante per me, provenendo da WPDB. Niente istruzioni "prepare", niente "insert" o "update"... Mi piace usare l'intera classe WPDB così com'è, cosa possibile includendo un paio di file da BackPress nel tuo progetto.

goldenapples goldenapples
22 apr 2011 22:23:30

@gabrielk Il link non funziona - quello nuovo è: [1] [1]: http://justinvincent.com/ezsql

Hexodus Hexodus
23 nov 2013 10:20:16
0

Stavo avendo problemi con l'uso di $wpdb per connettermi a un secondo database di un blog da un sito principale che deve aggiornare due blog. Ho usato $wpdb->select($dbname, $dbh) per selezionare il secondo database, ma continuavo a ottenere risultati dal primo database.

Ho risolto il problema chiamando wp_cache_flush() per pulire la cache di WordPress prima di chiamare le funzioni WP sul secondo database.

22 apr 2011 22:13:59