728x90
반응형
SMALL

*Youtube Link - https://www.youtube.com/watch?v=P4gwjC0F9OM&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=36

 

PHP와 Oracle의 기본 연동

실습 13-01.php

db_user 이름

db_password 비밀번호

db_sid 오라클 sid 명

db_charset 인코딩, AL32UTF8로 지정을 하면 한글이 잘 안 깨짐

만일 정보가 틀리면

다음과 같이 에러가 발생한다.

오라클 접속이 실패한다.

SQL문을 실행하는 방법

sql developer에서 하던 것을 php파일에서 하려고 한다.

$stat = oci_parse($con, SQL문);

$ret = oci_execute($stat);

statment를 만들고 return값을 받는다.

$ret = oci_execute(oci_parse($con, SQL문); 이렇게 한 줄로 만들어주어도 괜찮다.

실습 13-02.php

SYSTEM 계정에 접속을 해서

sqlDB를 DROP하고 다시 CREATE 하였다.

BEGIN END 프로시저로 묶어주고

EXECUTE IMMEDIATE를 해주었다.

sqlDB가 성공적으로 생성되었다.

$ret 에 true가 나온 것이다.

실습 13.03.php

실습 13.04.php

실습 13.05.php

 

회원 관리 시스템

실습 main.html (회원 관리 시스템 초기 화면)

실습 insert.php

실습 insert_result.php

실습 update.php

GET 방식으로 넘어온 회원의 ID로 

데이터베이스에서 데이터를 가져와서

HTML 태그에 PHP코드를 섞어서

데이터를 뿌려주는 장면이다.

실습 update_result.php

데이터를 수정하기 위해 FORM으로 전송을 하면

데이터를 일련의 방식으로 보내서

이 데이터들을 그대로 변수에 저장하고

이 변수들을 SQL문을 통해서

DB에 INSERT하고 

자원들을 풀어주고

만약 성공했다면 성공했음을 알리고

실패했다면 실패했음을 알리는 문구와

초기화면으로 돌아가도록 HREF 주소를 남겨야 한다.

실습 delete.php

실습 delete_result.php

데이터를 조회하고 

그 결과가 실패하면

실패하였음을 문구로 알리고

초기화면으로 보내는 href 주소를 남긴다.

만일 성공했다면

다음 작업을 진행한다.

작업 진행이 성공하면 성공 페이지로 이동하고, 초기화면으로 돌아갈 수 있는 href 주소를 남긴다.

만일 작업 중 또 다시 데이터 조회가 실패했다면 실패를 알리는 문구와

초기화면으로 돌아갈 수 있는 href 주소를 남긴다.

 

감사합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

*Youtube Link - https://www.youtube.com/watch?v=M74URwbsUAU&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=35

 

서버 스크립트와 클라이언트 스크립트

클라이언트 스크립트: 서버에서 파일을 갖고 있다가 클라이언트에서 필요하면 전송을 해준다. 그러면 클라이언트에서 실행이 된다.

서버 스크립트: 서버에서 작동을 한다. 서버에서 HTML 코드를 만들어 준다. 자바 스크립트 코드로도 만들어질 수도 있다. 그리고 얘를 보내준다. 그래서 클라이언트에서 확인이 불가능하다.

동적으로 실행할 수 있다.

php, jsp, asp.net 등이 서버 스크립트이다.

서버 스크립트는 주로 데이터베이스와 연동되는 것을 주 목적으로 한다.

HTML 태그

*.htm, *.html로 된다.

HTML은 텍스트 파일이다. 그래서 메모장에서 작성하면 된다.

웹 브라우저에서 한글이 깨져 보일 수 있으므로 인코딩 방식은 UTF-8로 저장한다.

HTML은 대소문자를 구분하지 않는다.

HTML 파일은 <HTML>로 시작해서 </HTML>로 끝난다.

HEAD 부분에는 화면에 표시되지 않는 정보 (타이틀, 인코딩 정보 등)

BODY 부분에는 화면에 보이는 본체 (주로 태그들을 표현)

meta 태그는 주로 utf-8로 인코딩하기 위해 사용한다.

PHP 기본 문법

실습 12-01

 

실습 12-02

 

실습 12-03

변수는 앞에 $를 붙여준다.

print는 출력하는 것이다.

echo도 출력하는 것이다.

$변수에 문자열도 넣을 수 있다.

<head><meta content="text/html; charset=utf-8"></head>는 php코드 앞에 써줘서 문자가 한글이 깨지지 않도록 방지한다.

무조건 넣어준다.

실습 12-04

변수에 다양한 타입들을 넣을 수 있다.

"<br>" 을 해서 줄바꿈을 해주었다.

실습 12-05

문자열은 ""로 묶는다.

''로도 묶는다.

큰 따옴표로 먼저 묶고 안에 작은 따옴표로 묶는다.

실습 12-06

실습 12-07

실습 12-08

intval 함수로 실수를 정수로 변환한다.

실습 12-09

 

실습 12-10

 

배열

기존의 그릇을 하나의 종이박스에 담는 것

한줄로 붙인후 박스 전체의 이름을 붙인다.

그리고 첨자를 붙여서 사용한다.

실습 12-12

실습 12-13

 

실습 12-14

range: 초기값부터 나중값까지 정해진 값으로 값을 더해서 입력한다.

shuffle: 섞는다

sort: 오름차순 정렬

rsort: 내림차순 정렬

array_reverse: 배열을 거꾸로

PHP 내장 함수

1000개가 넘는다.

모두 다 외울 수는 없다.

책에서 쓰이거나 자주 쓰이는 것이다.

실습 12-15

오라클 관련 내장함수 oci

HTML과 PHP 관계

회원가입 페이지는 HTML 파일로 만든다.

그리고 전송을 하면

PHP 파일이 열린다.

데이터베이스와 연결되는 각종 코드들을 해 놓으면

여기에 실제 데이터가 오라클 서버에 INSERT 된다.

실습 send.html

데이터를 전송하기 위해서는 FORM 안에 넣어서 전송을 해야 한다.

METHOD는 GET/POST로 하고

ACTION="receive.php" 이면 receive.php 파일이 전송된 데이터를 받아서 데이터베이스와 연동한다.

INPUT TYPE="text" NAME="userID" 를 통해서 userID라는 데이터를 입력받으면 text 데이터로 전송된다.

INPUT TYPE="submit" VALUE="전송" 을 하면 submit으로 폼 데이터를 action에 기록된 파일로 전송한다.

실습 receive.php

send.html에서 전송한 데이터를

receive.php 파일에서 출력한다.

echo를 통해서 전송받은 데이터를 그대로 출력해준다.

GET 방식으로 보냈기 때문에 URL에 전송한 데이터가 쭉 눈에 보인다.

그래서 GET방식으로 보내면 보안은 지키기 어렵다.

안 보이려면 POST 방식으로 해야 한다.

전송 방식을 POST로 변경하였더니 

이번에는 전송한 데이터가 url에 보이지 않는다.

실습 12-18

php 파일에 php 코드가 없어도

html 태그만 있으면

잘 보인다.

실습 12-19

php 코드와 html 태그를 섞은 php 파일이다.

php 코드를 먼저 써도 되고

html 태그 중간에 써도 되고

그래서 섞어서 쓸 수가 있다.

 

감사합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

* Youtube Link - https://www.youtube.com/watch?v=x7NBTq-XNTo&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=34

 

웹  사이트 개발 환경 구축

Apache(웹 서버), Oracle(DB 툴), PHP(프로그래밍 언어) 세 소프트웨어를 통해서 웹 사이트 개발 환경을 구축해보겠다.

Oracle만 64bit를 사용하고 나머지는 32bit를 사용한다.

cafe.naver.com/thisisMySQL 사이트를 참조한다.

서버 충돌을 피하기 위한 비주얼 스튜디오에서 제공하는 IIS Express 제거

1. Apache HTTP Server 2.2 를 C:\Apache2.2\ 경로에 설치한다.

fcgid 설치

네이버 카페에서 fcgid를 설치하고 modules 폴더에 있는 mod_fcgid.pdb 파일과 mod_fcgid.so 파일을

Apache 폴더의 modules 폴더에 복사 붙여넣기 한다.

php 설치

 

php를 설치하고 이름이 길어서 php-5.4로 변경하고 c드라이브 바로 밑에 설치한다.

그리고 php 폴더 안의 php.ini-development 파일을 수정한다.

먼저 이름을 php.ini 파일로 -development를 지운다.

그러면 파일이 톱니바퀴가 있는 파일로 변한다.

date.timezone = Asia/Seoul
extension_dir = C:\php-5.4\ext

파일에 위 두줄의 코드를 추가한다.

그리고 extension=php_oci8_11g.dll ;Use with Oracle 11gR2 Instant Clinet 이렇게

앞의 ;을 지우고 주석을 지운다.

Oracle 11gR2와 php가 연동이 가능하다.

아파치 설정

Apache2.2\conf\httpd.conf 파일에 맨 위에 다음과 같이

LoadModule fcgid_module modules/mod_fcgid.so
FcgidInitialEnv PHPRC "c:/php-5.4"
AddHandler fcgid-script .php
FcgidWrapper "c:/php-5.4/php-cgi.exe" .php

이 코드들을 추가하여

아파치와 php 그리고 오라클 연동이 가능하게 한다.

그리고 Options Indexes FollowSymLinks에 한 칸 띄고 ExecCGI를 추가한다.

오라클 인스턴트 클라이언트 설치

instantclient_11_2.zip 폴더를 압축을 해제한다.

그리고 폴더명을 버전명을 지우고 첫 글자를 대문자로 바꾸어서 Instantclient로 바꾸어서

c드라이브 밑으로 옮긴다.

그리고 윈도우 키를 마우스 우클릭하고 터미널(관리자)를 실행한다.

그리고 다음과 같이 SETX PATH "%PATH%;C:\Instantclient" 를 입력하면

오라클 인스턴트 클라이언트의 경로가 적용된다.

그리고 재부팅을 해주어야 한다.

그리고 웹 서버가 잘 작동하는지 확인해보겠다.

http://localhost/oracle.php 웹 사이트에 접속을 하면

다음과 같은 화면이 열린다.

 

감사합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

* Youtube Link - https://www.youtube.com/watch?v=_X6GOarxaXg&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=33

 

11.3.3 재귀 트리거

실습용 테이블 준비

- (1) 간접 재귀 트리거용 테이블 A,B 생성 및 시퀀스 생성

- 트리거의 단계 숫자가 저장되는 테이블

이렇게 0으로 초기화 시키고, 계속해서 값을 올리는 테이블이다.

- 간접 재귀 트리거 테스트를 위한 트리거 A, B  생성

recuA 테이블에 입력을 하면 트리거가 작동을 해서

recuB 테이블에 입력되도록 한다.

그리고 recuB 테이블에 입력되면

recuA 테이블에 입력되도록 한다.

이렇게 서로를 간접적으로 재귀한다.

- 호출

그리고 recuA에 데이터를 입력하면

서로를 무한히 재귀하여 트리거가 작동하므로 

50번까지 작동을 하고

이후에는 에러가 나서 롤백된다.

- 50번 반복 횟수 제한 트리거

IF문을 주어서 반복횟수가 50회가 넘어가면

자동으로 트리거를 탈출하도록 만들었다.

값들이 정상적으로 들어간다.

11.3.4 순차번호의 자동 입력 트리거

- 테스트 테이블

- 시퀀스 (10000값부터 증가)

- 트리거 생성

BEFORE INSERT: 입력되기 이전에

INSERTING: 입력 중인가

:NEW.seqNum IS NULL : :NEW 테이블에 있는 seqNum이 null인가?

SELECT autoSEQ.NEXTVAL INTO :NEW.seqNum FROM DUAL; 을 통해서 다음 시퀀스 값을 :NEW 테이블에 시퀀스 값으로 넣어준다.

:NEW 테이블에 있는 값은 자동으로 새 테이블에 입력된다.

이렇게 순차적으로 시퀀스값이 자동으로 입력되는 트리거를 만들어보았다.

 

감사합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

* Youtube Link - https://www.youtube.com/watch?v=0KxIvQRPIIs&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=32

 

BEFORE 트리거

INSERT의 값이 테이블에 들어가기 전에 :NEW 임시 테이블에 들어가요

DELETE의 값이 테이블에서 지워지고, :OLD 테이블에 예전 값이 입력된다.

UPDATE의 값이 :NEW 테이블에 들어가고 테이블에 새값이 들어가고 :OLD 테이블에 예전 값이 들어간다.

BEFORE 트리거 UPDATE문 실습

데이터를 삽입하기 전에 :NEW 테이블에 데이터가 저장된다.

그러면 그림처럼 자동으로 새 테이블에 :NEW 테이블에 있는 데이터가 저장된다.

특정 테이블의 열 이름을 트리거로 조정할 수 있다.

이처럼 특정 이벤트가 발생을 할 때 방아쇠 같은 트리거가 발생을 해서

CREATE OF REPLACE TRIGGER trg_columnChange

AFTER UPDATE OF userName ON userTBL FOR EACH ROW

BEGIN RAISE_APPLICATOIN_ERROR(-20888, '이름은 변경이 안됩니다. !!!'); END;

userName 컬럼에 UPDATE문을 날리면 이후에 자동으로 트리거가 실행된다.

그러면 BEGIN END 안의 구문이 실행된다.

RAISE_APPLICATOIN_ERROR(-20888, '이름은 변경이 안됩니다. !!!'); 는

에러를 발생시키는 구문이다.

INSTEAD OF 트리거

배송 조회 뷰 트리거 실습

다음 뷰는 조인을 한 뷰이다.

그래서 INSERT가 어렵다.

하지만 트리거를 통해서 해결이 가능하다.

INSERT INTO userTBL 을 하고

INSERT INTO buyTBL 을 한다.

그러면 뷰 INSERT가 가능하다.

만든 뷰 삭제는 이렇게 가능하다.

뷰는 스키마의 트리거 탭에서 확인이 가능하다.

다중 트리거와 중첩 트리거

다중 트리거란 하나의 테이블에 동일한 트리거가 여러개 부착되어 있는 것

중첩 트리거란 트리거가 또 다른 트리거를 작동시키는 것을 말한다.

구매 테이블 물품 테이블 그리고 배송 테이블을 통해서

구매 테이블에 입력되면 물품 테이블에 개수 감소 시키고, 배송 테이블에 건수 입력 시키는 과정을

빵빵 연쇄적인 트리거로 작동을 시킨다.

그래서 INSERT를 시키면 자동으로 트리거로 인해서

연쇄적으로 연관된 테이블들에 입력되고 수정되고 삭제가 이루어진다.

 

감사합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

* Youtube Link - https://www.youtube.com/watch?v=9Hm7qaN3xhQ&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=31

 

트리거 개념

무결성을 위한 제약조건이다.

방아쇠 역할을 한다.

예를 들어 백업 테이블에 자동으로 입력되도록 하는 것이다.

주로 DML 문에서 사용을 한다.

트리거는 프로시저와 비슷해 보인다.

하지만 트리거는 어떠한 이벤트가 발생을 할 때 실행되는 것이다.

트리거를 생성하였다.

BEGIN END로 묶어서 쿼리를 실행하는 이유는

트리거에서 만든 BEGIN END 구문 안에 있는 DBMS_OUTPUT.PUT_LINE('트리거가 작동했습니다.'); 를 실행하기 위해서다.

실제 트리거가 작동하는 것은 BEGIN END와 상관 없다.

트리거 종류

AFTER 트리거는 작업 후에 작동한다. 뷰에서는 작동하지 않는다.

BEFORE 트리거는 작업 전에 작동한다. 뷰에서는 작동하지 않는다.

INSTEAD OF 트리거는 뷰에서만 작동된다. 주로 뷰에 업데이트가 가능하도록 할 때 사용한다.

실습

변경하기 위한 백업 테이블을 생성하였다.

AFTER 트리거 예제

변경 또는 삭제가 일어나면

OLD 테이블의 내용을 백업 테이블에 삽입한다.

트리거가 생성하는 임시 테이블

:NEW 테이블과 :OLD 테이블은 

트리거가 사용하는 임시 테이블이다.

 

감사합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

*Youtube Link - https://www.youtube.com/watch?v=5b2lOuOnHiI&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=30

 

커서

커서의 선언

패키지

우리는 DBMS_OUTPUT 등의 패키지를 사용해 왔다.

패키지 안에는 여러 프로시저들이 담겨있다.

그래서 SELECT * FROM ALL_PROCEDURES WHERE OBJECT_NAME = 'DBMS_OUTPUT';

을 하면 DBMS_OUTPUT 패키지 안에 있는 프로시저들을 확인할 수 있다.

ALL_OBJECTS 는 모든 오브젝트를 반환한다.

ALL_PROCEDURES 는 해당 이름의 오브젝트의 모든 프로시저들을 반환한다.

ALL_SOURCE는 해당 이름의 패키지의 모든 소스를 반환한다. 쿼리는 주로 암호화되어 있다.

이렇게 wrapped 되어 있다.

패키지 선언

다음과 같이 간단하게 패키지를 만들어보았다.

v_age NUMBER

v_bYear NUMBER 이렇게 변수를 두개를 선언해주고

프로시저와 함수를 선언만 해주고

패키지 생성 구문을 완료한다.

그리고 패키지 바디 부분에 다음과 같이 파라미터와 함께 

프로시저와 함수를 정의해준다.

프로시저에 패키지 내부에 있는 함수를 사용할 수 있다.

그리고 전달 받은 파라미터를 가공해서 변수에 저장한 다음

그 변수를 반환하여 준다.

 

감사합니다.

728x90
반응형
LIST
728x90
반응형
SMALL

* Youtube Link - https://www.youtube.com/watch?v=TVscLvy4d_A&list=PLVsNizTWUw7FzFgU1qe-n7_M7eMFA9d-f&index=29

 

10.2 함수

실습

- 함수의 쓰임새

파라미터 타입과 반환할 타입을 정한다.

VAR retValue NUMBER; 변수를 선언한다.

EXECUTE :retValue = := getAgeFunc(1979); 함수를 실행하고 결괏값을 변수에 저장한다.

PRINT retValue; 그리고 출력한다.

그러나 보통 이렇게 사용은 잘 하지 않는다.

행으로 결괏값을 이렇게 출력할 수 있다.

기존의 테이블의 값을 SELECT해서 

getAgeFunc(birthYear) 생년월일을 조회해서 

현재의 나이값을 조회한다.

이름이면 blind 처리 (예: 이00)

전화번호이면 blind 처리한다. (010-1234-xxxx)

테이블 반환 함수

CREATE OR REPLACE TYPE tableType AS TABLE OF tableRowType; 명령어로 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형
LIST

+ Recent posts