PHP 를 이용한 Oracle DB 접속과 활용 |
개발환경 : PHP 5.2, window 7 32bit, Oracle 11g, |
web application 은 DB 와 뗄수 없는 관계이다. 보통 PHP 는 MySQL 과
자주 사용된다. Oracle 과 관련된 내용이 별로 없는 것 같아 정리해본다.
PHP 에서 RDBMS 를 이용하는 방법은 종류가 틀려도 동일한 과정을
거치기 때문에 같은 기능을 하는 함수명을 찾아 끼워넣어 사용하기만 하면 된다.
그 비슷한 과정이란 것이 아래 그림과 같다.
그리고 그 기능을 하는 API 함수가 아래에 나와 있다. 아래로 내려 가며 순서대로
이루어진다
1. 각각의 기능에 대한 설명 |
(1) DB 접속
오라클에서 접속에 필요한 정보는 3가지이다. 아이디, 패스워드, 서비스명 이다.
oci_connect 에서 넘기는 인자값도 3가지면 된다.
$connection = oci_connect(“gon”, “1111”, “ora11”);
(2) SQL 구문 파싱
이부분에서 오라클의 특징을 알수 있는데 수행 비용을 적게 들이기 위한
과정이 포함된다. 수행비용이란 최적의 실행방법을 찾아내어 실행한다는 말이다.
조회일 경우에 필드중 인덱스가 있다면 그 것을 찾아 실행하는 것이다.
구문은 간단하다. 파라미터로 접속정보와 수행할 쿼리를 넘기면 된다.
$result = oci_parse($connection, $sql)
(3) SQL 실행
실행전에 넘겨야 할 변수가 있다면 oci_bind_by_name 로 각 변수에
값을 연결해서 넘긴다. 첫번째 파라미터는 oci_parse 를 통해 리턴받은
값을 넘기면 된다. 두번째는 쿼리에서 bind 할 변수와 세번째는 그
바인드 변수에 넘길 값을 셋팅하면 된다
oci_bind_by_name($result, “:v_sno”, $sno);
바인드 할것이 없다면 바로 SQL 을 실행하면 된다. 그리고 리소스를 리턴받아
사용해야 되는 경우에는 oci_execute 의 리턴값을 받으면 된다.
$return = oci_execute($result);
(4) 결과 패치
조회성 쿼리는 oci_execute 를 수행한후에 그 결과값을 배열에 패치시켜야한다
두가지 함수를 제공하는데 1차원 배열로 값을 전달하는 oci_fetch_array 와
2차원 배열로 값을 전달하는 oci_fetch_all 이 있다.
1차원 배열인 oci_fetch_array 는 첫번째 배열값이 키이다.
2차원 배열인 oci_fetch_all 은 첫번째 배열값이 키이고 두번째가 행의 번호가 된다.
while($row = oci_fetch_array($result, OCI_ASSOC)){
$sno = $row[SNO];
}
for ($i = 0; $i<$row_num; $i++){
$sno = $row[SNO][$i];
}
oci_fetch_all 는 한번의 패치로 리소스 전체를 가져오기 때문에
속도는 빠를지 모르나 메모리를 많이 사용하는 단점이 있다.
(5) SQL 종료
oci_execute 함수 실행후 결과값으로 리턴받은 리소스가 점유한 메모리를 반환한다.
완전한 반환을 위해 명시적으로 적어주는 것이 좋다.
메모리를 반환했으면 마지막으로 오라클을 종료한다.
oci_free_statement ($result);
oci_close ($connection)
2. 다양한 기능에 대한 처리 예제 |
프로그램을 짜게 되면 기능은 핵심적인 몇 개만 알면 된다.
입력, 조회, 수정, 삭제가 그것이다. 이 네 가지 기능에 대한
소스만 정리하면 나머지는 응용이 되는 것이다.
Orcale 과 연결해서 쿼리를 처리하는 관점에서만 보면 크게
두가지로 압출할수 있다. 조회와 입력/수정/삭제 가 그것이다.
조회 외에는 Orale 에 수행 명령을 내리고 간단하게 성공여부만
알아오는 것이기 때문에 쿼리만 틀릴뿐 소스는 같다.
(1) 조회 기능
쿼리 수행후 리턴받은 데이터를 패치할 때 반환된 배열의 형식 옵션
두가지가 있다. OCI_ASSOC 와 OCI_NUM 인데
OCI_NUM 은 스칼라 배열만 생성하고 OCI_ASSOC 는 연관배열만 생성한다.
예를 들자면 OCI_NUM 은 $row[0], $row[1] … 배열의 요소값으로 하고
OCI_ASSOC 는 $row[SNO], $row[SNAME] … 쿼리필드 값을 key 로
사용해서 값을 엑세스 한다.
$connection = oci_connect($username, $password, $server); // 출력 $query = "SELECT * FROM STUDENT"; $result = oci_parse($connection, $query); $success = oci_execute($result); // OCI_NUM while ($row = oci_fetch_array($result, OCI_ASSOC)) { $row[SNO]; $row[SNAME]; } oci_free_statement($result); oci_close($connection);
(2) 입력/수정/삭제 기능
수정, 삭제도 쿼리만 틀리고 사용순서와 함수들은 아래와 같이 사용하면 된다.
// 입력예제 $sno = $_POST["sno"]; $query = "insert into student (sno) value (:v_sno)"; $result = oci_parse($connection, $query); oci_bind_by_name($result, ":v_sno", $sno); $success = oci_execute($result); oci_free_statement($result); oci_close($connection);
'기타 언어 > PHP' 카테고리의 다른 글
AutoSet 매니저 “MySQL 서버가 NT 서비스에 등록되어 있지 않습니다. “ 에러 해결 (0) | 2018.06.06 |
---|---|
윈도우 아파치 Apache 웹 서버 설치해서 실행하는 방법 (0) | 2018.01.07 |
[PHP] 개발을 위한 이클립스 통합개발환경(IDE) 꾸미지 (0) | 2014.10.09 |
PHP 콘솔창에 FirePHP 를 이용한 디버깅 (0) | 2014.01.20 |
xDebug 설치로 PHP 디버깅 하기 (9) | 2012.12.03 |
XE 에서 PHP 로그 내용을 출력하기 위한 FirePHP, FireBug 와 연동하여 출력하기 (0) | 2012.11.08 |
PHP 에서 메타 문자를 이용해 정규표현식 구현하기 (0) | 2012.10.13 |
APMSETUP 에서 MySql DB 접속후 테이블 만들기 (1) | 2012.10.10 |