Verwenden von wpdb, um eine Verbindung zu einer separaten Datenbank herzustellen


86

Ich möchte eine Verbindung wpdbzu einer anderen Datenbank herstellen. Wie erstelle ich die Instanz und übergebe ihr den Datenbanknamen / den Benutzernamen / das Passwort?

Vielen Dank


Eine andere MySQL-Datenbank oder ein anderer Datenbanktyp? Möchten Sie weiterhin auf die reguläre WordPress-Datenbank zugreifen oder verschieben Sie die Site von einer Datenbank in eine andere?
EAMann,

1
Ja, eine andere MySQL-Datenbank. Es ist eine separate Datenbank auf demselben Server und keine Wordpress-Datenbank. Es ist eine benutzerdefinierte Datenbank mit Informationen, die ich in WordPress anzeigen möchte.
Wadih M.,

1
Wenn Sie das mit dem $ wpdb-Objekt machen würden, würde es, wenn es überhaupt möglich wäre, den Rest von WordPress von seiner vorhandenen Datenbank trennen. Also nicht zu empfehlen. Eine andere Möglichkeit besteht darin, eine neue Instanz mit EZSQL zu erstellen, die von WordPress verwendet wird. Ich denke, EZSQL wird verwendet, weil es eine Ebene ist, die Sie von der Verwendung von php-pdo-mysql, php-mysql oder php-mysqli abhält, ohne zu wissen, welche auf einem bestimmten Server installiert sein könnte.
Volomike

3
Ja es ist möglich. wpdb kann instanziiert werden, um auf jede Datenbank zuzugreifen und jede Tabelle abzufragen.
Wadih M.,

Antworten:


138

Ja es ist möglich.

Mit dem wpdb-Objekt kann auf jede Datenbank zugegriffen und jede Tabelle abgefragt werden. Es ist absolut nicht nötig, mit Wordpress in Verbindung zu stehen, was sehr interessant ist.

Der Vorteil ist die Möglichkeit, alle wpdb-Klassen und -Funktionen get_resultsusw. zu verwenden, sodass das Rad nicht neu erfunden werden muss.

Hier ist wie:

$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
Booyah. Schade, dass all diese Kommentare zu der Frage selbst hinzugefügt wurden, um Ihre genaue Antwort zu blockieren.
Jerclarke

@ Jeremy Clarke: Ich stimme zu. Wir hoffen, dass unsere WordPress-Kollegen darauf achten, Desinformation nicht unschuldig zu verbreiten.
Wadih M.

1
Sie können auch Zeit sparen, indem Sie verwenden global $wpdb. Bevor Sie jedoch die Methode $ wpdb-> get_results starten, müssen Sie die Datei wp-load.php wie folgt einfügen: require_once('/your/wordpress/wp-load.php');
Junior M

Stellen Sie das WPDB-Präfix so ein, dass WP_Query und get_post eine korrekte SQL-Abfrage generieren, indem Sie$mydb->set_prefix('wp_');
MR

30

Das Herstellen einer Verbindung zu einer zweiten Datenbank ist in WordPress einfach. Sie erstellen einfach eine neue Instanz der WPDB-Klasse und verwenden sie genauso wie die Standardinstanz $ wpdb, die wir alle kennen und lieben.

Angenommen, die zweite Datenbank hat die gleichen Anmeldeinformationen wie die Haupt-WP, können Sie sogar die vordefinierten Konstanten aus wp-config.php verwenden, um das Hardcodieren der Anmeldeinformationen zu vermeiden.

/**
 * 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);

Dies ist für Wadihs Antwort etwas überflüssig, aber ich denke, mein Codebeispiel ist etwas klarer und es ist auch wichtig, sich an die DB-Login-Konstanten zu erinnern, da diese fast immer die richtigen sind und Sie sonst Probleme riskieren, wenn Sie von dev-> stage- wechseln. > Live-Umgebungen, in denen sich die Anmeldedaten ändern können.
Jerclarke

Stellen Sie das WPDB-Präfix so ein, dass WP_Query und get_post eine korrekte SQL-Abfrage generieren, indem Sie$second_db->set_prefix('wp_');
MR

21

Niemand hat das gesagt, also dachte ich, ich würde einen noch einfacheren Weg hinzufügen.

Solange Ihre zusätzliche Datenbank die gleichen Benutzer- / Passdetails hat, um darauf zuzugreifen, wie Ihre WordPress-Datenbank, können Sie den Datenbanknamen vor dem Tabellennamen wie folgt verwenden

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

Nach meiner Erfahrung funktioniert dies nur, um Daten zu erhalten , dh zu verwenden SELECT. Sie können keine Daten einfügen.
Beschützer ein

es wird nicht von außen funktionieren,
Wasim A.

7

Während diese funktionieren, verlieren Sie die Möglichkeit, die "anderen" benutzerdefinierten Funktionen wie get_post_custom und WordPress-Abfragen zu verwenden. Die einfache Lösung ist

$wpdb->select('database_name');

Dadurch wird die Datenbank systemweit geändert (eine mysql select_db). Die database.table-Methode funktioniert, wenn Sie nur eine einfache Abfrage durchführen möchten, aber auf ein anderes WordPress-Blog zugreifen möchten, das Sie mit select verwenden können. Sie müssen es nur wieder ändern, wenn Sie fertig sind, oder Ihr Blog kann seltsame Dinge tun.


Ich benutze diese Lösung und sie funktioniert bis auf eines großartig. Aus irgendeinem unbekannten Grund wp_get_post_terms()scheint die neu ausgewählte DB nicht zu verwenden? Jede andere Funktion habe ich versucht (wie get_post_meta(), get_posts()etc) scheint ganz gut zu funktionieren , aber wp_get_post_terms()scheint in Richtung zu arbeiten DB_NAMEDatenbank. Irgendwelche Ideen?
Boje

7

Ich kann noch keinen Kommentar abgeben, aber ich wollte die Antwort von Wadih M. erweitern (was großartig ist).

Die Datenbankklasse von WP ist eine angepasste Version von Justin Vincents ezSQL. Wenn Ihnen die Benutzeroberfläche gefällt und Sie eine Site erstellen möchten, die nicht auf WordPress basiert, können Sie sie unter http://justinvincent.com/ezsql ausprobieren


ezSQL war wirklich frustrierend für mich, da es von WPDB kam. Keine "Prepare" -Anweisungen, kein "Insert" oder "Update" ... Ich verwende gerne die gesamte WPDB-Klasse so wie sie existiert, was möglich ist, indem ein paar Dateien aus BackPress in Ihr Projekt aufgenommen werden.
Goldenapples

@ Gabrielk Der Link ist tot - neu ist: [1] [1]: justinvincent.com/ezsql
Hexodus

4

Ich hatte Probleme damit, $wpdbeine Verbindung zu einer zweiten Blog-Datenbank von einer übergeordneten Site herzustellen, die zwei Blogs aktualisieren muss. Früher habe ich $wpdb->select($dbname, $dbh)die zweite Datenbank ausgewählt, aber ich habe immer noch Ergebnisse aus der ersten Datenbank erhalten.

Ich habe das Problem gelöst, indem ich wp_cache_flush()den WordPress-Cache geleert habe, bevor ich WP-Funktionen für die zweite Datenbank aufgerufen habe.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.