세팅 환경
PHP 7.4.3
Linux Ubuntu 20.04 LTS
PHP를 이용해서 MS-SQL에 접속하기 위해서는 아래 2가지 드라이버 중 한 가지 드라이버를 이용해야 합니다.
1. mssql
2. sqlsrv
mssql 드라이버가 먼저 사용되었고, 2008년 이후 sqlsrv 드라이버가 제공되었으며, mssql 드라이버는 커뮤니티 기반으로 만들어진 드라이버이고, sqlsrv(SQL Server Dirver for PHP)는 Microsoft가 공식적으로 지원하는 드라이버입니다.
PHP7.0부터는 아예 mssql_connect() 함수를 제공하지 않기 때문에 sqlsrv를 이용하겠습니다.
기존에 리눅스 서버에서 PHP & MySQL을 사용해서 작업을 했었는데 다른 서버에 있는 MSSQL DB에서 데이터를 조회, 삽입해야 되는 업무가 생겨서 연결 작업을 하게 되었습니다.
A 서버 : Linux Unbuntu 20.04 LTS / PHP 7.4.3 / nginx 서버
B 서버 : Window Server 2012 R2 MSSQL
A서버에서 B서버의 MSSQL로 접속해서 CRUD 작업이 가능하도록 연동하는 것이 목표입니다.
sqlsrv 설치는 아래 링크를 참고해서 진행해주세요
https://like-a-drizzle.tistory.com/143
02. [Linux/Ubuntu] sqlsrv 드라이버 설치 방법
작업환경 Linux Ubuntu 20.04 LTS php 7.4.3 FPM-nginx 이제까지는 php와 mysql 연동으로만 사용했는데 업무관계상 mssql과 연동할 일이 생겨서 불가피하게 sqlsrv를 설치하게 되었습니다. mssql연동은 한 번도 해..
like-a-drizzle.tistory.com
이렇게 세팅하고 나서 아래 PHP 파일을 생성합니다.
포트번호가 디폴트 값이라면 생략해도 됩니다.
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<?php
// hostAddress, port
$serverName = "HostAddress, PortNumber";
$connectionOptions = array(
"database" => "DatabaseName",
"uid" => "UserId",
"pwd" => "Password",
);
// Establishes the connection
$conn = sqlsrv_connect($serverName, $connectionOptions);
if ($conn === false) {
die(formatErrors(sqlsrv_errors()));
}
// Select Query
$tsql = "SELECT @@Version AS SQL_VERSION";
// Executes the query
$stmt = sqlsrv_query($conn, $tsql);
// Error handling
if ($stmt === false) {
die(formatErrors(sqlsrv_errors()));
}
?>
<h1> Results : </h1>
<?php
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
echo $row['SQL_VERSION'] . PHP_EOL;
}
sqlsrv_free_stmt($stmt);
sqlsrv_close($conn);
function formatErrors($errors)
{
// Display errors
echo "Error information: <br/>";
foreach ($errors as $error) {
echo "SQLSTATE: ". $error['SQLSTATE'] . "<br/>";
echo "Code: ". $error['code'] . "<br/>";
echo "Message: ". $error['message'] . "<br/>";
}
}
?>
</body>
</html>
저는 처음에 포트번호를 안 적었다가 아래와 같은 에러가 나왔습니다.
이때만 해도 로그인하는데 시간이 부족해서 타임아웃이 나온 줄 알고 서버 연결 시간을 늘리려고 했는데 검색해보니까 다른 곳에 문제가 있다는 것을 발견했습니다.
SQLSTATE: HYT00
Code: 0
Message: [Microsoft][ODBC Driver 17 for SQL Server]Login timeout expired
SQLSTATE: 08001
Code: 258
Message: [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x102
SQLSTATE: 08001
Code: 258
Message: [Microsoft][ODBC Driver 17 for SQL Server]A network-related or instance-specific error has occurred while establishing a connection to SQL Server. Server is not found or not accessible. Check if instance name is correct and if SQL Server is configured to allow remote connections. For more information see SQL Server Books Online.
포트번호를 지정해주고 나서 다시 해보니 못 보던 에러가 생겼습니다.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : TCP Provider: Error code 0x2746.
Sqlcmd: Error: Microsoft ODBC Driver 17 for SQL Server : Client unable to establish connection.
그래서 또 검색 검색을 하는데 sqlcmd로는 해결할 수 있는 방법을 찾았습니다.
아래 사이트를 참고해서 /etc/ssl/openssl.cnf 파일을 수정했습니다.
https://github.com/mkleehammer/pyodbc/issues/610#issuecomment-686282639
pyodbc.OperationalError: ('08001', '[08001] [Microsoft][ODBC Driver 17 for SQL Server]TCP Provider: Error code 0x2746 (10054) (S
Environment Hi, I am running the following -- Python: 3.6 (64 bit) pyodbc: 4.0.27 OS: Linux (Redhat 7.6) driver: ODBC Driver 17 for SQL Server and am trying to access a SQL SERVER (version 10.0.160...
github.com
아래 댓글을 참고해서 conf파일을 수정했습니다.
$ vi /etc/ssl/openssl.cnf
설정한 뒤 아래 명령어를 입력하면 정상적으로 연결된 것을 확인할 수 있습니다.
$ cd /opt/mssql-tools/bin
$ ./sqlcmd -S hostAdress -U UserId
// 패스워드 입력
> select name from sys.databases
> go
하지만 여전히 PHP파일로는 접속이 안됩니다...
계속 구글을 탐험하다 보니 방법을 발견했습니다.
아래 링크를 참고 문제를 해결했습니다.
How to fix Microsoft ODBC Driver 17 for SQL Server : SSL Provider ssl_choose_client_version:unsupported protocol
I have installed Sql Server 2019 Developer Edition and mssql-tools on my Ubuntu 20.04 minimal. I can connect to my localhost with no issue, but when I want to remote to another sql server: sqlcmd -...
askubuntu.com
openssl을 1.,1.1f 버전을 사용하고 있었는데 openssql을 1.1.1h 버전으로 업데이트하는 것으로 별도의 세팅 없이 php연동이 가능하다고 되어 있어서 openssl 버전을 1.1.1k 버전으로 업데이트했습니다.
업데이트 방법은 아래 링크를 참조해주세요.
https://like-a-drizzle.tistory.com/146?category=875955
03. [Linux/Ubuntu] OpenSSL 업데이트 하는 방법
Linux / Ubuntu 20.04 LTS openssl 1.1.1k 버전으로 업데이트 1. openssl 버전 확인 $ openssl version 2. 다운받을 폴더로 이동 $ cd /usr/local/src/ 3. 외부에서 파일 받기 및 압출 풀기 $ wget https..
like-a-drizzle.tistory.com
마지막으로 fpm, nginx 서버를 재기동했더니 정상적으로 연결되었습니다.
$ sudo service nginx restart
$ sudo service php7.4-fpm restart
아래 문구가 출력되었다면 정상적으로 출력된 것입니다.
'PHP' 카테고리의 다른 글
32. PHP Form 유효성 검사 & input 데이터 가공 처리 (0) | 2021.07.21 |
---|---|
31. PHP & Ajax를 이용한 로그인 코드 예제 (0) | 2021.07.15 |
29. PHP 이미지 파일 용량 줄이기 (0) | 2021.04.22 |
28. PHP Form 검증 (0) | 2021.03.10 |
27. PHP Form 처리 (0) | 2021.03.09 |