连接到两个数据库

时间:2010-03-22 09:24:42

标签: php database

我有一个应用程序,我想从第一个数据库&从另一个数据库管理其他活动。 我创建了两个类。类的对象在文件中定义:

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

你能帮我解决这个问题吗?

此致

的Pankaj

6 个答案:

答案 0 :(得分:2)

在不了解课程的情况下,很难提供帮助。如果您使用PDO,我可以保证您可以创建连接到不同数据库的多个实例而不会出现任何问题。如果您使用的是mysql_系列函数,则可能只是忘记设置link_identifier参数(请参阅here)。

然而,拥有一个班级db1和一个班级db2听起来像是一个代码味道给我。您可能希望具有不同属性的同一类的两个实例。

答案 1 :(得分:1)

每次调用mysql_connect()或等效的mysqli函数时,如果已经存在使用相同凭据的连接,则会重用它 - 所以你要做的就是修改连接状态,包括更改数据库,字符集或其他mysql会话变量影响“两个”连接。

由于您使用的是mysql_connect()函数,因此您可以选择每次强制建立新连接,但所有扩展都不支持此选项(IIRC mysqli和PDO不支持此操作)。

然而恕我直言,这是解决问题的错误方法。试图跟踪连接在哪里的情况变得很乱。

正确的方法是在每个查询中指定数据库:

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

答案 2 :(得分:0)

您的类很可能没有将适当的连接资源传递给数据库函数。例如,第二个论点mysql_query()是连接资源。只需将此资源存储在连接上的实例变量中,并在每次对数据库执行某些操作时使用它。

答案 3 :(得分:0)

您的问题可能在于检查SERVER_NAME是否为“localhost”。好像你可能在两个类中使用相同的连接字符串。什么是$ _SERVER ['SERVER_NAME']解析为?

答案 4 :(得分: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

答案 5 :(得分:0)

将第四个参数作为true传递给mysql_connect解决了这个问题。

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