가끔정상

리눅스에서 PHP MySQL ODBC 사용하기.

권성재 2010. 9. 6. 16:31
##########################################################################
### 제목  : 리눅스서버의 PHP 에서  MySQL 연결시 ODBC 함수 사용하기
### 쓴때 : 2010-09-06 벌초하다가 죽을 뻔한 다음날
### 쓴이 : 카폐인 (nonots@hanmail.net)


1. 개요
 여태껏 리눅스 서버에서 PHP 로 웹프로그래밍 하면서  MySQL DBMS 에 
ODBC 로 연결해 본 적도 없고, 그렇게 할 필요도 전혀 못느꼈는데, 
어쩌다 보니 ..  그렇게 해야만 "돈준다"는 "갑"의 요청에, 
또 비장한 심정으로 삽질을 해보니 되긴 된다.
암튼 덕분에 새로운 경험이었다.


2. 서버 환경 
	- 리눅스 CentOS 4.8, 
		아파치웹서버 : 2.0, 
		PHP 5.13, 
		MySQL : 5.0


3. 설정방법

	1) php 에서 odbc 모듈이 활성화 되어야 한다. 
	만약 php 소스컴파일 당시 odbc 옵션이 없었다면 새로 컴파일 해야 할꺼다. 
	좀 짜증나는 일이다.
	만약 rpm 이나 deb 로 설치를 했다면 그냥 yum 혹은 apt-get 등으로 
	php-odbc 패키지만 설치하면 된다. 내경우 다행히  APM 이 rpm 으로 설치가 되어서 
	php-odbc 를 yum 으로 간단하게 설치했다.
	웹서버 재시작 후 phpinfo() 로 봤을 때 ODBC 항목이 제대로 나타나면 일단은 된거다.
	구체적 방법은 각자가.

	2) unixODBC 패키지를 설치한다.
	보통 서버 설치시 기본으로 설치가 되어 있을꺼다.
	안되어 있다면 역시 rpm 등으로 설치한다. 
	/etc/odbc.ini 나 /etc/odbcinst.ini 이런 파일이 존재한다면 이미 unixODBC 가
	설치되어 있다는 증거다.

	3) mysql odbc 커넥터를 설치한다.
	centos 리눅스의 경우 기본 배포디렉토리에는 없고,  
	http://ftp.neowiz.com/pub/centos/4.8/centosplus/x86_64/RPMS/ 와 같이
	cenosplus 라는 추가 배포 디렉토리에 mysql-connector-odbc-3.51 이름의 rpm이 있다.
	이걸 설치하면 된다.

		[root@home6 ~]# rpm -ql mysql-connector-odbc
		/usr/lib64/libmyodbc3-3.51.26.so
		/usr/lib64/libmyodbc3.so (요 파일경로가 아래에 사용)
		/usr/lib64/libmyodbc3_r-3.51.26.so
		/usr/lib64/libmyodbc3_r.so
		...

	아니면
	http://mysql.com/downloads/connector/odbc/ 와 같이 mysql 홈페이지에서 제공하는
	커넥터를 직접 다운 받아 설치하면 된다. 
	설치된 *.so 파일의 위치를 잘 기억해야한다.


	4) /etc/odbc.ini, /etc/odbcinst.ini 파일을 적절하게 수정한다.

		>>>>>>>
		[root@home6 ~]# cat /etc/odbc.ini 
		[ODBC Data Sources]
		myodbc3      = MySQL ODBC 3.51 Driver

		[myodbc3]
		Driver         = /usr/lib64/libmyodbc3.so
		Description  = MySQL ODBC 3.51 Driver
		Server        = localhost
		Port           = 3306
		User           = mydb_user  ( <= db 연결 아이디 적절하게 수정)
		Password    = mydb_password ( <= 적절하게 수정)
		Database    = mydb_name ( <= 적절하게 수정)
		Option        = 3   
		Socket       = /var/lib/mysql/mysql.sock ( <= 소켓파일위치 적절하게 수정)


		>>>>>>>
		[root@home6 ~]# cat /etc/odbcinst.ini 
		# Example driver definitinions
		#
		# Driver from the MyODBC package
		# Setup from the unixODBC package
		[MySQL ODBC 3.51 Driver]
		Description     = MySQL ODBC 3.51 Driver
		Driver          = /usr/lib64/libmyodbc3.so  
                                            ( 요건 mysql-connector-odbc  에서의 위치 )
		Setup           = /usr/lib64/libodbcmyS.so  
                                            ( 요건 unixODBC 에 포함된 위치, 아마 기본값)
		FileUsage       = 1
			 

		위 2 개 파일에서 db이름,아이디,비번과 mysql소켓파일을 적절하게 입력하고 
		특히, odbcinst.ini 파일에서 Driver 항목의 커넥터 so 파일의 위치를 적는다.
		이제 unixODBC 패키지 자체 포함된 isql 이라는 명령어로 odbc세팅이 잘된건지 
		아래와 같이 확인해 보자. 
		/etc/odbc.ini 에 설정한 db 와 db 아이디로 접속된다.

		[root@home6 ~]# isql -v myodbc3
		+---------------------------------------+
		| Connected!                            |
		|                                       |
		| sql-statement                         |
		| help [tablename]                      |
		| quit                                  |
		|                                       |
		+---------------------------------------+
		SQL> 
		 	

		그리고 마지막으로 위 설정파일에서 Description = MySQL ODBC 3.51 Driver 를
		잘 기억해 둔다.


4. PHP 소스에서 사용하기.
	이건 간단하다.
	아래 예제보면 금방 이해가 갈꺼다.

		<? 
		//phpinfo(); exit; 
		error_reporting(E_ALL);  // 디버깅 위한
		ini_set("display_errors",1);  // 디버깅 위한 2

		// 여기 DRIVER  부분이 /etc/odbc.ini 의 Description 부분이다. 주의한다.
		$conn = odbc_connect(
                  "DRIVER={MySQL ODBC 3.51 Driver};Server=localhost;Database=my_db_name", 
		  "my_db_user", "my_db_password"); 

		$sql = "SELECT * from users"; 
		$rs = odbc_exec($conn,$sql); 
		echo "<table><tr>"; 
		echo "<th>이름</th><th>이메일</th></tr>"; 
		while (odbc_fetch_row($rs)) 
		 { 
		 $user = odbc_result($rs,"username"); 
		 $email = odbc_result($rs,"email"); 
		 echo "<tr><td>$user</td><td>$email</td></tr>"; 
		} 
		odbc_close($conn); 
		echo "</table>"; 

		?>

	제대로 데이타를 불러오는가? 그럼 된거다. 
	이제 "을"의 설움을, 
        새로운 기술을 습득한 기쁨의 눈물로 승화시켰다고 자위하면 된다.

5. 마무리

	그런거 없다.