본문 바로가기
프로그래밍/PHP

PHP 7 에서 Oracle 연결하기

by pentode 2018. 4. 2.

PHP에서 Oracle 사용할 수 있도록 연결 작업을 해봅니다. PHP의 설치는 "Windows용 XAMPP 설치하기 - (Apache, PHP, MariaDB)" 를 참조 합니다. 그때 설치된 PHP 버전은 7.0.13 입니다. XAMPP 로 설치가 되었고, win32 입니다. 테스트 환경도 이때 생성한 프로젝트를 사용하겠습니다.

 

현재 운영체제는 Window 10 x64 이고,  Oracle 은 Express Edition 11g r2 입니다. 이 같은 환경에서 PHP와 Oracle 의 연동을 위해서는 한가지가 더 필요합니다. 바로 Oracle instant client 입니다. php가 win32 이니 instant client도 win32, 11g용을 받아서 설치하겠습니다.

 

 

1. Oracle Instant client win32를 받아서 설치합니다. 

 

http://www.oracle.com/technetwork/topics/winsoft-085727.html 에서 받을 수 있고, 역시 OTN 에 가입을 해야 다운로드가 가능합니다. 받을 파일은 instantclient-basic-nt-11.2.0.4.0.zip 입니다.

 

오라클 instant 클라이언트 다운로드 페이지

 

 

2. 받은 파일의 압축을 풀어서 적당한곳에 복사하면 됩니다. 

 

C:\util\instantclient_11_2 에 복사하겠습니다. 설치한 위치를  PATH 에 등록해야 합니다. ORACLE_HOME 환경변수를 등록하지 않아도 됩니다.

 

Windows 10 에서는 환경변수 입력하기가 더 쉬워 졌습니다. 하나씩 등록 가능합니다. 전에는 세미콜론( ; ) 으로 분리된 한줄된 문자열을 편집해야 했었습니다.  수정한 환경 변수가 적용이 되려면 변경 이전에 띄워 뒀던 cmd, eclipse 등은 닫고 다시 실행해야 됩니다.

 

환경변수 PATH에 추가

 

 

3. 웹서버는 PHP 내장 웹서버를 사용해서 테스트 해보겠습니다.

 

PHP 내장 웹서버는 PHP 5.4 이상 부터 사용 가능합니다. PHP 설정 파일도 내장 웹서버를 실행할때 별도로 지정해서 실행할 수 있습니다.

 

PHP가 설치된곳 (C:\util\xampp\php) 에서  php.ini 파일을 복사해서 프로젝트 아래의  public 폴더에 둡니다. start.cmd 파일의 내용을 수정합니다.

 

C:\util\xampp\php\php -S localhost:8080 ^
-t C:\workspace\workspace_neon\PDT_Test\application ^
-c C:\workspace\workspace_neon\PDT_Test\public\php.ini

 

라인 끝의 ^ 는 실행시 이어진다는 표시 입니다. -t 는 웹루트의 위치이고, -c 는 php.ini 설정 파일의 위치를 지정합니다.

 

이제 내장웹서버를 실행하기 위해서 cmd 를 실행할 필요 없이 start.cmd 를 더블 클릭하기만 하면 됩니다. 혹시 실행이 안되고 에디터가 열리면 파일에 마우스 오른쪽 키를 누르고, Open With 에서 Default Editor 를 선택하면 실행이 될것 입니다. 편집하기 위해서는 Text Editor 를 선택하면 됩니다.

 

내장웹서버 실행 CMD 작성

 

 

4. php.ini 파일을 수정합니다. 

 

확장 부분에 extension=php_pdo_oci.dll 부분에 앞의 ; 을 삭제하여 활성화 합니다. oracle driver 로 PDO(PHP Data Object) 를 사용합니다. 기존에 많이 사용되는 mysql_ 로 시작하는 API 는 더 이상 사용하지 않습니다. PDO 외에는 mysqli 를 사용할 수 있습니다.

 

PDO는 에러를 PDOException 형식으로 발생하도록 설정할 수 있기 때문에, try { } catch( ) { } 구문을 사용하여 예외처리가 가능하고, Prepared Statement 를 지원합니다. 또한 서로 다른 종류의 데이터베이스에 액세스 하는데 동일한 API 를 사용할 수 있습니다.

 

php.ini 파일 수정

 

 

5. 샘플페이지를 작성해서 테스트 해봅니다. (oracle.php 파일 입니다.)

<?php
$tns = "
(DESCRIPTION =
	(ADDRESS_LIST =
		(ADDRESS = (PROTOCOL = TCP)(HOST = 127.0.0.1)(PORT = 1521))
	)
	(CONNECT_DATA =
		(SERVICE_NAME = xe)
	)
)
";

try {
	$conn = new PDO("oci:dbname=".$tns.";charset=utf8", "xeuser", "xeuser");
} catch (PDOException $e) {
	echo "Failed to obtain database handle " . $e->getMessage();
}
?>
<!DOCTYPE html>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
	<title>PDT Test</title>
</head>
<body>
	<table border="1">
	<thead>
		<tr>
			<th>번호</th>
			<th>이름</th>
			<th>제목</th>
			<th>조회</th>
			<th>작성일</th>
		</tr>
	</thead>
	<tbody>
<?php
$stmt = $conn->prepare("SELECT NUM, NAME, TITLE, CONTENT, READ_COUNT, WRITE_DATE FROM TB_BOARD");
$stmt->execute();
while($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
?>
		<tr>
			<td><?= $row['NUM'] ?></td>
			<td><?= $row['NAME'] ?></td>
			<td><?= $row['TITLE'] ?></td>
			<td><?= $row['READ_COUNT'] ?></td>
			<td><?= $row['WRITE_DATE'] ?></td>
			</tr>
<?php } ?>
	</tbody>
	</table>
</body>
</html>

 

6. 실행 결과 입니다.

 

실행 화면

 

PHP 7과  Oracle 연동을 해보았습니다. MySQL 연동은 대부분 간단히 되는데 비해서 Oracle 연동은 잘 되지 않는 경우가 많습니다. 그런경우 플랫폼을 동일한 Win32 또는 x64 로 해주고, Path 에 추가만 해주면 거의 잘 되었던것 같습니다.

 

반응형