Linux PHP에서 MSSQL 연결하기
현존하는 방법에는 3가지가 있습니다.
http://www.phpbuilder.com/columns/alberto20000919.php3 에서 Alberto Dainotti 라는 사람이 말했듯이...
1. freetds 0.51 을 이용한 방법 - 한글문제가 아직 해결이 안되었다
2. Sybase Client Library - php 컴파일할 때 .h 파일이 없다
3. odbc 를 이용한 방법
입니다.
이중 freetds 를 이용한 방법은 요 아래글에 정진석님이라는 분이 아주 잘 정리한 글이 있습니다. 고걸 보세요..
요거는 odbc 를 통하지 않기 때문에 속도도 빠르고 다 좋지만 한글이 완벽히 해결이 안되어 있습니다. 한글만 해결하면 젤 좋은거 같습니다.
한글땜에 전 두번째 방법을 시도 했었죠......
sybase-common-11.9.2-3.i386.rpm 파일을 받아다 썼는데...
근데...애는 필요한 파일이 다 없더군요.. 찾아보니 freetds 에 필요한 헤더파일이 있기에 걍 카피해다가 썼는데 apachectl 이 아예 실행이 되질 않습니다. 이것저것 보다가 요것두 포기했습니다.
드뎌 3번째 odbc....... 흐흐~
요건 성공했슴다... 하지만 속도가 훨 느립니다... 하지만 현재로서는 이 방법이 최선인듯 보입니다..
아래 설명 들어갑니다.
<ODBC 를 이용한 방법>
A. 프로그램 다운로드
i. 리눅스용 odbc 드라이버 (install.sh l2oczzzz.taz)
www.openlinksw.com 에서 받는다. 등록하면 무료로 받을 수 있다.
ii. Windows용 리퀘스트 브로커 (ntadmzzz.zip)
위에꺼와 같이 받을 수 있다. 다른 기종에서 mssql로 연결할 때 중간에서 해주는 넘이다
iii. iodbc SDK (libiodbc-2.50.3.tar.gz)
www.iodbc.org 에서 받는다. php 컴파일할 때 필요하다
B. Windows쪽 설치 (물론 sql7서버는 이미 설치되어 있어야 겠죵~)
i. ntadmzzz.zip 을 적당한곳에서 푼다
ii. disk1 에 있는 setup.exe 을 실행한다
iii. 설치중에 적당히 설정을 조정한다 (기본 설정 써도 무난)
iv. 재부팅하면 자동으로 서비스가 실행된다.
v. openlink 가 설치된 폴더에 있는 udbc.ini 는 리눅스쪽에서 필요하니 따로 카피를 해 놓는다
C. 리눅스쪽 설치
i. 다음 과정을 한다
#mkdir /usr/local/openlink
#install.sh 와 l2oczzzz.taz 를 /usr/local/openlink 에 복사
#cd /usr/local/openlink
#./install.sh
압축을 풀면서 설치한다. 중간에 두번 물어보는데 root 라고 만 치면 된다
# cp windows에서얻어온udbc.ini bin/
bin 디렉토리에는 odbc.ini odbcinst.ini 도 함께 있다
#./openlink.sh를 실행하면 필요한 환경변수가 잡힌다
안잡히면 수동으로라도 해 주세요.....
ii. odbc.ini odbcinst.ini 에서 경로부분을 /home 에서 /usr/local 로 맞게 모두 수정한다
iii. udbc.ini 에 있는 예제 dsn_sql6 부분을 odbc.ini 으로 카피한 다음 아래처럼 수정한다
[ODBC Data Sources] a 요기는 리스트만 보여줄뿐 없어도 된다
OpenLink = 어쩌고 저쩌고 (원래 있는 부분)
healingmall = healingmall mssql7 Server
[healingmall]
Description = Sample MS SQLServer DSN
Host = 192.168.1.xx
ServerType = SQLServer 7
ServerOptions =
Database = imsi
FetchBufferSize = 30
;Database =
;ServerOptions =
;ConnectOptions =
;Options =
UserName = sa
Password = xxxx
;ReadOnly = yes
D. 테스트
i. bin/odbctest 를 실행
ii. Enter ODBC connect string (? shows list):
걍 엔터를 쳐보면 접속할 수 있는 리스트가 나온다
iii. Enter ODBC connect string (? shows list): dsn=healingmall
SQL> 프롬프트가 떨어지면 일단은 성공한 것이다.
iv. select, insert 테스트를 해본다
E. PHP와 연동하여 설치
i. 위에서 다운받은 libiodbc-2.50.3.tar.gz 를 설치한다.
#./configure;make;make install
설치하면 어디에 설치가 되는지 저도 잘 모르겠더라구요..
ii. php의 configure 에서 아래의 2가지를 추가해서 컴파일한다
#./configure --with-iodbc=/usr/local --with-openlink=/usr/local/openlink
iii. apachectl 에 /usr/local/openlink/openlink.sh 의 내용을 그대로 복사하면 환경변수가 그대로 잡힌다
F. 마지막 테스트
$dsn = "healingmall"; // odbc.ini 에서 적어준걸로..
$username = "sa"; // 유저넴
$passwd = "xxxx"; // 비번
$connect = odbc_connect($dsn,$username,$passwd);
$query = "select * from member" ;
$query_result =odbc_exec($connect, $query) ;
odbc_result_all($query_result);
odbc_close($connect);
====================================================================
최근에 다시 freetds 를 이용한 방법으로 한글문제까지 깔끔히 해결을 해서 이렇게 다시 글을 답니다.....
다른 분들이 올려놓은 글들이 많은 도움이 되었습니다....
openlink 보다 freetds를 쓰면 좋은점....
1. 훨 빠르당
2. 윈도우쪽은 전혀 건들지 않아도 된다. (리퀘스트브로커 같은거 안깔아두 된다)
3. php 에서 top 이라든가 distinct 등의 구문이 먹지 않는데 freetds 는 아무 문제가 없다... 등등입니다..
어떻게 한글을 해결했나...
1. tdsver 를 7.0을 쓰는게 아니구 4.2를 씁니다...
2. 원래 4.2는 sql 6.5 시절에 쓰던건데 sql 7.0 이나 sql 2000 에서 써두 암 문제 없당..
3. sql 쪽에서 컬럼타입을 잡을때 varchar 대신 nvarchar 같은 unicode 타입을 쓰라고 한 글도 있는데요. 걍 varchar 써두 암 문제 없습니다..
자, 그럼 설명 들어갑니다....
1. www.freetds.org 에서 다운받는다. 현재 버전은 0.52 까지 나와 있당
2. 압축풀고 설치
#cd freetds
#./configure --with-tdsver=7.0 --enable-msdblib --enable-dbmfix --with-gnu-ld --enable-shared --enable-static
#make
#make install
여기서는 그대로 tdsver=7.0 으로 컴파일 해도 상관없다.
3./usr/local/freetds/etc/freetds.conf 에 다음을 추가한다 (0.52 버전)
[hongikngo]
host = 192.168.1.34
port = 1433
tds version = 4.2
0.52로 올라오면서 그전에 쓰던 interfaces 파일은 암 쓸모가 없어진거 같습니다. 걍 interfaces 파일에다 예전처럼 했다가 3번을 다시 까는등 엄청 고생했씀다. 꼭 이 파일을 이용하세요..
글구 보면 tds version = 4.2 로 되어 있습니다.
이거 꼭 확인하시구요....
여기다 7.0을 적구 난중에 php 소스상에서
putenv("TDSVER=42");
일케 해두 됩니다.. 맘에 드는걸루 하세염
4. 0.51 이하에서는 /usr/local/freetds/interfaces 를 수정하면 됩니다.
hongikngo
query tcp ether 192.168.1.34 1433
master tcp ether 192.168.1.34 1433
5. PHP 소스 수정
이거 php 버전 4.0.6 부터는 안해줘도 됩니다...
아지만 4.0.5 이하라면 아래처럼 소스수정해 줍니다.
1) php 버전 4.0.5 이하에서는 php/ext/Sybase/ 아래의 소스에서 dbopen() 함수를 모조리 tdsdbopen() 으로 바꾸어 준다 (3군데 정도 있다)
2) 이하는 보통의 설치와 같다. 단, php의 configure 에서 다음을 추가한다
#./configure --with-sybase=/usr/local/freetds --생략..
#make 등등...... apache 설치 등등....
6. 다 설치되었다구 보구 테스트 해 본다.
mssql_connect() 과 sybase_connect() 두 함수 다 잘 먹는다
아래는 소스다...
putenv("SYBASE=/usr/local/freetds");
//putenv("TDSVER=42"); // tds 버전을 여기다 적어두 된다
// YOUR sybase 7.0 SERVER PARAMETERS
$hostname = "hongikngo"; // freetds.conf 에서 적어준걸로..
$username = "idid"; // 유저넴
$password = "xxxx"; // 비번
$dbname = "dbdb"; // 데이터베이스 이름
// CONNECT TO THE sybase 7.0 DATABASE
$connection = sybase_connect($hostname,$username,$password);
sybase_select_db($dbname);
//
echo("<table border=1>");
$query = "select * from test" ;
$query_result =sybase_query($query) ;
$number_rows = sybase_num_rows($query_result) ;
$number_fields = sybase_num_fields($query_result) ;
// DISPLAY INDIVIDUAL ROWS - POPULATING THE TABLE
for ($row_number=0; $row_number<=$number_rows-1; $row_number++)
{
print "<tr><td>$row_number</td>";
for ($field_number=0; $field_number<=$number_fields-1; $field_number++)
{
print "<td>" . sybase_result($query_result, $row_number, $field_number) . "</td>" ;
}
print "</tr>" ;
}
print "</table>" ;
sybase_close($connection);
한글 쿼리도 함 날려보면 잘 먹는걸 볼 수 있다......^^
이상입니다.....
'프로그래밍 > 리눅스' 카테고리의 다른 글
리눅스[linux] - Network Device 속도제한 (0) | 2012.08.17 |
---|---|
리눅스[linux] - lynx로 php 자동 실행하기 (0) | 2012.08.17 |
리눅스[linux] - ftp접속 느릴때 (0) | 2012.08.17 |
리눅스[linux] - apache 시작시간 및 프로세스별 메모리 리스트 (0) | 2012.08.17 |
리눅스[linux] - [Shell Script] 프로세스 죽이기 & 하루전 날짜출력 (0) | 2012.08.17 |