Bagaimana Anda terhubung ke beberapa database MySQL pada satu halaman web?

179

Saya memiliki informasi yang tersebar di beberapa database dan ingin meletakkan semua informasi ke dalam satu halaman web menggunakan PHP. Saya bertanya-tanya bagaimana saya dapat terhubung ke beberapa database pada satu halaman web PHP.

Saya tahu cara terhubung ke satu database menggunakan:

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

Namun, bisakah saya menggunakan beberapa perintah "mysql_connect" untuk membuka basis data lain, dan bagaimana PHP mengetahui basis data apa yang saya inginkan dari informasi yang saya peroleh jika saya memiliki banyak basis data yang terhubung.

JoshFinnie
sumber

Jawaban:

335

Peringatan: mysql_xx fungsi sudah tidak digunakan lagi sejak php 5.5 dan dihapus sejak php 7.0 (lihat http://php.net/manual/intro.mysql.php ), gunakan mysqli_xxfungsi atau lihat jawabannya di bawah dari @Troelskn


Anda dapat membuat beberapa panggilan mysql_connect(), tetapi jika parameternya sama, Anda harus memberikan true untuk $new_linkparameter ' ' (keempat), jika tidak, koneksi yang sama digunakan kembali. Sebagai contoh:

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

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

Kemudian untuk query database 1, lewati pengenal tautan pertama:

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

dan untuk database 2 lewati yang kedua:

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

Jika Anda tidak melewati pengenal tautan maka koneksi terakhir yang dibuat digunakan (dalam hal ini yang diwakili oleh $dbh2) misalnya:

mysql_query('select * from tablename');

Pilihan lain

Jika pengguna MySQL memiliki akses ke kedua database dan mereka berada di host yang sama (yaitu kedua DB dapat diakses dari koneksi yang sama) Anda bisa:

  • Biarkan satu koneksi terbuka dan panggil mysql_select_db()untuk bertukar di antara yang diperlukan. Saya tidak yakin ini adalah solusi bersih dan Anda akhirnya bisa menanyakan database yang salah.
  • Tentukan nama database ketika Anda mereferensikan tabel dalam kueri Anda (mis SELECT * FROM database2.tablename.). Ini mungkin akan sulit untuk diterapkan.

Baca juga jawaban troelskn karena itu adalah pendekatan yang lebih baik jika Anda dapat menggunakan PDO daripada ekstensi yang lebih lama.

Tom Haigh
sumber
2
+1 Solusi ini berhasil untuk saya. Setelah dua hari men-debug mengapa templat WordPress khusus saya kehilangan akses ke objek $ WP_Query setelah panggilan ke koneksi basis data kedua ...
Eddie B
apakah mungkin untuk menetapkan salah satunya sebagai default, dan hanya perlu menambahkan $dbh2yang kedua hanya bila diperlukan? Harus mengubah semua pertanyaan untuk pendekatan ini untuk bekerja mungkin akan memakan waktu berhari-hari hanya dengan menemukan semuanya ...
ThomasK
@ Thomas, Anda bisa membungkus mysql_query dalam suatu fungsi dengan parameter default, katakan, db_query($query,$db='db1')dan kemudian perbarui secara massal semua pertanyaan lama Anda untuk db_query($query)diikuti dengan kustom memperbarui non-default Anda kedb_query($query,'db2')
joshuahedlund
Menggunakan metode Anda, koneksi mana yang akan digunakan jika saya mendefinisikan dua koneksi tetapi tidak menentukan koneksi mana yang akan digunakan pada permintaan?
Peter
1
@Peter: menurut 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

Jika Anda menggunakan PHP5 (Dan Anda harus, mengingat bahwa PHP4 telah ditinggalkan), Anda harus menggunakan PDO , karena ini perlahan-lahan menjadi standar baru. Satu (sangat) manfaat penting dari PDO, adalah mendukung parameter terikat, yang membuat kode jauh lebih aman.

Anda akan terhubung melalui PDO, seperti ini:

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

(Tentu saja ganti nama data, nama pengguna, dan kata sandi di atas)

Anda kemudian dapat meminta database seperti ini:

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

Atau, jika Anda memiliki variabel:

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

Jika Anda ingin beberapa koneksi terbuka sekaligus, Anda bisa membuat beberapa instance PDO:

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();
}
troelskn
sumber
5
Mengapa jawaban ini tidak di atas ?! Ini adalah cara yang benar untuk melakukannya.
Aditya MP
10
@aditya menon menurut pendapat saya, cara yang tepat untuk melakukan sesuatu sering kali bukanlah jawaban yang tepat untuk pertanyaan yang ada. Penanya tidak menggunakan PDO dalam pertanyaannya tetapi fungsi php mysql asli, jadi saya percaya jawaban yang paling cocok akan mengikuti kode penanya.
Jonathan dos Santos
2
@adityamenon di bawah otoritas siapa? Ingat pengguna selalu benar ... PDO adalah cara terbaik, tetapi kedua cara adalah cara yang tepat untuk menyelesaikan masalah pengguna. Harap perhatikan perbedaan antara yang benar dan yang terbaik. Ya ... saya bosan jadi saya harus membuat pernyataan.
JustinKaz
Apakah $ db1 dan $ db2 mewakili beberapa koneksi mysql? Jika demikian, itu tidak baik. Apakah ada cara untuk mengakomodasi banyak basis data hanya dengan satu koneksi?
datan.io
@avoir Mengapa Anda menginginkan itu? Jika perlu, Anda dapat mengubah basis data pada koneksi saat ini use DATABASENAME, tetapi saya tidak mengerti intinya?
troelskn
9

Saya hanya membuat hidup saya sederhana:

CREATE VIEW another_table AS SELECT * FROM another_database.another_table;

semoga bermanfaat ... tepuk tangan ...

Ihsan Kusasi
sumber
1
Ini adalah solusi termudah jika Anda tidak memiliki tabel dengan nama yang sama di kedua database. Anda melakukannya sekali, dan kemudian Anda tidak perlu khawatir tentang banyak basis data lagi.
Erel Segal-Halevi
@ ErelSegal-Halevi selama Anda hanya perlu akses baca-saja ke data dari db lain, kan?
Buttle Butkus
6

Alih-alih mysql_connect gunakan mysqli_connect .

mysqli menyediakan fungsi untuk menghubungkan beberapa basis data sekaligus.

$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
kaushik
sumber
1
$ hostname = 'DB_Hostname Anda'; $ username = 'DB_Username Anda'; $ password = 'DB_password Anda'; $ db_name1 = 'DB_Name 1 Anda'; $ db_name2 = 'DB_Name 2 Anda';
kaushik
Hanya salah bahwa ini tidak akan berhasilmysql_connect
Nico Haase
4

Coba kode di bawah ini:

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

Anda dapat mengambil data dari kueri di atas dari kedua basis data seperti di bawah ini

$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);
Paks
sumber
Dua pertanyaan yang diberikan akan bekerja dengan cara yang sama tanpa menelepon mysql_select_dbsekali pun - juga, menyebutnya dua kali tanpa hal lain di tengah tidak berguna
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);

Ini adalah solusi yang paling jelas yang saya gunakan tetapi ingat, jika nama pengguna / kata sandi untuk kedua basis data persis sama di host yang sama, solusi ini akan selalu menggunakan koneksi pertama. Jadi jangan bingung bahwa ini tidak berfungsi dalam kasus seperti itu. Yang perlu Anda lakukan adalah, membuat 2 pengguna yang berbeda untuk 2 basis data dan itu akan berhasil.

Fellow Malas
sumber
3

Kecuali Anda benar-benar perlu memiliki lebih dari satu instance objek PDO dalam permainan, pertimbangkan hal berikut:

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

Perhatikan tidak adanya dbname=argumen konstruksi.

Ketika Anda terhubung ke MySQL melalui terminal atau alat lain, nama database tidak diperlukan. Anda dapat beralih antar database dengan menggunakan USE dbnamepernyataan melalui PDO::exec()metode.

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

Tentu saja Anda mungkin ingin membungkus ini dalam pernyataan coba-coba.

Michael Ratcliffe
sumber
Bagi mereka, yang akan mencoba pendekatan di atas, lihat sebelum stackoverflow.com/a/14933070/1623579
TheFrost
Saya suka solusi ini! Saya bisa melakukannya tanpa pengaturan yang gigih, tetapi instantiasi PDO adalah solusi yang bagus. Anda mendapatkan koneksi default tanpa terhubung ke database tertentu.
Chuck Burgess
2

Anda mungkin dapat menggunakan sintaksis MySQLi, yang akan memungkinkan Anda untuk menanganinya dengan lebih baik.

Tetapkan koneksi basis data, lalu kapan pun Anda ingin menanyakan salah satu basis data, tentukan koneksi yang tepat.

Misalnya:

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

Kemudian untuk menanyakannya di halaman yang sama, gunakan sesuatu seperti:

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

Mengubah ke MySQLi dengan cara ini akan membantu Anda.

pengguna3857891
sumber
Harap tingkatkan sintaks Anda (ini bukan sms) dan format kode Anda dengan alat-alat (Ctrl + K, misalnya).
fedorqui 'SO berhenti merugikan'
2

Anda sebenarnya tidak perlu select_db. Anda dapat mengirim kueri ke dua database secara bersamaan. Pertama, memberikan hibah untuk DB1untuk memilih dari DB2dengan GRANT select ON DB2.* TO DB1@localhost;. Lalu FLUSH PRIVILEGES;,. Terakhir, Anda dapat melakukan 'permintaan banyak-basis data' seperti SELECT DB1.TABLE1.id, DB2.TABLE1.username FROM DB1,DB2dll. (Jangan lupa bahwa Anda memerlukan akses 'rooting' untuk menggunakan perintah hibah)

Nagibaba
sumber
1

jika Anda menggunakan mysqli dan memiliki dua file db_connection. seperti yang pertama

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

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

yang kedua adalah

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

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

SO cukup ganti nama parameter pass di mysqli seperti DB1 dan DB2. jika Anda melewatkan parameter yang sama di mysqli misalkan DB1 di kedua file maka basis data kedua tidak akan terhubung lagi. Jadi ingat ketika Anda menggunakan dua koneksi atau lebih, lewati nama parameter yang berbeda di fungsi mysqli

Kamal Bunkar
sumber
-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/>----------------------------------------";

        }     

    }
    ?>
Sapan Mohanty
sumber
Untuk lebih jelasnya, Anda dapat mengunjungi github.com/sapankumarmohanty/CountRecordsAtMigrationFinalSync
htngapi