2020. 5. 26.

[PHP] 8장 DB 접속


PHP 이용한 DB 접속

1.DB 연동 프로그램의 구조

0크 석수 
30L 
30L 구구 
30L 구구 행 
국그 
접수 *로 
보라를 츠동 
. "I—fetch—an-ay 
"i_clo

# 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 접속한다.

01 
01 
Mysa 
sqlplus php/php@oracle 
php". "php•. "oracle"); 
mysgl php —pphp —h localhost 
mysql> use php 
•localhost•. "php•. •php 
php" .$conn);

# 접속 식별자란 놈이 넘어옴
# 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 접속하기

유지 프로세서 
(Sqlplus. 
Apache4PHP) 
오라클 서버 
서버 
세시 
리스니 
말l스W스 
나이B斟이스

# 인스턴트는 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 만든다. 회사에서 넘겨준 규격대로 만든다.


댓글 없음:

댓글 쓰기