본문 바로가기
프로그램 (PHP,Python)

PHP FreeTDS 사용 ODBC(MSSQL) 연동

by 날으는물고기 2009. 6. 17.

PHP FreeTDS 사용 ODBC(MSSQL) 연동

PHP에서 Microsoft SQL 서버를 사용하기 위한 방법입니다. 편의상 존칭은 생략합니다.

PHP에서 ODBC, Microsoft SQL, SyBase 등을 사용할때에 mssql 익스텐션을 컴파일 하기 위해서는 Free TDS 라이블러리가 필요하다.

이때 사용되는 프로토콜은 Microsoft SQL 4.2, 7.0, 8.0 프로토콜을 지원하고 있다.

설치 방법은 아래와 같다.

사이트 : http://www.freetds.org

다운로드를 적당한 디렉토리 (ex: /usr/local/src) 에 wget등을 이용해서 다운로드 받는다.
(편의상 root로 작업)

Free TDS 라이블러리 설치

# tar zxvf freetds-stable.tgz
# cd freetds-0.82
# ./configure (기본으로 /usr/local 에 라이블러리가 설치됨)
# make
# make install
# ldconfig (vi /etc/ld.so.conf 파일에서 /usr/local/lib 를 추가해준다)

/usr/local/freetds/ 에 설치 됬다면 /usr/local/freetds/etc/freetds.conf 를 수정한다.

[AploDBSrv]
        host = [IP] // ODBC서버의 IP를 설정한다.
        port = [PORT] // ODBC서버의 PORT를 설정한다.
추가 (서버이름 : AploDBSrv)


테스트 소스코드

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
#include <sybfront.h>
#include <sybdb.h>
#include <dblib.h>

int db_test();

static int syb_msg_handler(DBPROCESS *dbproc,DBINT msgno,int msgstate,int severity,char *msgtext,char *srvname,char *procname,int line)
{
 // ------- msg 출력 routine를 작성한다 -----------
    printf("syb_msg_handler [%s]\n", msgtext);
    return 0;
}                      

static int syb_err_handler(DBPROCESS *dbproc,int severity,int dberr,int oserr,char *dberrstr,char *oserrstr)
{
 //------- err msg 출력 routine를 작성한다 -----------
    printf("syb_err_handler1 [%s]\n", dberrstr);
// return 0;

int main(int argc, char *argv[])
{
    db_test();

    printf("end...\n");
    return 0;
}

int db_test()
{
    printf("FreeTDS(유닉스에서 MS-SQL연결 테스트) ver 0.2. by k0mo\n\n");

    LOGINREC *login; /* login information */
    DBPROCESS *dbproc; 
    DBINT ageint;
 
 // 혹시라도 SYBASE 환경변수를 인식을 못하는 경우가 있다면, 아래와 같이
 // 써주세요.  SYBASE환경변수 인식을 못하면 데이터를 못가져오거나
 // 이상하게 가져오지요. 
 // .bashrc 나 .profile 등에 제대로 설정해놓았으면 문제는 없습니다만..
 
    putenv("SYBASE=/usr/local/freetds");
    putenv("TDSVER=42");
 
 // 한글입력,갱신이 있을 경우는 버전을 4.2로 해주세요.
 // 7.0은 한글처리가 안됩니다.
 // putenv("TDSVER=70");  --> putenv("TDSVER=42"); 
  
    dbinit();    /* db-lib를 초기화한다 */

 // err-msg,msg handler를 등록. common.c 에 있는 함수.
 // 에러메시지 안봐도 알게될 정도가 되면 아래 두 줄 막으시구요.
// dberrhandle( syb_err_handler );
    dbmsghandle( syb_msg_handler );
 
    login = dblogin();               // login record를 가져온다

    DBSETLUSER(login,"degitalcline");       /* login id set            */
    DBSETLPWD(login,"degitalcline");        /* login pass word set     */
 
 // 아래 두줄은 안써도 상관 없음
    DBSETLAPP(login,"APLO_SRV"); //SQL server쪽에 넘겨줄 어플리케이션명 
    DBSETLHOST(login,"CYBER-R"); //SQL server쪽에 넘겨줄 호스트명
 
    dbsetlogintime(10);  // connection timeout
    dbproc = dbopen(login,"AploDBSrv");

    dbsettime(10);   // query timeout

    printf("Connect ok!\n\n");
#if 0
 // INSERT TEST
    dbcmd(dbproc, "insert into Cust_Propos_T_TMP(Cust_Jumin_NO, Cust_Name) values('7205111011233','바보')");
    dbsqlexec(dbproc);
#endif

 // SELECT TEST
 // RETCODE가 0이면 에러
    RETCODE ret = dbcmd(dbproc, "select Cust_ProPos_NO,Cust_Jumin_NO,Cust_Name from Cust_Propos_T_TMP");
    if(ret == 0) printf("error\n");
    ret = dbsqlexec(dbproc);
    if(ret == 0) printf("error\n");

    dbresults(dbproc);

    char no[10], jumin_no[14], name[21];
    int cust_propos_no;

// dbbind(dbproc, 1, INTBIND, 0, (BYTE *)&cust_propos_no);
    dbbind(dbproc, 1, STRINGBIND, 0, (BYTE *)no);
    dbbind(dbproc, 2, STRINGBIND, 0, (BYTE *)jumin_no);
    dbbind(dbproc, 3, STRINGBIND, 0, (BYTE *)name);

    while(dbnextrow(dbproc) != NO_MORE_ROWS) {
        printf("Result : cust_propos_no [%s] jumin_no[%s] name[%s]\n", no, jumin_no, name);
    }

    dbclose(dbproc);
 
    dbexit();
 
    return 0;
}



PHP mssql 익스텐션 컴파일

PHP 설치 때 압축을 해제 하였던 디렉토리로 이동한다.
# cd /usr/local/src/php-5.x.x
# cd ext/mssql
# phpize (configure 파일 생성)
# configure --with-mssql=/usr/local
# make
# cp .libs/mssql.so /(PHP 익스텐션이 들어 있는 디렉토리*)
* PHP 익스텐션 디렉토리는 php.ini 파일내의 extension_dir 에서 지시한 디렉토리이다. 일반적으로 "./" 으로 설정이 되어 있으나 직접 설정을 했을 경우 다른 디렉토리가 설정이 되어 있을 수 있다.

# vi /usr/local/lib/php.ini
* extension=mssql.so 를 추가해준다.
php.ini  파일이 없을 때는 /usr/local/src/(PHP소스디렉토리)/php.ini-dist 파일을 /usr/local/lib 에 복사 해놓으면 된다. 하지만 PHP 컴파일시에 ini 디렉토리를 다른게 설정했다면 그 해당 디렉토리에 복사를 해주면 된다.

# php -m | grep mssql (Apache 를 기동하기 전에 mssql 익스텐션이 올라왔나 확인한다.)
# /etc/init.d/httpd restart 또는 /usr/local/apache/bin/apachectl restart

PHP info 를 확인한다.

위와 같이 MSSQL 익스텐션이 설정이 되어 있다면 정상적으로 연동이 된것이다 .
하지만 freetds 설정을 해야 정상적으로 사용이 가능한데 이 부분은 다음에 다루기로 하겠다.



우분투에서 FreeTDS 를 이용한 MSSQL 연동

1. FreeTDS 설치 (우분투 패키지 이용)

apt-get install freetds-dev

( Tarbular Data Stream Protocol )

2. tdsodbc 설치

apt-get install tdsodbc

3. /etc/freetds/freetds.conf 편집

host = 1.1.1.1

port = 1433

tds version = 8.0

4. /etc/odbcinst.ini 편집

[FreeTDS]

Description  = …

Driver = …

Setup = …

FileUsages = 1

CPTimeout = 5

CPReuse = 5

5. dpkg-dev 및 php5 source 다운로드

apt-get install dpkg-dev ; apt-get source php5

vi ./php5-5.x.x/debian/rules 에 –with-mssql 추가 (common 영역)

6. build dependencies & package

apt-get build-dep php5 ; dpkg-buildpackage

- 한 30분 걸림 (changlog 파일 어쩌구 에러 경로 주의)

7. 패키징 된 PHP 설치

dpkg –i php5_5*.deb

8. libphp5.so 의 아파치 모듈 디렉토리로 복사

cp php5-*/apache2-build/libs/libphp5.so /usr/lib/apache2/modules/libphp5.so

9. apache 재시작


출처 : http://enanim.tistory.com/

728x90

댓글