TIP게시판

제목 다중(타)디비 컨넥 이용하기 (php클래스)
글쓴이 ci세상 작성시각 2009/11/25 11:51:23
댓글 : 3 추천 : 0 스크랩 : 0 조회수 : 20073   RSS
개발하다보면 다른 여러 디비를 연결해 두고 작업할 일이 있는데요.. 단순히 컨넥만 시켜서는 순차적인 디비 처리밖에 못하지만 그놈의 클래스를 이용해서 처리하다보면 처리가 가능하다라는 점 ~~ php 개발시 참조하시면 됩니다.



<핵심포인트>
1. codeigniter는 기본적으로 지원됩니다.
http://codeigniter-kr.org/source/view/340

2. mysql_connect : TRUE인자 필수
동일한 인수로 mysql_connect()을 다시 호출하면, 새로운 link가 생성되는 것이 아니라, 이미 생성된 link 식별자 값을 돌려받게 된다. 단, new_link 로 mysql_connect()를 호출하면 동일한 인수로 mysql_connect()를 이미 호출하였다 하더라도 항상 새로운 접속을 생성한다. SQL 안전 모드에서는, 이 인수를 무시합니다. 

3. mysql_query 시에 컨넥 필수
=> 빠트리면 최종적인 디비컨넥을 참조하게 됩니다.

<도움을 주신분>
우기파파, kirrie 님

<php일반코드>

<?
class mysql_driver {

	function mysql_driver($host,$name,$pass,$db)
	{
		$this->hostname = $host;
		$this->username = $name;
		$this->password = $pass;
		$this->database = $db;
	}

	function db_connect()
	{
		return @mysql_connect($this->hostname, $this->username, $this->password, TRUE);
	}

	function db_select()
	{
		return @mysql_select_db($this->database, $this->conn_id);
	}

	function initialize()
	{
		$this->conn_id = $this->db_connect();
		$this->db_select();
	}

	function query($sql)
	{
		// 이부분은 필요에 의해서 사용가능
		return $this->result=mysql_query($sql,$this->conn_id);
	}
}

function &DB($host,$name,$pass,$db)
{
	$driver = "mysql_driver";
	$DB =& instantiate_class(new $driver($host,$name,$pass,$db));
	$DB->initialize();
	return $DB;
}

function instantiate_class($class){
	return $class;
}


// 디비연결정보
$DB1 = DB('주소','아이디','패스워드','디비명');
$DB2 = DB('주소','아이디','패스워드','디비명');

// 순환출력 (db1, db2 교차테스트)
$result1=$DB1->query("select * from board");
while($data1=mysql_fetch_array($result1))
{

	$result2=$DB2->query("select * from board2");
	$data2 = mysql_fetch_array($result2);

	echo "$data1[title] => $data2[title]<br>";

}

// 입력
$DB1->query("insert into board(id, pass)
values('$id', '$pass')"); // 수정 $DB1->query("update board set  id='$id' where no='$no'"); // 삭제 $DB1->query("delete from board where no='$no' "); // 조회 $result=$DB1->query("select * from board where no = '$no'");
$data = mysql_fetch_array($result); ?>
 다음글 codeigniter+jquery ajax 검색+페이징 (1)
 이전글 Controller롤 확장해서 profile 편하게 사...

댓글

양승현 / 2009/11/25 11:59:50 / 추천 0
좋은 팁이에요~;

테스트 해보려고 연결중 막혀서.. ㅋㅋ

점심들 맛나게 드세요!
ci세상 / 2009/11/25 12:40:44 / 추천 0
다시 정리해서 올립니다.^^ ~~ 결국은 객체화 되어야 할것이

mysql_connect
mysql_query

2개만 되면 되네요~~

나머지는 그대로 사용하면 되구요 ~~
kirrie / 2009/11/25 21:22:40 / 추천 0
좀 이상하죠? mysql_query는 인자를 두개 받는데 두번째 인자는 접속 리소스입니다. 생략도 가능하고, 생략할 경우에는 mysql_connect로 연 마지막 접속 리소스를 사용합니다.

문제는 두번째 접속 리소스 인자를 생략할 경우입니다. 이를테면 '전역적'으로 마지막 연결된 리소스를 사용한다는건데요, 일반적인 경우라면 상관없지만 단단히 캡슐화되어야 할 클래스의 인스턴스의 스쿠프를 무시하고 전체 스크립트의 마지막 연결을 사용한다는건 별로 직관적이지가 않네요. 버그는 아니지만, '당연히' 인스턴스화 된 클래스 내에서 사용된 mysql_query는 해당 인스턴스 내에서 연결된 접속 리소스를 사용해야 하는게 아닌지...

낮에 ci세상님과 이것에 대해 이야기하다가 그냥 이런 생각을 해봤습니다.