国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Wie erstellt man eine datenbankübergreifende Abfrage in PHP?
P粉197639753
P粉197639753 2023-10-22 11:40:00
0
2
840

In unserer letzten Folge (So erstellen Sie datenbankübergreifende Abfragen in MySQL) habe ich gelernt, wie man datenbankübergreifende Abfragen in MySQL erstellt. Das funktionierte gro?artig, aber als unser Held versuchte, dieses neu gewonnene Wissen in PHP zu nutzen, stellte er fest, dass sein bester Freund versagte.

Ich habe mir PHPs angesehen mysql_select_db . Das scheint zu bedeuten, dass ich, wenn ich MySQL mit PHP verwenden m?chte, ein paar Optionen habe:

  1. Verwenden Sie mysql_select_db, es kann jedoch jeweils nur eine Datenbank verwendet werden. Dies ist unser aktuelles Setup. Die Datenbank als Namespace-ID zu verwenden scheint nicht zu funktionieren (in der MySQL-Shell funktioniert es einwandfrei, daher wei? ich, dass es bei unserem MySQL-Server-Setup kein Problem darstellt).

  2. Nicht verwenden mysql_select_db。從我看到的一些示例來(lái)看,這似乎意味著我必須為我所做的每個(gè)查詢指定數(shù)據(jù)庫(kù)。這是有道理的,因?yàn)槲覜](méi)有使用 mysql_select_db. Aus einigen Beispielen, die ich gesehen habe, scheint dies zu bedeuten, dass ich die Datenbank für jede Abfrage angeben muss, die ich mache. Das macht Sinn, da ich

    nicht verwende, um PHP mitzuteilen, auf welche Datenbank ich zugreifen m?chte. Das ist auch deshalb traurig, weil ich nicht den gesamten Code durchgehen und jeder Abfrage den Datenbanknamen voranstellen m?chte.

Gibt es etwas Besseres als das? Gibt es eine M?glichkeit für mich, eine datenbankübergreifende MySQL-Abfrage in PHP durchzuführen, ohne etwas Verrücktes wie (2) tun zu müssen?

KlarstellungSELECTforeign_db.login.username,firstname,lastname fromforeign_db.login,user where...: Mit keiner der vorgeschlagenen Antworten konnte ich tats?chlich datenbankübergreifende Abfragen durchführen. Stattdessen erm?glichen sie mir den separaten Zugriff auf zwei verschiedene Datenbanken. Ich m?chte eine L?sung, die es mir erm?glicht, so etwas wie

zu tun, anstatt nur verschiedene Abfragen an verschiedene Datenbanken durchzuführen. Für das, was es wert ist, funktioniert (2) bei mir nicht. ??
P粉197639753
P粉197639753

Antworte allen(2)
P粉077701708

閱讀您的說(shuō)明后,我的印象是您實(shí)際上想要查詢駐留在兩個(gè)單獨(dú)的 MySQL 服務(wù)器實(shí)例中的表。至少,您的澄清文字:

建議您希望在以兩個(gè)用戶身份登錄時(shí)運(yùn)行一個(gè)查詢(可能駐留在也可能不駐留在同一個(gè) mysql 服務(wù)器實(shí)例上)。

在您的問(wèn)題中,您說(shuō)您想要從兩個(gè)不同的數(shù)據(jù)庫(kù)查詢數(shù)據(jù),但重要的是要認(rèn)識(shí)到一個(gè) MySQL 實(shí)例可以有很多很多數(shù)據(jù)庫(kù)。對(duì)于由同一 mysql 實(shí)例管理的多個(gè)數(shù)據(jù)庫(kù),您鏈接到的問(wèn)題中提出的解決方案很簡(jiǎn)單:只需在表名前添加數(shù)據(jù)庫(kù)名稱前綴,用點(diǎn)分隔數(shù)據(jù)庫(kù)和表名稱:..

但是,就像我指出的那樣,這只在以下情況下有效:

  1. 您在一個(gè)查詢中訪問(wèn)的所有數(shù)據(jù)庫(kù)都駐留在同一臺(tái)服務(wù)器上 - 即由同一個(gè) MySQL 實(shí)例管理
  2. 連接到數(shù)據(jù)庫(kù)的用戶具有訪問(wèn)這兩個(gè)表的正確權(quán)限。

場(chǎng)景1:同一主機(jī)上的數(shù)據(jù)庫(kù):授予適當(dāng)?shù)臋?quán)限并限定表名稱

因此,如果這些表實(shí)際上駐留在同一個(gè) mysql 實(shí)例上,則無(wú)需第二次登錄或連接 - 只需授予您用于連接到數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)用戶適當(dāng)?shù)臋?quán)限,即可從您需要的所有表中進(jìn)行選擇。您可以使用 GRANT 語(yǔ)法來(lái)做到這一點(diǎn),記錄如下:http://dev.mysql.com/doc/refman/5.1/en/grant.html

例如,GRANT SELECT ON sakila.film TO 'test'@'%' 將允許用戶 test@%film 選擇數(shù)據(jù)sakila 數(shù)據(jù)庫(kù)中的 表。完成此操作后,用戶可以使用 sakila.film(所謂的限定表名)引用該表,或者如果當(dāng)前數(shù)據(jù)庫(kù)設(shè)置為 sakila,只需如下所示電影

場(chǎng)景2:由不同MySQL實(shí)例管理的數(shù)據(jù)庫(kù):FEDERATED引擎

如果您要訪問(wèn)的表實(shí)際上由兩個(gè)不同的 MySQL 實(shí)例管理,則有一個(gè)技巧可能有效,也可能無(wú)效,具體取決于您的配置。從MySQL 5.0開(kāi)始,mysql支持FEDERATED存儲(chǔ)引擎。這使您可以創(chuàng)建一個(gè)實(shí)際上不是表的表,而是遠(yuǎn)程服務(wù)器上表的窺視孔。該引擎記錄在此處:http://dev. mysql.com/doc/refman/5.1/en/federated-storage-engine.html

例如,如果您知道遠(yuǎn)程主機(jī)上的 misc 數(shù)據(jù)庫(kù)中有此表:

CREATE TABLE t (
    id int not null primary key
,   name varchar(10) not null unique
)

您可以使用以下命令創(chuàng)建指向該遠(yuǎn)程表的本地“指針”:

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

不幸的是,FEDERATED 引擎并不總是可用,因此您必須首先檢查是否可以使用它。但假設(shè)是這樣,那么您可以在查詢中簡(jiǎn)單地使用本地表 t,就像任何其他表一樣,MySQL 將與遠(yuǎn)程服務(wù)器通信并對(duì)另一端的物理表執(zhí)行適當(dāng)?shù)牟僮鳌?/p>

警告:FEDERATED 表存在多個(gè)優(yōu)化問(wèn)題。您應(yīng)該了解這些是否以及在多大程度上適用于您。例如,在許多情況下,將 WHERE 應(yīng)用于聯(lián)合表可能會(huì)導(dǎo)致整個(gè)表內(nèi)容通過(guò)網(wǎng)絡(luò)拉至本地服務(wù)器,在本地服務(wù)器上應(yīng)用實(shí)際的過(guò)濾。另一個(gè)問(wèn)題是表創(chuàng)建:您必須非常確定聯(lián)合表及其指向的表的定義完全匹配,除了 ENGINE 子句(和 CONNECTION)。例如,如果您有不同的字符集,則數(shù)據(jù)在通過(guò)網(wǎng)絡(luò)傳輸后可能會(huì)完全亂碼。

如果您想使用FEDERATED表,請(qǐng)閱讀這篇文章http://oreilly.com/pub/a/databases/2006/08/10/mysql-federated-tables.html 來(lái)決定它是否適合您特定用例。

如果您認(rèn)為確實(shí)需要它,我有一個(gè)實(shí)用程序可以在此處創(chuàng)建聯(lián)合表:http://forge.mysql.com/tools/tool.php?id=54

場(chǎng)景3:無(wú)法使用FEDERATED,但表位于不同的MySQL實(shí)例上

最后,如果您在不同的 MySQL 實(shí)例上有表,但由于某種原因無(wú)法使用聯(lián)合表引擎,那么恐怕您就不走運(yùn)了。您只需對(duì)兩個(gè) MySQL 實(shí)例執(zhí)行查詢、接收結(jié)果并在 PHP 中執(zhí)行一些智能操作。根據(jù)您的具體要求,這可能是一個(gè)完全可行的解決方案

我想您需要自己決定我的答案的哪一部分最能解決您的問(wèn)題,并添加評(píng)論以防您需要更多幫助。蒂亞·羅蘭。

P粉481366803

您將需要數(shù)據(jù)庫(kù)在同一主機(jī)上運(yùn)行。

如果是這樣,您應(yīng)該能夠在您最喜歡的/默認(rèn)數(shù)據(jù)庫(kù)上使用 mysql_select_db 并手動(dòng)指定外部數(shù)據(jù)庫(kù)。

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

如果您的數(shù)據(jù)庫(kù)運(yùn)行在不同的主機(jī)上,您將無(wú)法直接加入。但隨后您可以進(jìn)行 2 個(gè)查詢。

$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);
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage