2010-03-22 4 views
0

첫 번째 데이터베이스에서 사용자를 인증하려는 응용 프로그램이 있습니다 & 다른 데이터베이스의 다른 활동을 관리하고 있습니다. 나는 두 개의 클래스를 만들었습니다. 클래스의 객체는 파일로 정의됩니다.두 데이터베이스에 연결

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

그러나 $objdb1->fn()을 호출하려고 시도합니다. 그것은에서 검색합니다 $objdb2 &는 table1 doesnot 존재하는 것을 보여주고 있습니까?

내 첫 번째 파일 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 et db2가 정의 된 방법을 보여주십시오. –

+0

Mooore coooode. –

+0

클래스의 장점은 동일한 기능을 공유하지만 속성이 다른 여러 인스턴스를 가질 수 있다는 것입니다. 귀하의 경우 하나의 클래스 만 사용하여 서로 다른 속성 (예 : 데이터베이스 연결 정보)을 가진 두 개의 인스턴스를 만들 수 있으므로 각 데이터베이스마다 하나씩 만들 수 있습니다. – Gumbo

답변

2

수업을 모르는 경우 도울 수 없습니다. PDO을 사용하는 경우 다른 데이터베이스에 연결된 여러 인스턴스를 아무 문제없이 만들 수 있음을 보증 할 수 있습니다. mysql_ 패밀리를 사용하는 경우 link_identifier 매개 변수를 설정하는 것을 잊어 버린 것 같습니다 (here 참조).

그러나 클래스 db1 및 클래스 db2은 코드 냄새처럼 들립니다. 서로 다른 속성을 가진 동일한 클래스의 두 인스턴스를 원할 수 있습니다.

+0

안녕하세요, 제 코드를 추가하여 자세히 설명해 주시겠습니까? –

+2

두 클래스는 나에게 똑같이 보입니다. 왜 두 개의 클래스가 있고 두 개의 클래스가 아닌 두 개의 인스턴스가 있습니까? – middus

+0

안녕하세요. 실제로이 코드 (database1.php)는 이전 프로젝트에서 사용되었고이 파일을 사용하여 새 프로젝트 작업을 시작했습니다. 이 새로운 요구 사항이 생겼습니다. 지금은 다른 클래스에서 동일한 접근 방식을 사용하는 코드를 변경할 수 없습니다. –

0

대부분의 경우 클래스는 데이터베이스 기능에 대한 적절한 연결 리소스를 전달하지 않습니다. 예를 들어 두 번째 인수는 mysql_query()은 연결 리소스입니다. 연결시 인스턴스 변수에이 리소스를 저장하고 데이터베이스를 사용하여 무언가를 할 때마다이 리소스를 사용하기 만하면됩니다.

1

mysql_connect() 또는 이와 동등한 mysqli 함수를 호출 할 때마다 동일한 자격증 명을 사용하여 연결이 이미 존재하는 경우 재사용되므로 데이터베이스, 문자 집합 또는 기타 변경 사항을 포함하여 연결 상태를 수정해야합니다. mysql 세션 변수는 "양쪽"연결에 영향을 미친다.

mysql_connect() 함수를 사용할 때마다 매번 새로운 연결을 강제 할 수있는 옵션이 있지만 모든 확장에서이 옵션이 지원되지 않습니다 (IIRC mysqli 및 PDO는이 기능을 사용하지 마십시오).

그러나 IMHO이 문제를 해결하는 잘못된 방법입니다. 어디서 연결되어 있는지 추적하려고하면 더러워집니다.

올바른 방법은 모든 쿼리의 데이터베이스를 지정하는 것입니다 :

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

귀하의 문제는 SERVER_NAME은 "localhost"를 경우 확인에있을 수있다. 두 클래스 모두에서 동일한 연결 문자열을 사용하고있는 것처럼 보입니다. $ _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));