Monday, January 12, 2009

mssql_bind

안녕하세요..
조금은 허접한 프로그래머 입니다
^_________^;;
저희 서버는 리눅스 서버를 사용하고, PHP Version 4.3.1 를 사용합니다.
솔직히, 리눅스,php 에서 윈2003로 접근하여 mssql 를 사용하는 빌도가 ...
흔한 경우는 아니더군요... 그런데.. 막상 중요한 부분이기도 하고요..
freetds 는 가장 최근 버젼이고요..
(freetds 는 제가 설치 안했습니다. )
막상, freetds 를 설치하고, 다음의 함수 실행을 했습니다.
mssql_fetch_array --> 성공
mssql_fetch_row --> 성공
mssql_query --> 성공
가.. 성공하여 좋아 했으나...

아직 mysql 에서는 없는.. 저장프로시져를 사용해야한다는...
협력 업체의 말에...
이곳 저곳을 뒤지기 시작했습니다.

아래의 함수는... 저장 프로시져를 사용할 수 있겠금.... 해주는 함수입니다.
mssql_init --> php 메세지 --> 없는 함수
mssql_execute --> php 메세지 --> 없는 함수
mssql_bind --> php 메세지 --> 없는 함수
로 나왔습니다.
저는 이상하게 생각했습니다.
freetds 를 설치 하여, 다음의 함수가 정상적으로 쿼리를 날리고 값을 받아왔는데.
mssql_fetch_array,mssql_fetch_row
왜 mssql_init ,mssql_execute,mssql_bind 는 왜 실패하는지...

지금 웹서버가 5대가 존재 하며,
함수 설치를 위하여 php 버젼은 PHP Version 4.3.1 까지 낮쳤습니다.
원래는..PHP Version 4.3.8 를 사용하였었는데.. PHP Version 4.3.1 까지
낮추고 나서야. 해당 함수가 사용 할 수 있겠금 되었습니다.

Ms-sql 의 저장프로시져의 한예를 들면.

CREATE PROCEDURE procGetUserNumber2
@userId as Varchar(32)

, @userNumber as int output
와 같은 내용입니다.
해당 업체 asp 프로그래머 분께서 위와 같은 형식을 전해 주었습니다.
그러무로 procGetUserNumber2 라는 저장 프로시져를 이용하여 쿼리를 날려야 하는 상황..


드디어
mssql_init mssql_execute mssql_bind 를 사용 할 수 있어서..
잘 되겠구나..했는데...
/*
타임 변환 형식 입니다.
$MSSQL_types[127] = SQLINT4; /* bigint*/
##$MSSQL_types[104] = SQLBIT; /* bit*/
##$MSSQL_types[175] = SQLCHAR; /* char*/
##$MSSQL_types[56] = SQLINT2; /* int*/
##$MSSQL_types[52] = SQLINT2; /* smallint*/
##$MSSQL_types[35] = SQLTEXT; /* text*/
##$MSSQL_types[48] = SQLINT1; /* tinyint*/
##$MSSQL_types[167] = SQLVARCHAR; /* varchar*/
##$MSSQL_types[62] = SQLFLT8; /* float*/
##$MSSQL_types[173] = SQLVARCHAR; /* binary*/ // Adaptation
##$MSSQL_types[61] = SQLINT4; /* datetime*/ // Adaptation
##$MSSQL_types[106] = SQLFLT8; /* decimal*/ // Adaptation
##$MSSQL_types[34] = SQLVARCHAR; /* image*/ // Adaptation
##$MSSQL_types[60] = SQLFLT8; /* money*/ // Adaptation
##$MSSQL_types[239] = SQLCHAR; /* nchar*/ // Adaptation
##$MSSQL_types[99] = SQLTEXT; /* ntext*/ // Adaptation
##$MSSQL_types[108] = SQLFLT8; /* numeric*/ // Adaptation
##$MSSQL_types[231] = SQLVARCHAR; /* nvarchar*/ // Adaptation
##$MSSQL_types[59] = SQLFLT8; /* real*/ // Adaptation
##$MSSQL_types[58] = SQLINT4; /* smalldatetime*/ // Adaptation
##$MSSQL_types[122] = SQLFLT8; /* smallmoney*/ // Adaptation
##$MSSQL_types[98] = SQLVARCHAR; /* sql_variant*/ // Adaptation
##$MSSQL_types[189] = SQLINT4; /* timestamp*/ // Adaptation
##$MSSQL_types[165] = SQLVARCHAR; /* varbinary*/ // Adaptation
*/
$stmt=mssql_init("procGetUserNumber2",$MS_CONNECT); // 프로시져 호출
mssql_bind($stmt,"@userId",&$sval,SQLVARCHAR,TRUE); //형식 지정
mssql_bind($stmt,"@userNumber",&$fval,SQLINT2,TRUE);

$result=mssql_execute($stmt);

$arr=mssql_fetch_row($result);
와 ~~ 같은 식으로 진행됩니다..
그러나..mssql_execute 가.. 도통 실행이 되질 않는 것이였습니다..

ㅠ.ㅠ 계속 에러가 났고요..
또, mssql_bind($stmt,"@userId",&$sval,SQLVARCHAR,TRUE); 이 부분에서..
&$sval 가 있는데..
& --> 이거... 더이상 php 에서는 지원을 하지 않습니다..라는 메세지가 나오고..

ㅡ.ㅡㅋ
어떻게 방법이 없더라구요.. 사용예, 문서도 별로 없었구요..

그러는 와중에...
"sybase" 라는 놈을 알게 되었습니다.
원래 sybase 가 Mssql 의 시초(?) 라더군요..자세히는 모르겠어요..
아무튼.. 나름의 해결 방법으로..

$UserCash = "Declare @userId VARCHAR(32) DECLARE @cashBalance INT execute procGetUserCashBalance '$userID',@cashBalance output select @cashBalance as cash";
echo " $UserCash";
$rs = mssql_query($UserCash,$MS_CONNECT);
$arr = mssql_fetch_array($rs);

echo "현재 보유캐쉬는 : $arr[cash]";
를 통하여.. 값을 얻을 수 있었습니다.

아 ~ 엉뚱한 고생을 했다는 생각도 들고.. 3일을 고생했거든요 ㅠ.ㅠ
하지만 주의 할것은 , mssql 은...형식이.. VARCHAR 라면...
procGetUserCashBalance '".$userID."',@cashBalance output select @cashBalance as cash";
와 같이 해야 하고...

형식이... int 면..
procGetUserCashBalance "$userID",@cashBalance output select @cashBalance as cash";
와 같이 해야 합니다..

또 값이 null 이라면...(입력시..)

procGetUserCashBalance null,'"VARCHAR "',인트형식,@cashBalance output select @some cash";

으로 지정하셔야 합니다..


괜히 없는 함수 mssql_execute 를 사용 해볼려고..
헛 고생만 했던 것 같아서요


ㅠ.ㅠ