Подключение к двум базам данных - PullRequest
0 голосов
/ 22 марта 2010

У меня есть приложение, в котором я хочу аутентифицировать пользователя из первой базы данных и управлять другими действиями из другой базы данных. Я создал два класса. Объект классов определяется в файле:

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

Можете ли вы помочь мне в этом?

С уважением,

Панкай

Ответы [ 6 ]

2 голосов
/ 22 марта 2010

Не зная ваших классов, трудно помочь. Если вы используете PDO , я могу гарантировать, что вы можете без проблем создавать несколько экземпляров, подключенных к разным базам данных. Если вы используете семейство функций mysql_, вы, вероятно, просто забыли установить параметр link_identifier (см. здесь ).

Однако наличие класса db1 и класса db2 звучит для меня как запах кода. Вы, вероятно, хотите иметь два экземпляра одного и того же класса с разными атрибутами.

1 голос
/ 22 марта 2010

Каждый раз, когда вы вызываете mysql_connect () или эквивалентные функции mysqli, если соединение уже существует с использованием тех же учетных данных, оно используется повторно - поэтому все, что вы делаете для изменения состояния соединения, включая изменение базы данных, кодировок или других mysql Переменные сеанса влияют на «оба» соединения.

Поскольку вы используете функцию mysql_connect (), у вас есть возможность принудительно устанавливать новое соединение каждый раз, но это поддерживается не для всех расширений (в MyRC и PDO IIRC это не поддерживается).

Однако, ИМХО, это неправильный способ решения проблемы. Просто становится грязно, пытаясь отследить, что и где связано.

Правильный способ будет указывать базу данных в каждом запросе:

 SELECT stuff FROM aaaa.first f, aaaa.second s
 WHERE f.something=s.something;
0 голосов
/ 24 марта 2010

Передача четвертого параметра как true в mysql_connect решает проблему.

 $linkid = mysql_connect($this->hostname, $this->username, $this->password,true) or die("Could not Connect ".mysql_errno($linkid));
0 голосов
/ 22 марта 2010

Вы ищете четвертый параметр 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 голосов
/ 22 марта 2010

Ваша проблема может заключаться в проверке, является ли SERVER_NAME "localhost". Похоже, вы можете использовать одинаковые строки подключения в обоих классах. Как разрешается $ _SERVER ['SERVER_NAME']?

0 голосов
/ 22 марта 2010

Скорее всего, ваш класс не передает соответствующий ресурс соединения функциям базы данных.Второй аргумент, например, mysql_query() - это ресурс соединения.Просто сохраните этот ресурс в переменной экземпляра при подключении и используйте его каждый раз, когда вы что-то делаете с базой данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...