簡體   English   中英

連接到兩個數據庫

[英]Connecting to two databases

我有一個應用程序,我想在其中從第一個數據庫對用戶進行身份驗證並從另一個數據庫管理其他活動。 我創建了兩個類。 類的對象在文件中定義:

$objdb1=new db1(),$objdb2=new db2();

但是當我嘗試調用$objdb1->fn() 它從$objdb2搜索並顯示table1不存在?

我的第一個文件database.php

class database
{
private $hostname;
private $database;
private $username;
private $password;
private $dblinkid;

function __construct()
{
    if($_SERVER['SERVER_NAME'] == 'localhost')
    {
        $this->hostname = "localhost";
        $this->database = "aaaa";
        $this->username = "xxx";
        $this->password = "";
    }
    else
    {
        $this->hostname = "localhost";
        $this->database = "xxx";
        $this->username = "xxx";
        $this->password = "xxx";
    }
    $this->dblinkid = $this->connect();
}

       protected function connect()
{
    $linkid = mysql_connect($this->hostname, $this->username, $this->password) or die("Could not Connect ".mysql_errno($linkid));
    mysql_select_db($this->database, $linkid) or die("Could not select database ".mysql_errno($linkid)) ;
    return $linkid;
}

同樣是第二檔

class database2
{
private $vhostname;
private $vdatabase;
private $vusername;
private $vpassword;
private $vdblinkid;

function __construct()
{
    if($_SERVER['SERVER_NAME'] == 'localhost')
    {
        $this->vhostname = "xxx";
        $this->vdatabase = "bbbb";
        $this->vusername = "xxx";
        $this->vpassword = "";
    }
    else
    {
        $this->vhostname = "localhost";
        $this->vdatabase = "xxxx";
        $this->vusername = "xxxx";
        $this->vpassword = "xxxx";
    }
    $this->vdblinkid = $this->vconnect();
}

        protected function vconnect()
{
    $vlinkid = mysql_connect($this->vhostname, $this->vusername, $this->vpassword) or die("Could not Connect ".mysql_errno($vlinkid));
    mysql_select_db($this->vdatabase, $vlinkid) or die("Could not select database ".mysql_errno($vlinkid)) ;
    return $vlinkid;
}

第三檔

$objdb1 = new database();
$objdb2 = new database2();

你能幫我嗎?

問候,

潘卡伊

不了解您的課程,很難提供幫助。 如果您使用的是PDO ,我可以保證您可以創建多個連接到不同數據庫的實例,而不會出現任何問題。 如果您使用的是mysql_系列函數,您可能只是忘了設置link_identifier參數(請參閱此處 )。

但是,對我來說,擁有db1類和db2類聽起來像是代碼的味道。 您可能希望擁有具有不同屬性的同一類的兩個實例。

每次調用mysql_connect()或等效的mysqli函數時,如果連接已經使用相同的憑據存在,則該連接將被重用-因此,您所做的任何修改連接狀態的操作,包括更改數據庫,字符集或其他mysql會話變量的影響“兩個”連接。

由於您使用的是mysql_connect()函數,因此您可以選擇每次都強制建立一個新的連接,但是並非所有擴展都支持該連接(IIRC mysqli和PDO對此不支持)。

但是恕我直言,這是解決問題的錯誤方法。 試圖跟蹤連接在哪里的東西變得很混亂。

正確的方法是在每個查詢中指定數據庫:

 SELECT stuff FROM aaaa.first f, aaaa.second s
 WHERE f.something=s.something;

您的類很可能沒有將適當的連接資源傳遞給數據庫函數。 例如mysql_query()的第二個參數是連接資源。 只需將此資源存儲在連接時的實例變量中,並在每次對數據庫執行操作時都使用它。

您的問題可能在於檢查SERVER_NAME是否為“ localhost”。 好像您在兩個類中都使用了相同的連接字符串。 $ _SERVER ['SERVER_NAME']解析為什么?

您正在尋找mysql_connect()的第四個參數,該參數指出它不應該重用現有的連接:

$dbLink1 = mysql_connect($server, $user, $pass, true);
mysql_select_db($db1, $dbLink1);

$dbLink2 = mysql_connect($server, $user, $pass, true);
mysql_select_db($db2, $dbLink2);

mysql_query("SELECT * FROM table1", $dbLink1); // <-- Will work
mysql_query("SELECT * FROM table1", $dbLink2); // <-- Will fail, because table1 doesn't exists in $db2

將第四個參數作為true傳遞給mysql_connect可解決此問題。

 $linkid = mysql_connect($this->hostname, $this->username, $this->password,true) or die("Could not Connect ".mysql_errno($linkid));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM