Tek bir web sayfasında birden fazla MySQL veritabanına nasıl bağlanıyorsunuz?


179

Birkaç veritabanına yayılmış bilgi var ve PHP kullanarak bir web sayfasına tüm bilgileri koymak istiyorum. Tek bir PHP web sayfasında birden çok veritabanına nasıl bağlanacağımı merak ediyordum.

Nasıl kullanarak tek bir veritabanına bağlanmak biliyorum:

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

Ancak, diğer veritabanlarını açmak için birden çok "mysql_connect" komutunu kullanabilir miyim ve PHP birden fazla veritabanına sahipsem bilgilerin hangi veritabanından alınmasını istediğimi nasıl bilebilir?

Yanıtlar:


335

Uyarı: mysql_xx php 5.5'ten beri işlevler kullanımdan kaldırılmıştır ve php 7.0'dan beri kaldırılmıştır (bkz. Http://php.net/manual/intro.mysql.php ), mysqli_xxişlevleri kullanın veya @Troelskn'dan aşağıdaki cevaba bakın


Birden fazla çağrı yapabilirsiniz mysql_connect(), ancak parametreler aynıysa ' $new_link' (dördüncü) parametre için true değerini iletmeniz gerekir , aksi takdirde aynı bağlantı yeniden kullanılır. Örneğin:

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

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

Sonra veritabanı 1 sorgulamak için ilk bağlantı tanımlayıcı geçmek:

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

ve veritabanı 2 için ikinciyi geçin:

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

Bir bağlantı tanımlayıcısını geçmezseniz, oluşturulan son bağlantı kullanılır (bu durumda temsil ettiği bağlantı $dbh2) örn .:

mysql_query('select * from tablename');

Diğer seçenekler

MySQL kullanıcısı her iki veritabanına da erişebiliyorsa ve aynı ana bilgisayardaysa (yani her iki DB'ye de aynı bağlantıdan erişilebilir):

  • Bir bağlantıyı açık tutun ve mysql_select_db()gerekirse aralarında geçiş yapmak için arayın . Bu temiz bir çözüm olduğundan emin değilim ve yanlış veritabanı sorgulama sona erebilir.
  • Sorgularınızdaki tablolara başvururken veritabanı adını belirtin (örn. SELECT * FROM database2.tablename). Bu muhtemelen bir acıdır.

Ayrıca troelskn'ın cevabını da okuyun çünkü eski uzantılardan ziyade PDO kullanabiliyorsanız daha iyi bir yaklaşımdır.


2
+1 Bu çözüm benim için çalıştı. İki günlük hata ayıklamasından sonra, neden özel WordPress şablonlarım ikinci veritabanı bağlantısına yapılan bir çağrıdan sonra $ WP_Query nesnesine erişimi kaybetti ...
Eddie B

bunlardan birini varsayılan olarak ayarlamak ve sadece $dbh2ikincisini sadece gerektiğinde eklemek zorunda kalmak mümkün mü? İşe bu yaklaşım için tüm sorguları değiştirmek zorunda muhtemelen hepsini bulmak günler sürecek ...
ThomasK

@ThomasK, mysql_query'yi varsayılan bir parametreye sahip bir işlevde sarabilir, diyelim db_query($query,$db='db1')ve sonra tüm eski sorgularınızı toplu olarak güncelleyebilir, db_query($query)ardından varsayılan olmayanları özel olarak güncelleyebilirsinizdb_query($query,'db2')
joshuahedlund

Yönteminizi kullanarak, iki bağlantı tanımlasam ancak sorguda hangi bağlantıyı kullanacağımı belirtmezsem hangi bağlantı kullanılır?
Peter

1
@Peter: uygun 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

97

PHP5 kullanıyorsanız (Ve PHP4'ün kullanımdan kaldırıldığı göz önüne alındığında) PDO kullanmalısınız , çünkü bu yavaş yavaş yeni standart haline gelmektedir. PDO'nun (çok) önemli bir yararı, çok daha güvenli kod sağlayan bağlı parametreleri desteklemesidir.

PDO üzerinden şu şekilde bağlantı kurarsınız:

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

(Elbette yukarıdaki veritabanı adını, kullanıcı adını ve şifreyi değiştirin)

Daha sonra veritabanını şu şekilde sorgulayabilirsiniz:

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

Veya değişkenleriniz varsa:

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

Aynı anda birden fazla bağlantıya ihtiyacınız varsa, PDO'nun birden çok örneğini oluşturabilirsiniz:

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();
}

5
Bu cevap neden en üstte değil ?! Bu konuda doğru yol budur.
Aditya MP

10
bence @aditya menon, sık sık bir şey yapmanın doğru yolu, eldeki soruya doğru cevap değildir. Asker onun sorusunda PDO kullanmıyordu ama php yerli mysql fonksiyonları, bu yüzden en uygun cevap asker kodunu takip edecek inanıyorum.
Jonathan dos Santos

2
@adityamenon kimin yetkisi altında? Kullanıcının her zaman haklı olduğunu unutmayın ... PDO en iyi yoldur, ancak her iki yöntem de kullanıcıların sorununu çözmenin doğru yoludur. Lütfen doğru ve en iyi arasındaki farka dikkat edin. Evet ... sıkıldım bu yüzden açıklama yapmak zorunda kaldım.
JustinKaz

$ Db1 ve $ db2 birden fazla mysql bağlantısını temsil ediyor mu? Eğer öyleyse, bu iyi değil. Tek bir bağlantıyla birden fazla veritabanını barındırmanın bir yolu var mı?
datasn.io

@kavoir Bunu neden istiyorsun? Eğer gerekirse, sizinle geçerli bağlantıya veritabanını değişebilir use DATABASENAME, ama nokta görmüyorum?
troelskn

9

Hayatımı basitleştirdim:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

umarım faydalı olur ... şerefe ...


1
Her iki veritabanında da aynı ada sahip tablolarınız yoksa, bu en kolay çözümdür. Bir kez yaparsınız ve daha sonra artık birden fazla veritabanı için endişelenmenize gerek kalmaz.
Erel Segal-Halevi

@ ErelSegal-Halevi, diğer db'den verilere salt okunur erişime ihtiyacınız olduğu sürece, değil mi?
Buttle Butkus

6

Mysql_connect yerine mysqli_connect kullanın .

mysqli, aynı anda birden çok veritabanını bağlamak için bir işlev sağlar.

$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

1
$ hostname = 'DB_Hostname'; $ username = 'DB_Username'; $ password = 'DB_password'; $ db_name1 = 'DB_Name 1'; $ db_name2 = 'DB_Adınız 2';
kaushik

Bunun işe yaramayacağı yanlışmysql_connect
Nico Haase

4

Aşağıdaki kodu deneyin:

    $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";

Yukarıdaki sorguya ait verileri her iki veritabanından da aşağıdaki gibi alabilirsiniz

$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);

Verilen iki sorgu bir mysql_select_dbkez bile çağırmadan aynı şekilde çalışır - ayrıca, ortada başka bir şey olmadan iki kez çağırmak işe yaramaz
Nico Haase

4
$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);

Bu benim kullandığım en belirgin çözümdür, ancak her iki veritabanı için kullanıcı adı / parola aynı ana bilgisayarda tam olarak aynı ise, bu çözüm her zaman ilk bağlantıyı kullanacaktır. Bu yüzden, bu durumda işe yaramadığı konusunda kafanız karışmasın. Yapmanız gereken, 2 veritabanı için 2 farklı kullanıcı oluşturmak ve işe yarayacak.


3

Oyunda bir PDO nesnesinin birden fazla örneğine sahip olmanız gerekmedikçe, aşağıdakileri göz önünde bulundurun:

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

dbname=İnşaat argümanlarında bulunmadığına dikkat edin .

MySQL'e bir terminal veya başka bir araçla bağlandığınızda, veritabanı adı yarasadan gerekli değildir. Yöntemi kullanarak USE dbnamedeyimi kullanarak veritabanları arasında geçiş yapabilirsiniz PDO::exec().

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

Tabii bunu bir catch try deyiminde sarmak isteyebilirsiniz.


Yukarıdaki yaklaşımı deneyecek olanlar için, önce stackoverflow.com/a/14933070/1623579
TheFrost

Bu çözümü seviyorum! Kalıcı ayar olmadan yapabilirim, ancak PDO'nun başlatılması harika bir çözümdür. Belirli bir veritabanına bağlanmadan varsayılan bir bağlantı elde edersiniz.
Chuck Burgess

2

MySQLi sözdizimini kullanabilirsiniz, bu da onu daha iyi idare etmenizi sağlar.

Veritabanı bağlantılarını tanımlayın, ardından veritabanından birini sorgulamak istediğinizde doğru bağlantıyı belirtin.

Örneğin:

$Db1 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 1st database connection 
$Db2 = new mysqli('$DB_HOST','USERNAME','PASSWORD'); // 2nd database connection

Ardından, bunları aynı sayfada sorgulamak için aşağıdaki gibi bir şey kullanın:

$query = $Db1->query("select * from tablename")
$query2 = $Db2->query("select * from tablename")
die("$Db1->error");

MySQLi olarak bu şekilde değiştirmek size yardımcı olacaktır.


Lütfen sözdizimini geliştirin (bu bir sms değildir) ve kodunuzu araçlarla biçimlendirin (örneğin Ctrl + K).
fedorqui 'SO

2

Aslında ihtiyacınız yok select_db. Aynı anda iki veritabanına sorgu gönderebilirsiniz. İlk olarak, bir yüzlük ver DB1seçim yapmak DB2tarafından GRANT select ON DB2.* TO DB1@localhost;. Sonra FLUSH PRIVILEGES;. Son olarak, SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2vb. Gibi 'çoklu veritabanı sorgusu' yapabilirsiniz (hibe komutunu kullanmak için 'root' erişimine ihtiyacınız olduğunu unutmayın)


1

mysqli kullanıyorsanız ve iki db_connection dosyanız varsa. birincisi gibi

define('HOST','localhost');
define('USER','user');
define('PASS','passs');
define('**DB1**','database_name1');

$connMitra = new mysqli(HOST, USER, PASS, **DB1**);

ikincisi

    define('HOST','localhost');
    define('USER','user');
    define('PASS','passs');
    define(**'DB2**','database_name1');

    $connMitra = new mysqli(HOST, USER, PASS, **DB2**);

Yani sadece DB1 ve DB2 gibi mysqli parametre geçişinin adını değiştirin. mysqli'de aynı parametreyi iletirseniz, her iki dosyada da DB1 varsayalım, o zaman ikinci veritabanı artık bağlanmaz. Bu nedenle, mysqli işlevinde iki veya daha fazla bağlantı geçişi farklı parametre adı kullandığınızı unutmayın


-1
<?php
    // Sapan Mohanty
    // Skype:sapan.mohannty
    //***********************************
    $oldData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
    echo mysql_error();
    $NewData = mysql_connect('localhost', 'DBUSER', 'DBPASS');
    echo mysql_error();
    mysql_select_db('OLDDBNAME', $oldData );
    mysql_select_db('NEWDBNAME', $NewData );
    $getAllTablesName    = "SELECT table_name FROM information_schema.tables WHERE table_type = 'base table'";
    $getAllTablesNameExe = mysql_query($getAllTablesName);
    //echo mysql_error();
    while ($dataTableName = mysql_fetch_object($getAllTablesNameExe)) {

        $oldDataCount       = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $oldData);
        $oldDataCountResult = mysql_fetch_object($oldDataCount);


        $newDataCount       = mysql_query('select count(*) as noOfRecord from ' . $dataTableName->table_name, $NewData);
        $newDataCountResult = mysql_fetch_object($newDataCount);

        if ( $oldDataCountResult->noOfRecord != $newDataCountResult->noOfRecord ) {
            echo "<br/><b>" . $dataTableName->table_name . "</b>";
            echo " | Old: " . $oldDataCountResult->noOfRecord;
            echo " | New: " . $newDataCountResult->noOfRecord;

            if ($oldDataCountResult->noOfRecord < $newDataCountResult->noOfRecord) {
                echo " | <font color='green'>*</font>";

            } else {
                echo " | <font color='red'>*</font>";
            }

            echo "<br/>----------------------------------------";

        }     

    }
    ?>

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.