Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu mehreren MySQL-Datenbanken her?

Lesezeit: 7 Minuten

Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu
JoshFinnie

Ich habe Informationen, die über einige Datenbanken verteilt sind, und möchte alle Informationen mit PHP auf eine Webseite stellen. Ich habe mich gefragt, wie ich auf einer einzigen PHP-Webseite eine Verbindung zu mehreren Datenbanken herstellen kann.

Ich weiß, wie man eine Verbindung zu einer einzelnen Datenbank herstellt mit:

$dbh = mysql_connect($hostname, $username, $password) 
        or die("Unable to connect to MySQL");

Kann ich jedoch einfach mehrere „mysql_connect“-Befehle verwenden, um die anderen Datenbanken zu öffnen, und wie würde PHP wissen, aus welcher Datenbank ich die Informationen ziehen möchte, wenn ich mehrere Datenbanken verbunden habe.

Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu
Tom Haigh

Warnung : mysql_xx Funktionen sind seit PHP 5.5 veraltet und wurden seit PHP 7.0 entfernt (siehe http://php.net/manual/intro.mysql.php), verwenden mysqli_xx Funktionen oder sehen Sie sich die Antwort unten von @Troelskn an


Sie können mehrere Anrufe tätigen mysql_connect()aber wenn die Parameter gleich sind, müssen Sie für die ‘true’ übergeben$new_link‘ (vierter) Parameter, ansonsten wird dieselbe Verbindung wiederverwendet. Zum Beispiel:

$dbh1 = mysql_connect($hostname, $username, $password); 
$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1);
mysql_select_db('database2', $dbh2);

Dann zur Abfrage von Datenbank 1 die erste Link-ID übergeben:

mysql_query('select * from tablename', $dbh1);

und für Datenbank 2 übergeben Sie die zweite:

mysql_query('select * from tablename', $dbh2);

Wenn Sie keine Verbindungskennung übergeben, wird die zuletzt erstellte Verbindung verwendet (in diesem Fall diejenige, die durch dargestellt wird $dbh2) z.B:

mysql_query('select * from tablename');

Andere Optionen

Wenn der MySQL-Benutzer Zugriff auf beide Datenbanken hat und sie sich auf demselben Host befinden (d. h. beide DBs sind über dieselbe Verbindung zugänglich), könnten Sie Folgendes tun:

  • Halten Sie eine Verbindung offen und rufen Sie an mysql_select_db() um bei Bedarf zu wechseln. Ich bin mir nicht sicher, ob dies eine saubere Lösung ist, und Sie könnten am Ende die falsche Datenbank abfragen.
  • Geben Sie den Datenbanknamen an, wenn Sie in Ihren Abfragen auf Tabellen verweisen (z SELECT * FROM database2.tablename). Dies ist wahrscheinlich ein Schmerz zu implementieren.

Bitte lesen Sie auch die Antwort von troelskn, da dies ein besserer Ansatz ist, wenn Sie PDO anstelle der älteren Erweiterungen verwenden können.

  • +1 Diese Lösung hat bei mir funktioniert. Nach zwei Tagen des Debuggens, warum meine benutzerdefinierten WordPress-Vorlagen nach einem Aufruf der zweiten Datenbankverbindung den Zugriff auf das $WP_Query-Objekt verloren …

    – Edward J. Beckett

    4. Mai 2012 um 23:22 Uhr


  • ist es möglich, einen von ihnen als Standard festzulegen und nur hinzuzufügen $dbh2 für den zweiten nur bei bedarf? Alle Abfragen ändern zu müssen, damit dieser Ansatz funktioniert, würde wahrscheinlich Tage dauern, nur um alle zu finden …

    – ThomasK

    8. August 2012 um 11:26 Uhr


  • @ThomasK, Sie könnten mysql_query in eine Funktion mit einem Standardparameter einschließen, sagen wir: db_query($query,$db='db1') und aktualisieren Sie dann alle Ihre alten Abfragen in Massen db_query($query) gefolgt von einer benutzerdefinierten Aktualisierung Ihrer nicht standardmäßigen auf db_query($query,'db2')

    – joshuahedlund

    21. November 2012 um 15:46 Uhr

  • Welche Verbindung wird mit Ihrer Methode verwendet, wenn ich zwei Verbindungen definiere, aber nicht angebe, welche Verbindung bei der Abfrage verwendet werden soll?

    – Petrus

    5. November 2014 um 10:28 Uhr

  • @Peter: gem php.net/manual/en/function.mysql-query.php: If the link identifier is not specified, the last link opened by mysql_connect() is assumed.

    – Tom Haigh

    5. November 2014 um 13:03 Uhr

1646909649 784 Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu
troelskn

Wenn Sie PHP5 verwenden (und das sollten Sie, da PHP4 veraltet ist), sollten Sie verwenden PDO, da dies langsam zum neuen Standard wird. Ein (sehr) wichtiger Vorteil von PDO ist, dass es gebundene Parameter unterstützt, was zu einem viel sichereren Code führt.

Sie würden eine Verbindung über PDO wie folgt herstellen:

try {
  $db = new PDO('mysql:dbname=databasename;host=127.0.0.1', 'username', 'password');
} catch (PDOException $ex) {
  echo 'Connection failed: ' . $ex->getMessage();
}

(Natürlich Datenbankname, Benutzername und Passwort oben ersetzen)

Sie können die Datenbank dann wie folgt abfragen:

$result = $db->query("select * from tablename");
foreach ($result as $row) {
  echo $row['foo'] . "\n";
}

Oder, wenn Sie Variablen haben:

$stmt = $db->prepare("select * from tablename where id = :id");
$stmt->execute(array(':id' => 42));
$row = $stmt->fetch();

Wenn Sie mehrere Verbindungen gleichzeitig öffnen müssen, können Sie einfach mehrere Instanzen von PDO erstellen:

try {
  $db1 = new PDO('mysql:dbname=databas1;host=127.0.0.1', 'username', 'password');
  $db2 = new PDO('mysql:dbname=databas2;host=127.0.0.1', 'username', 'password');
} catch (PDOException $ex) {
  echo 'Connection failed: ' . $ex->getMessage();
}

  • Warum steht diese Antwort nicht ganz oben?! Das ist der richtige Weg.

    – Aditya MP

    17. Oktober 2011 um 4:05 Uhr

  • @aditya menon Meiner Meinung nach ist der richtige Weg, etwas zu tun, oft nicht die richtige Antwort auf die gestellte Frage. Der Asker hat in seiner Frage kein PDO verwendet, sondern PHP-native MySQL-Funktionen, daher glaube ich, dass die beste Antwort dem Asker-Code folgen würde.

    – Jonathan DS

    29. März 2012 um 22:36 Uhr

  • @adityamenon unter wessen Autorität? Denken Sie daran, dass der Benutzer immer Recht hat … PDO ist der beste Weg, aber beide Wege sind der richtige Weg, um das Problem des Benutzers zu lösen. Bitte beachten Sie den Unterschied zwischen richtig und am besten. Ja … mir ist langweilig, also musste ich eine Erklärung abgeben.

    – Justin Kaz

    2. April 2012 um 1:09 Uhr

  • Repräsentieren $db1 und $db2 mehrere MySQL-Verbindungen? Wenn ja, ist das nicht gut. Gibt es eine Möglichkeit, mehrere Datenbanken mit nur einer Verbindung unterzubringen?

    – datasn.io

    8. September 2014 um 1:18 Uhr

  • @kavoir Warum willst du das? Gegebenenfalls könnten Sie die Datenbank über die aktuelle Verbindung mit ändern use DATABASENAMEaber ich verstehe den Sinn nicht?

    – troelskn

    8. September 2014 um 11:49 Uhr

1646909649 438 Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu
Ihsan Kusasi

Ich habe mein Leben einfach gemacht:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

hoffe es ist hilfreich… prost…

  • Dies ist die einfachste Lösung, wenn Sie nicht in beiden Datenbanken Tabellen mit demselben Namen haben. Sie machen es einmal und müssen sich dann nicht mehr um mehrere Datenbanken kümmern.

    – Erel Segal-Halevi

    5. August 2016 um 8:15 Uhr

  • @ErelSegal-Halevi, solange Sie nur Lesezugriff auf die Daten der anderen Datenbank benötigen, oder?

    – Buttle Butkus

    9. Januar 2019 um 22:44 Uhr

1646909650 318 Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu
Kauschik

Anstatt mysql_connect verwenden mysqli_connect.

mysqli bietet eine Funktionalität zum gleichzeitigen Verbinden mehrerer Datenbanken.

$Db1 = new mysqli($hostname,$username,$password,$db_name1); 
// this is connection 1 for DB 1

$Db2 = new mysqli($hostname,$username,$password,$db_name2); 
// this is connection 2 for DB 2

Versuchen Sie den folgenden Code:

    $conn = mysql_connect("hostname","username","password");
    mysql_select_db("db1",$conn);
    mysql_select_db("db2",$conn);

    $query1 = "SELECT * FROM db1.table";
    $query2 = "SELECT * FROM db2.table";

Sie können Daten der obigen Abfrage aus beiden Datenbanken wie unten abrufen

$rs = mysql_query($query1);
while($row = mysql_fetch_assoc($rs)) {
    $data1[] = $row;
}

$rs = mysql_query($query2);
while($row = mysql_fetch_assoc($rs)) {
    $data2[] = $row;
}

print_r($data1);
print_r($data2);

  • Die angegebenen zwei Abfragen würden auf die gleiche Weise funktionieren, ohne anzurufen mysql_select_db sogar einmal – auch ein zweimaliges Aufrufen ohne irgendetwas anderes in der Mitte ist nutzlos

    – Nico Haase

    17. September 2018 um 6:52 Uhr

Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu
Andrea php

$dbh1 = mysql_connect($hostname, $username, $password);  
$dbh2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $dbh1); 
mysql_select_db('database2',$dbh2); 

mysql_query('select * from tablename', $dbh1);
mysql_query('select * from tablename', $dbh2);

Dies ist die offensichtlichste Lösung, die ich verwende, aber denken Sie daran, wenn der Benutzername / das Passwort für beide Datenbanken auf demselben Host genau gleich sind, verwendet diese Lösung immer die erste Verbindung. Seien Sie also nicht verwirrt, dass dies in einem solchen Fall nicht funktioniert. Was Sie tun müssen, ist, 2 verschiedene Benutzer für die 2 Datenbanken zu erstellen und es wird funktionieren.

  • Die angegebenen zwei Abfragen würden auf die gleiche Weise funktionieren, ohne anzurufen mysql_select_db sogar einmal – auch ein zweimaliges Aufrufen ohne irgendetwas anderes in der Mitte ist nutzlos

    – Nico Haase

    17. September 2018 um 6:52 Uhr

1646909652 983 Wie stellen Sie auf einer einzigen Webseite eine Verbindung zu
Litm

Wenn Sie nicht wirklich mehr als eine Instanz eines PDO-Objekts im Spiel haben müssen, beachten Sie Folgendes:

$con = new PDO('mysql:host=localhost', $username, $password, 
      array(PDO::ATTR_PERSISTENT => true));

Beachten Sie das Fehlen von dbname= in den Bauargumenten.

Wenn Sie sich über ein Terminal oder ein anderes Tool mit MySQL verbinden, wird der Datenbankname nicht sofort benötigt. Sie können zwischen den Datenbanken wechseln, indem Sie die verwenden USE dbname Erklärung über die PDO::exec() Methode.

$con->exec("USE someDatabase");
$con->exec("USE anotherDatabase");

Natürlich möchten Sie dies vielleicht in eine catch try-Anweisung packen.

  • Für diejenigen, die den obigen Ansatz ausprobieren möchten, werfen Sie vorher einen Blick auf stackoverflow.com/a/14933070/1623579

    – Der Frost

    20. Oktober 2013 um 16:10 Uhr

  • Ich liebe diese Lösung! Auf die persistente Einstellung kann ich verzichten, aber die Instanziierung von PDO ist eine tolle Lösung. Sie erhalten eine Standardverbindung, ohne mit einer bestimmten Datenbank verbunden zu sein.

    – Chuck Burgess

    29. Oktober 2015 um 19:46 Uhr

987630cookie-checkWie stellen Sie auf einer einzigen Webseite eine Verbindung zu mehreren MySQL-Datenbanken her?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy