Rumah > Soal Jawab > teks badan
Dalam episod terakhir kami (Cara Membina Pertanyaan Merentas Pangkalan Data dalam MySQL), saya mempelajari cara membina pertanyaan merentas pangkalan data dalam MySQL. Ini berkesan, tetapi apabila wira kami cuba menggunakan pengetahuan baharu ini dalam PHP, dia mendapati rakan baiknya gagal.
Saya melihat PHP mysql_select_db
. Ini seolah-olah bermakna jika saya ingin menggunakan MySQL dengan PHP, saya mempunyai beberapa pilihan:
Gunakan mysql_select_db
tetapi hanya satu pangkalan data boleh digunakan pada satu masa. Ini ialah persediaan semasa kami, mempunyai pangkalan data sebagai pengecam ruang nama nampaknya tidak berfungsi (ia berfungsi dengan baik dalam shell MySQL, jadi saya tahu ia bukan masalah dengan persediaan pelayan MySQL kami).
Jangan guna mysql_select_db
。从我看到的一些示例来看,这似乎意味着我必须为我所做的每个查询指定数据库。这是有道理的,因为我没有使用 mysql_select_db
. Daripada beberapa contoh yang saya lihat, ini seolah-olah bermakna saya perlu menentukan pangkalan data untuk setiap pertanyaan yang saya buat. Ini masuk akal kerana saya tidak menggunakan
Adakah yang lebih baik daripada ini? Adakah terdapat cara untuk saya melakukan pertanyaan MySQL silang pangkalan data dalam PHP tanpa perlu melakukan sesuatu yang gila seperti (2)?
PenjelasanSELECTforeign_db.login.username,firstname,lastname fromforeign_db.login,user where...
: Tiada jawapan yang dicadangkan benar-benar membenarkan saya melakukan pertanyaan silang pangkalan data. Sebaliknya, mereka membenarkan saya mengakses dua pangkalan data berbeza secara berasingan. Saya mahukan penyelesaian yang membolehkan saya melakukan sesuatu seperti
P粉0777017082023-10-23 11:15:52
Selepas membaca arahan anda, saya mendapat tanggapan bahawa anda sebenarnya ingin menanyakan jadual yang berada dalam dua kejadian pelayan MySQL yang berasingan. Sekurang-kurangnya, teks penjelasan anda:
Adalah disyorkan bahawa anda ingin menjalankan pertanyaan semasa log masuk sebagai dua pengguna (yang mungkin atau mungkin tidak berada pada contoh pelayan mysql yang sama).
Dalam soalan anda, anda katakan anda ingin menanyakan data daripada dua pangkalan data yang berbeza, tetapi penting untuk menyedari bahawa tika MySQL boleh mempunyai banyak, banyak pangkalan data. Untuk berbilang pangkalan data yang diuruskan oleh contoh mysql yang sama, penyelesaian yang dicadangkan dalam soalan yang anda pautkan adalah mudah: hanya awalan nama pangkalan data sebelum nama jadual, memisahkan pangkalan data dan nama jadual dengan titik:
.
Tetapi, seperti yang saya nyatakan, ini hanya berfungsi jika:
Senario 1: Pangkalan data pada hos yang sama: berikan kebenaran yang sesuai dan layakkan nama jadual
Jadi jika jadual sebenarnya berada pada contoh mysql yang sama, tidak perlu log masuk atau sambungan kedua - hanya berikan pengguna pangkalan data yang anda gunakan untuk menyambung ke pangkalan data kebenaran yang sesuai untuk mendapatkan semua jadual yang anda perlukan daripada Pilih daripada . Anda boleh melakukan ini menggunakan sintaks GRANT, didokumenkan di sini: http://dev.mysql.com/doc/refman/5.1/en/grant.html
Sebagai contoh, GRANT SELECT ON sakila.film TO 'test'@'%'
将允许用户 test@%
从 film 选择数据
表。完成此操作后,用户可以使用 sakila.film(所谓的限定表名)引用该表,或者如果当前数据库设置为 sakila,只需如下所示sakila
数据库中的 电影
Senario 2: Pangkalan data diurus oleh contoh MySQL yang berbeza: Enjin PERSEKUTUAN
Jika jadual yang anda ingin akses sebenarnya diuruskan oleh dua kejadian MySQL yang berbeza, terdapat helah yang mungkin berfungsi atau tidak bergantung pada konfigurasi anda. Bermula dari MySQL 5.0, mysql menyokong FEDERATED
enjin storan. Ini membolehkan anda mencipta jadual yang sebenarnya bukan jadual, tetapi lubang intip ke dalam jadual pada pelayan jauh. Enjin didokumenkan di sini: http://dev.mysql.com/doc/refman/5.1/en/federated-storage-engine.html
Sebagai contoh, jika anda tahu bahawa pangkalan data misc
pada hos jauh mempunyai jadual ini:
CREATE TABLE t ( id int not null primary key , name varchar(10) not null unique )
Anda boleh mencipta "penunjuk" setempat ke jadual jauh menggunakan:
CREATE TABLE t ( id int not null primary key , name varchar(10) not null unique ) ENGINE = FEDERATED CONNECTION='mysql://<user>@<remote-server>:<remote-port>/misc/t';
Malangnya, enjin FEDERATED
tidak selalu tersedia, jadi anda mesti menyemak dahulu sama ada anda boleh menggunakannya. Tetapi dengan mengandaikan perkara itu berlaku, maka anda boleh menggunakan jadual t tempatan dalam pertanyaan anda, sama seperti jadual lain, dan MySQL akan berkomunikasi dengan pelayan jauh dan melaksanakan operasi yang sesuai pada jadual fizikal di hujung yang lain.
Amaran: Jadual PERSEKUTUAN mempunyai berbilang isu pengoptimuman. Anda harus memahami sama ada dan sejauh mana perkara ini terpakai kepada anda. Contohnya, dalam kebanyakan kes, penggunaan WHERE
pada jadual kesatuan boleh menyebabkan keseluruhan kandungan jadual ditarik ke rangkaian ke pelayan setempat, di mana penapisan sebenar digunakan. Isu lain ialah penciptaan jadual: anda perlu sangat yakin bahawa takrif jadual kesatuan dan jadual yang ditunjukkannya sepadan dengan tepat, kecuali klausa ENGINE (dan SAMBUNGAN). Sebagai contoh, jika anda mempunyai set aksara yang berbeza, data mungkin benar-benar bercelaru selepas dihantar melalui rangkaian.
Jika anda ingin menggunakan FEDERATED
jadual, sila baca artikel ini http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html untuk memutuskan sama ada ia sesuai untuk anda kes penggunaan tertentu.
Jika anda rasa anda benar-benar memerlukannya, saya mempunyai utiliti untuk mencipta jadual kesatuan di sini: http://forge.mysql.com/tools/tool.php?id=54
Senario 3: Tidak dapat menggunakan FEDERATED tetapi jadual adalah pada contoh MySQL yang berbeza
Akhir sekali, jika anda mempunyai jadual pada contoh MySQL yang berbeza tetapi atas sebab tertentu tidak boleh menggunakan enjin jadual bersekutu, maka saya takut anda tidak bernasib baik. Anda hanya melaksanakan pertanyaan terhadap dua contoh MySQL, menerima keputusan, dan melaksanakan beberapa operasi pintar dalam PHP. Bergantung pada keperluan khusus anda, ini mungkin penyelesaian yang berdaya maju
Saya rasa anda perlu tentukan sendiri bahagian mana dalam jawapan saya yang terbaik menyelesaikan masalah anda dan tambahkan ulasan sekiranya anda memerlukan bantuan lanjut. Tia Loren.
P粉4813668032023-10-23 10:00:37
Anda memerlukan pangkalan data untuk dijalankan pada hos yang sama.
Jika ya, anda sepatutnya boleh menggunakan mysql_select_db pada pangkalan data kegemaran/lalai anda dan nyatakan pangkalan data luaran secara manual.
$db = mysql_connect($hots, $user, $password); mysql_select_db('my_most_used_db', $db); $q = mysql_query(" SELECT * FROM table_on_default_db a, `another_db`.`table_on_another_db` b WHERE a.id = b.fk_id ");
Jika pangkalan data anda berjalan pada hos yang berbeza, anda tidak akan dapat menyertai secara langsung. Tetapi kemudian anda boleh melakukan 2 pertanyaan.
$db1 = mysql_connect($host1, $user1, $password1); $db2 = mysql_connect($host2, $user2, $password2); $q1 = mysql_query(" SELECT id FROM table WHERE [..your criteria for db1 here..] ", $db1); $tmp = array(); while($val = mysql_fetch_array($q1)) $tmp[] = $val['id']; $q2 = mysql_query(" SELECT * FROM table2 WHERE fk_id in (".implode(', ', $tmp).") ", $db2);