PHP를 이용한 DB 접속
1.DB 연동 프로그램의 구조
# oci_connect에 계정이나 비밀번호를 입력해서 연동한다.
# TCP만 지원하기 때문에
# 오라클의 사용자와 mysql_select_db가 같다. 테이블의 사용자 소유 개념
# mysql_fetch_row, fetch_row는 행단위로 1차원으로 옮긴다.
# 유일하게 오라클만 oci_fetch_all 2차원배열에 패치함 메모리를 무지막지하게 많이 사용하지만 데이터핸들링 하기 쉽다.
# 일반 업무용 프로그램은 데이터를 거지같이 짜도 잘돌아간다.
# 하지만 연말, 월말 떄 제대로 안해놓으면 안돌아간다.
step 1 DB 접속
RDMBS를 이용하기 위해서는 일단 DB에 접속해야 한다. 사용자가 mysql이나 sqlplus와 같은 클라이언트 프로그램으로 DB에 접속하는 것과 같이 PHP는 mysql_connect나 oci_connect 등의 함수를 이용 DB에 접속한다.
# 접속 식별자란 놈이 넘어옴
# php 만 그런게 아니라 내부리소스타입은 내용을 볼 수 없다.
# mysql -pphp 비밀번호 들어가는 란
step 2. sql문 생성
사용하고자 하는 sql문을 생성한다. 이 단계에서 생성된 sql문이 select문인 경우와
그렇지 않은 DML이나 DLL등의 문장인 경우 이후 실행과정이 달라진다.
# revoke, alter 등은 실행되지 않는다. 설계할떄 하는것이기에 프로그래머는 쓰면안된다.
# 프로그래머는 select insert update delete 만 사용
step 3. sql 구문 파싱과 실행
rdbms가 sql문장을 실행하기 위해서는 sql문장을 어떻게 실행할지 판단할 파싱과정을 거친다. 이 과정을 통해 EDMBS는 최적의 실행 방법을 찾아내고 sql문을 찾아낸 실행 방법에 따라 실행한다.
예를 들어 select * from student where sname='장비'와 같은 문장을 실행할 때 sname 컬럼에 인덱스가 있다면 student 테이블 전체를 읽는 것 보다는 인덱스를 통해 sname이 장비인 행만을 읽는 것이 효과적일 것이다. 이렇게 가장 비용이 적게 드는 실행방법을 찾아내고 이에 따라 sql문을 실행 하는 과정이 바로 sql 구문 파싱과 실행 과정이다. 오라클은 이 과정에서 시스템의 리소스를 절약하기 위해 정적인 sql구문을 선호한다. 그러나 이를 위해서는 바인드 변수처리를 필요로 하는데 이를 위해 oci_bind_byname() 함수를 제공한다
step 4. 결과 배치
sql문장이 select문 이라면 sql문을 실행한 이후 검색된 결과가 리소스 형태로 변수에 전달된다. 리소스 타의 변수는 직접 화면에 출력하는 것이 불가능하므로 검색된 결과를 출력하기 위해 리소스 형태의 정보를 변수로 옮기는 과정을 수행해야 하는데, 이 과정을 패치 과정이라 한다.
select문이 아니라 DML이나 DDL문장이라면 검색된 결과가 존재하지 않으므로 정상 수행 여부만을 판단하고 패치는 수행하지 않는다.
# php가 오라클에 연동했을때만 2차원 패치가 가능함
# 할수 있는데 프로그래머가 데이터베이스를 너무 안좋게 사용할까봐 안쓰는거
step 5. 접속 종료
프로그램이 모두 실행되었음으로 접속을 종료하고 프로그램을 끝나는 과정이다. 많은 수의 프로그램이 종료될 때 DB로의 접속이 자동으로 해제됨으로 명시적인 접속 종료를 쓰지 않는 경우가 많은데, 이런 경우 상당량의 리소스가 뒤늦게 반환되는 문제가 발생한다. 반드시 저장영역을 해제하고 접속을 명시적으로 종료한다.
2.오라클 접속 환경과 PHP 접속하기
# 인스턴트는 sg 와 백그라운드프로그램으로 구성되어있다.
# 서버프로세스는 네트워크으로부터 프로세서가 접속했는지 확인하는 리스닝 기능이 없다. 어떤 프로토콜을 사용할지 모르기 떄문이다.
# 나중에는 서버프로세스는 리스너랑 통신한다.
오라클 접속을 위해 식별해야 될 내용은 다음과 같다.
- 오라클 서버의 IP와 사용 포트 번호
- 오라클 SID명
- 오라클 서버의 접속 시별자
- 접속 계정과 암호
# 계정마다 다른 인스턴트를 제공
|
항목
|
설정값
|
|
IP
|
192.168.10.39 (apom.itclass.co.kr)
|
|
port
|
1521
|
|
sid
|
DB12
|
|
TNS 명
|
oracle
|
|
계정/패스워드
|
php/php
|
# 보통 세션모드도 안준다. 관리자모드로 접속할 일이 없다.
oci_connect() 함수를 이용한 오라클 접속
resource
oci_connect( string $username, string $password [, string $connection_string
[,string $character_set [, int $session_mode ]]] )
|
매개변수
|
의미
|
|
$username
|
접속계정
|
|
$password
|
패스워드
|
|
$connection_string
|
오라클 네트워크 식별자
|
|
$character_set
|
접속 문자 코드
기본값은 NLS_LANG에 정의한 값이다.
|
|
$session_mode
|
접속 권한을 지정한다.
|
접속 식별자등의 내용을 tnsnames.ora 파일에 저장해둔 경우에 다음과 같이 tns명을 이용해서 접속 프로그램을 작성할 수 있다.
$user_name =
"php";
$password =
"php";
$server =
"oracle";
$conn=oci_connect($user_name,
$password, $server);
tnsnames.ora 파일을 사용할 수 없는 경우에 아래와 같이 접속 정보를 직접하는 방법이 있다. 특히 접속에 장애가 많이 발생하는 경우 장애 테스트 때마다 tnsnames.ora 파일을 편집하는 것보다는 소스내에 직접 네트워크 정보를 제공하면 문제를 파악하기 쉽다.
$server =
"oracle";
$user_name
= "php";
$server
= "(DESCRIPTION=(ADDRESS = (PROTOCOL = tcp)(HOST = 192.168.10.155)(port =
1521))(CONNECT_DATA = (SID = DB12)))";
$conn=@oci_connect($user_name, $password, $server);
# 관리자가 tnsnames.ora 파일 못쓰게하면 php에 직접 박아버리면 된다. 좋은 방법은 아니다
<?
$server = "oracle";
$user_name = "php";
$password = "php";
$conn=@oci_connect($user_name, $password, $server) or die('Could not
connetc:');
echo("Oracle 12c \$conn : $conn<br>");
$st=oci_server_version($conn);
echo("$st<br>");
show_source(__FILE__);
?>
# 오라클에 계정과 패스워드를 php로 만든다. 회사에서 넘겨준 규격대로 만든다.
댓글 없음:
댓글 쓰기