PHP : PDO를 이용해서 MSSQL에 UTF-8로 접속하기

리눅스에서 MSSQL을 접속하기 위해서는 FreeTDS를 사용한다.  PHP에서 PDO를 이용해서 MSSQL로 접속하기 위해서는 이 FreeTDS를 사용하는 PDO_DBLIB를 사용해야 한다.

다음은 PDO를 사용해서 MSSQL 접속하는 예이다.

$dbh = new PDO("dblib:host=sqlserver;dbname=db;","id","passwd");  
$sql = 'UPDATE Category SET Name = N? where CategoryID = ?';
$sth = $dbh->prepare($sql);  
$sth->execute(Array($name, $id));  

만약에 위의 Category 테이블의 Name 컬림이 NVARCHAR 형태라면 다음처럼 수정을 해야 데이타가 제대로 갱신된다.

$dbh = new PDO("dblib:host=sqlserver;dbname=db;charset=UTF-8","id","passwd");  
$sql = 'UPDATE Category SET Name = N? where CategoryID = ?';  
$sth = $dbh->prepare($sql);  
$sth->execute(Array($name, $id));  

ASP : MySQL UTF-8 로 접속하기

ASP가 UTF-8 환경이고 MySQL DB가 UTF-8 일 때 다음의 연결 문자열을 사용해서 처리가 가능하다.

Driver={MySQL ODBC 5.1 driver};Server=localhost;Port=3306;Option=3;Database=db;Uid=id; Pwd=password;charset=utf8

MySQL ODBC 3.51에서는 도저히 방법을 찾지 못했다. 또한 MySQL  ODBC 5.1.10에서는 System 오류(Specified driver could not be loaded due to system error 127)가 발생했고, MySQL ODBC 5.1.4 버전에서는 동작을 했다.

ASP: WinHttp.WinHttpRequest.5.1을 이용해서 https 사이트 접속하기

ASP에서 Client Certificate을 요구하는 https 사이트를 접속하는 방법을 소개하고자 한다.

인증서가 서버에 설치되어 있고, 경로는 LOCAL_MACHINE\My\MyCertificate라고 가정을 하고 다음의 페이지를 만들어서 브라우져로 접속을 해보자.

 
sUrl = "https://svcs.sandbox.paypal.com/AdaptiveAccounts/GetVerifiedStatus"  
sPostData = "test=test"

Set oHTTP = Server.CreateObject("WinHttp.WinHttpRequest.5.1")  
oHTTP.SetClientCertificate("LOCAL_MACHINE\My\MyCertificate")  
oHTTP.open "POST", sUrl, FALSE  
oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"  
oHTTP.send sPostData  
sHtml = oHTTP.ResponseText  
Response.Write sHtml  

위에서 6번째 줄 oHTTP.SetClientCertificate(“LOCAL_MACHINE\My\MyCertificate”) 이 핵심이다.

브라우져 접속시 두가지 오류가 발생할 가능성이 있다.

WinHttp.WinHttpRequest error ‘80072f0c’.

A certificate is required to complete client authentication.

이 오류는 Certificate 경로에 문제가 있는 경우이다. LOCAL_MACHINE\My\MyCertificate을 확인해 봐야 한다.

WinHttp.WinHttpRequest error ‘80072f8f’

A security error occurred.

이 오류는 웹서버(IIS)의 실행 유저(IUSR_MACHINENAME, IWAM_MACHINENAME)가 Certificate의 Private Key을 접근하지 못해서 발생하는 에러이다. 해결 방법은 WinHttpCertCfg.exe를 이용해서 다음의 방법으로 사용자에게 권한을 부여하면 된다.

winhttpcertcfg -g -c LOCAL\_MACHINE\My -s MyCertificate -a IWAM\_TESTMACHINE

부여된 권한을 확인하는 방법은

winhttpcertcfg -g -c LOCAL_MACHINE\My -s MyCertificate -l