cari

Rumah  >  Soal Jawab  >  teks badan

Bagaimana untuk membina pertanyaan pangkalan data silang dalam PHP?

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:

  1. 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).

  2. 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

    untuk memberitahu PHP pangkalan data yang ingin saya akses. Ini juga menyedihkan kerana saya tidak mahu melalui semua kod dan menambah setiap pertanyaan dengan nama pangkalan data.

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

dan bukannya hanya membuat pertanyaan berbeza kepada pangkalan data yang berbeza. Untuk apa yang bernilai, (2) tidak berfungsi untuk saya. 🎜
P粉197639753P粉197639753403 hari yang lalu671

membalas semua(2)saya akan balas

  • P粉077701708

    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:

    1. Semua pangkalan data yang anda akses dalam pertanyaan berada pada pelayan yang sama - iaitu diuruskan oleh contoh MySQL yang sama
    2. Pengguna yang disambungkan ke pangkalan data mempunyai kebenaran yang betul untuk mengakses kedua-dua jadual.

    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 数据库中的 表。完成此操作后,用户可以使用 sakila.film(所谓的限定表名)引用该表,或者如果当前数据库设置为 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.

    balas
    0
  • P粉481366803

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

    balas
    0
  • Batalbalas