2010-03-22 146 views
0

我有一個應用程序,我想從第一個數據庫驗證用戶&管理其他數據庫的活動。 我創建了兩個類。該班的目的是在一個文件中定義:連接到兩個數據庫

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

你能不能幫我在這?

問候,

潘卡

+0

沒有足夠的代碼。告訴我們如何定義db1和db2。 – 2010-03-22 09:32:04

+0

Mooore coooode。 – 2010-03-22 09:44:43

+0

類的優點是可以有幾個共享相同功能但具有不同屬性的實例。在你的情況下,你只能使用一個類,並創建兩個具有不同屬性的實例(例如數據庫連接信息),因此每個數據庫都有一個。 – Gumbo 2010-03-22 13:25:43

回答

2

不知道你的課程,很難提供幫助。如果您使用的是PDO,我可以保證您可以創建連接到不同數據庫的多個實例,而不會有任何問題。如果您正在使用mysql_系列功能,則可能忘記設置link_identifier參數(請參閱here)。

但是,擁有類db1和類db2聽起來像是一種代碼味道。你可能想要擁有不同屬性的同一個類的兩個實例。

+0

嗨,我已經添加了我的代碼,請你詳細說明一下嗎? – 2010-03-22 09:43:39

+2

這兩個班對我來說看起來一樣。爲什麼有兩個類,而不是一個類的兩個實例? – middus 2010-03-22 10:10:04

+0

您好,實際上這個代碼(database1.php)正在我們之前的項目中使用,我開始使用這個文件來處理新項目。 這個新的要求現在來了,我不能改變這個時候的代碼,這是我對不同類使用相同的方法。 – 2010-03-24 11:59:00

0

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

1

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

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

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

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

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

你的問題可能是在檢查,如果SERVER_NAME是「本地主機」。好像你可能在兩個類中都使用了相同的連接字符串。什麼是$ _SERVER ['SERVER_NAME']解決?

0

您正在尋找的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 
0

傳遞第四個參數爲真實的mysql_connect解決問題。

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