- 형식 : Boolean
- 인자 : On/Off
- 설명 : 함수 사용시 변수를 강제 참조하는 것 여부를 설정합니다.
allow_url_fopen :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 외부 사이트의 파일 호출 여부를 설정 합니다.
On 설정시 외부 사이트의 파일을 호출 할 수 있습니다.
외부 파일의 호출은 보안상 문제를 유발 할 수 있으므로 사용에 각별히 유의해야 합니다.
always_populate_raw_post_data :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : On 으로 설정할 경우 항상 $HTTP_RAW_POST_DATA 변수를 선언합니다.
arg_separator.input :
- 형식 : String
- 인자 : Value
- 설명 : PHP가 URL에서 변수를 분리하는데 사용하는 구분자의 목록입니다.
arg_separator.output :
- 형식 : String
- 인자 : Value
- 설명 : PHP가 만들어 내는 URL 인자의 구분자입니다.
asp_tags :
- 형식 : flag
- 인자 : on/off
- 설명 : Asp 와 같이 <% [Code] %>태그의 사용여부를 설정합니다.
auto_append_file :
- 형식 : String
- 인자 : Include_path
- 설명 : 페이지마다 path 의 파일을 자동으로 뒤에 덧 붙여줍니다.
auto_prepend_file :
- 형식 : String
- 인자 : Include_path
- 설명 : 페이지마다 Include_path 의 파일을 자동으로 위에 덧붙여줍니다.
browscap :
- 형식 : String
- 인자 : Path
- 설명 : browscap.ini 파일의 경로를 설정합니다.
default_charset :
- 형식 : String
- 인자 : Charset
- 설명 : 기본 문자셋 을 설정합니다.
default_mimetype :
- 형식 : String
- 인자 : Mimetype
- 설명 : 기본 Mimetype 을 설정합니다. 기본값은 "text/html" 입니다.
disable_classes :
- 형식 : String
- 인자 : Value
- 설명 : 사용을 금지할 클래스를 설정합니다.
disable_fuctions :
- 형식 : String
- 인자 : Value
- 설명 : 사용을 금지할 함수를 설정합니다.
display_errors :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 에러 출력 여부를 설정합니다.
Off 설정시 접속자에게 에러가 발생한 것을 출력하지 않습니다.
display_startup_errors :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : PHP 시작시의 에러 출력 여부를 설정합니다.
doc_root :
- 형식 : String
- 인자 : Paht
- 설명 : PHP의 루트 디렉토리입니다. 비어있지 않은 경우에만 사용합니다.
PHP를 안전모드로 설정 하면 이 디렉토리 밖으 파일은 사용 할 수 없습니다.
IIS를 제외하 모든 웹 서버에서, PHP를 CGI로 사용 하면서 FORCE_REDIRECT를
설정하지 않고 컴파일 했다면, doc_root를 꼭 설정 해야 합니다.
enable_dl :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : dl() 함수를 유효하게 할 것인지를 설정합니다.
error_append_string :
- 형식 : String
- 인자 : Value
- 설명 : 에러 메시지 앞에 출력하는 라인을 설정합니다.
예)error_prepend_string = "<font color=ff0000>"
error_log :
- 형식 : String
- 인자 : Value
- 설명 : 에러 로그를 기록할 파일을 설정합니다.
error_prepend_string :
- 형식 : String
- 인자 : Value
- 설명 : 에러 메시지 뒤에 출력하는 라인을 설정합니다.
예)error_prepend_string = "</font>"
expose_php :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 서버에 PHP 설치 여부의 표출을 설정 합니다..
즉, 웹서버 헤더 사인을 추가합니다.
보안 관련 영항은 없으나, On 설정시 그서버에서 PHP 사용 여부를 확인 할수 있게 합니다.
extension_dir :
- 형식 : String
- 인자 : Paht
- 설명 : 동적 로드 확장을 찾을 디렉토리를 설정 합니다.
file_uploads :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 파일 업로드 허용 여부를 설정합니다.
gpc_order :
- 형식 : String
- 인자 : G, P, C
- 설명 : GET/POST/COOKIE 변수의 파싱 순서를 설정 합니다.
기본값은 "GPC" 입니다.
EX) "GP"로 설정할 경우같은 PHP는 쿠키를 무시하고 같은이름의 POST 방식 변수로 GET방식
변수를 덮어씌울 것입니다.
highlight.bg :
- 형식 : String
- 인자 : Color code
- 설명 : 해당 하이라이트 색상을 설정 합니다.
highlight.comment :
- 형식 : String
- 인자 : Color code
- 설명 : 해당 하이라이트 색상을 설정 합니다.
highlight.default :
- 형식 : String
- 인자 : Color code
- 설명 : 해당 하이라이트 색상을 설정 합니다.
highlight.html :
- 형식 : String
- 인자 : Color code
- 설명 : 해당 하이라이트 색상을 설정 합니다.
highlight.keyword :
- 형식 : String
- 인자 : Color code
- 설명 : 해당 하이라이트 색상을 설정 합니다.
highlight.srting :
- 형식 : String
- 인자 : Color code
- 설명 : 해당 하이라이트 색상을 설정 합니다.
html_errors :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 에러 메시지 중에 HTML 태그 사용 여부를 설정합니다.
implicit_flush :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 기본값으로 Off입니다. On으로 설정하면 PHP가 모든 출력 블럭 뒤에 바로
전송하도록 출력 레이어를 설정합니다.
이는 PHP 함수 flush()를 모든 printf(), echo(), html 블럭뒤에 호출하는 것과 동일합니다.
include_paht :
- 형식 : String
- 인자 : Path
- 설명 : require(). include(),fopen_with_path() 함수가 찾는 디렉토리 목록을 설정합니다.
디렉토리 목록은 유닉스에서는 콜론, 윈도우에서는 세미콜론으로 구분합니다.
log_errors :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 에러 로그의 기록 여부를 설정합니다..
magic_quotes_gpc :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : GPC에 자동변환 적용 여부를 설정합니다.
On으로 설정하면 ',",\,NULL를 붙이는 행위를 자동으로 합니다.
magic_quotes_runtime :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 실시간 자동변환 적용 여부를 설정합니다.
데이터 베이스나 어떤 텍스트등 외부로 부터 오는 데이터에 자동 변환을 실행여부를 설정합니다.
magic_quotes_sybase :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 사이베이스 자동변환 적용 여부를 설정합니다.
max_execution_time :
- 형식 : Integer
- 인자 : Value
- 설명 : 스크립트 최대 실행시간을 초단위로 설정합니다.
max_input_time :
- 형식 : Integer
- 인자 : Value
- 설명 : POST,GET, 파일업로드 등의 입력 데이터를 받아들이는 최대시간을 초단위로 설정합니다.
memory_limit :
- 형식 : Integer
- 인자 : Value
- 설명 : 스크립트가 사용할 수 있는 최대 메무리 양을 바이트 단위로 설정합니다.
open_basedir :
- 형식 : String
- 인자 : Path
- 설명 : 안전모드와 관계없이 PHP가 열수있는 디렉토리를 설정합니다.
output_buffering :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 모든 파일의 출력 버퍼링의 활성화 여부를 설정합니다.
output_handler :
- 형식 : String
- 인자 : Value
- 설명 : 설정시 스크립트의 모든 출력을 특정 함수를 통하여 할 수 있게합니다..
post_max_size :
- 형식 : Integer
- 인자 : Value
- 설명 : POST 데이터가 혀용하는 최대 사이즈를 설정합니다. .
파일 업로드시 이 값이 upload_max_filesize 보다 커야 합니다.
또한, memory_limit는 이 값보다 커야 합니다.
precision :
- 형식 : Integer
- 인자 : Value
- 설명 : 부동 소수에 표시되는 유효 자릿수를 설정 합니다.
register_argc_argv :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : argv와 argc변수 사용 여부를 설정합니다.
register_globals :
- 형식 : flag
- 인자 : On/Off
- 설명 : On으로 설정하면 PHP가 입력으로 받아 들이는 값을 전역 변수로 다루게 됩니다.
(만약 from 에서 password 이름의 어떤 값을 post로 넘겨 받았다고 가정한다면 On
설정의 경우엔 $password 형식의 변수 사용으로 값을 받을 수 있습니다. Off경우엔
$HTTP_POST_VARS[password] 혹은 $_POST[password] 형식으로 변수를 사용하여
값을 받습니다.)
On의 경우 인자 값 변조등 보안의 문제가 발생 할 수 있으므로 각별히 유의하여 설정해야 합니다.
report_memleaks :
- 형식 : flag
- 인자 : On/Off
- 설명 : 메모리 누수여부의 리포트 표출을 설정합니다.
safe_mode :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 안전모드 사용여부를 설정합니다.
safe_mode_exec_dir :
- 형식 : String
- 인자 : Path
- 설명 : 안전모드에서 system() 함수 및 시스템 프로그램을 실행하는 함수의 경로를 설정합니다.
safe_mode_gid :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 파일이 열릴때 비교 검사 수행 방법을 설정합니다.
On 으로 설정하면 GID 비교 검사를 수행합니다.
Off 설정의 경우 UID 비교 검사를 수행합니다.
safe_mode_include_dir :
- 형식 : String
- 인자 : Path
- 설명 : 지정한 디렉토리 및 하위 디렉토리의 파일을 Include 하는경우
UID 및 GID 검사를 수행하지 않습니다.
sendmail_from :
- 형식 : String
- 인자 : Value
- 설명 : 윈도우에서 PHP가 메일을 보낼 때 "From:"에 붙이는 메일 주소를 설정합니다.
sendmail_path :
- 형식 : String
- 인자 : Path
- 설명 : Sendmail 프로그램의 위치를 설정합니다.
Sendmail 을 사용하지 않는 시스템을 이 지시어 메일 시스템이 제공하는 샌드메일
랩퍼/교체자로 설정해야 합니다.
예) qmail 경우 /var/qmail/bin/sendmail 혹은 /var/qmail/bin/qmail-inject로 설정합니다.
short_open_tag :
- 형식 : Boolean
- 인자 : on/off
- 설명 : On 의 경우 <? [php code] ?>형식의 태그 사용을 설정합니다.
Off 로 설정하면<?php [php code ?>의 형식으로 태그를 사용합니다.
XML과 같이 사용할 경우 On 으로 설정 합니다.
SMTP :
- 형식 : String
- 인자 : Value
- 설명 : PHP가 mail() 함수를 사용하여 메일을 보낼때 사용할 SMTP 서버의 주소를 설정합니다.
smtp_port :
- 형식 : Integer
- 인자 : Value
- 설명 : PHP가 mail() 함수를 사용하여 메일을 보낼때 사용할 SMTP 서버의 포트를 설정합니다.
track_errors :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 마지막 에러 혹은 경고 메시지를 $php_errormsg 변수에 저장여부를 설정합니다.
upload_max_filesize :
- 형식 : Integer
- 인자 : Value
- 설명 : 업로드 파일의 최대 크기를 설정합니다.
upload_tmp_dir :
- 형식 : String
- 인자 : Path
- 설명 : 파일 업로드를 위한 임시 저장 디렉토를 설정 합니다.
해당 디렉토리는 PHP가 실행되는 유져가 쓰기 권한을 가져야 합니다.
지정하지 않으면 시스템 기본값을 사용합니다.
user_dir :
- 형식 : String
- 인자 : Path
- 설명 : PHP 파일을 사용하는 유져의 홈 디렉토리를 설정합니다.
variables_order :
- 형식 : String
- 인자 : E, G, P, C, S
- 설명 : 환경변수/GET/POST/COOKIE/SERVER 변수의 파싱 순서를 설정 합니다.
기본값은 "EGPCS" 입니다.
EX) "GP"로 설정할 경우같은 PHP는 환경변수, 쿠키, 서버 변수를 무시하고 GET 변수는
같은이름의 POST 변수에 의해 덮어씌워질 것입니다.
y2k_compliznce :
- 형식 : Boolean
- 인자 : On/Off
- 설명 : 2000년 호환의 여부를 설정합니다.
<참고 URL>
http://www.apmsetup.com/php.php?tutid=102&uid=139#139
http://php.net/manual/kr/ini.core.php
http://www.blueb.net/blog/1414?category=0
http://cafe.naver.com/21citleader.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=101
http://cafe.naver.com/21citleader.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=100
http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10111&docid=392051&qb=cmVnaXN0ZXJfZ2xvYmFscw==&enc=utf8§ion=kin&rank=2&sort=0&spq=0&pid=fXGzSv331yVsssMonFdssv--024334&sid=Su4zVBUT7koAAE57OsQ
http://blog.naver.com/autovan74?Redirect=Log&logNo=100021168844
http://blog.missflash.com/561
http://www.php.net/manual/kr/ini.list.php
http://phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=1452
PHP에서 Oracle 스토어드 프로시저 호출하기
저자
Harry Fuecks
Oracle/PHP 환경에서의 스토어드 프로시저 활용법을 소개합니다.
|
게시일: 2005년 11월
sayHello (name IN VARCHAR2, greeting OUT VARCHAR2)위 프로시저에서, 첫 번째 매개 변수는 호출 시점에 제공되는 입력 값을 저장하는데 사용됩니다. 반면 greeting 매개변수에는 프로시저의 실행이 완료된 후 “반환”되는 값이 저장됩니다.프로그램 구조의 이해PL/SQL 프로그래밍에 대한 자세한 설명은 본 문서의 논의 범주에서 벗어나는 주제입니다. 여기에서 PL/SQL에 대한 세부적인 지식은 필요하지 않습니다. 다만 스토어드 프로시저에서 사용되는 기본적인 인터페이스를 이해하는 것으로 충분합니다.스토어드 프로시저의 가장 앞부분에는 사용되는 매개변수(parameter)가 정의됩니다:
PROCEDURE edit_entry(
status_out OUT NUMBER,
status_msg_out OUT VARCHAR2,
id_inout IN OUT INTEGER,
title_in IN VARCHAR2,
text_out OUT CLOB,
categories_in IN list_of_numbers
);
위 프로시저는 edit_entry. 라는 이름을
가지고 있습니다. 괄호 안에는 프로시저에 전달할 수 있는 매개변수의 목록이 정의되며,
각 매개변수는 쉼표로 구분됩니다. 또 각각의 매개변수에 대해서는 프로시저 내부에서 값을
참조하는데 사용되는 이름 (PHP 스크립트에서 이 이름을 그대로 사용할 필요는 없습니다),
매개변수의 모드(아래 설명 참고), 그리고 매개변수 타입이 정의됩니다.그럼, 가장 먼저 정의된
매개변수를 살펴봅시다:status_out OUT NUMBER,이 매개변수의 내부 이름(internal name)은 status_out, 모드는 OUT, 타입은 네이티브 오라클 데이터 타입인 NUMBER로 정의되어 있습니다.또 id_inout 매개변수가 정의된 부분을 살펴봅시다.
id_inout IN OUT INTEGER,이 매개변수는 IN OUT 모드와 INTEGER 타입으로 정의됩니다.리스트의 마지막 부분에는 categories_in 매개변수가 정의되어 있습니다:
categories_in IN list_of_numbers여기에서는 사용자 정의 타입이 사용되고 있습니다 (사용자 정의 타입에 대해서는 뒷부분에서 자세히 설명합니다).매개변수 모드매개변수의 모드(mode)란 호출 프로그램 및 프로시저 간의 데이터 “흐름”의 방향을 기술하는 용도로 사용됩니다:
- IN—매개변수가 호출 프로그램에 의해 입력됩니다.
- OUT—매개변수의 값이 스토어드 프로시저에 할당되어 호출 프로그램에 반환됩니다.
- IN OUT—매개변수가 “양방향”으로 사용됩니다. 다시 말해, 호출 프로그램이 이 매개변수를 통해 값을 전달할 수도 있고, 스토어드 프로시저가 매개변수의 값을 수정할 수도 있습니다.
<?php // etc. $sql = 'BEGIN sayHello(:name, :message); END;';그런 다음 oci_bind_by_name()를 호출하여 PHP 변수를 매개변수에 바인딩합니다.
sayHello 프로시저가 아래 DDL 구문에 의해 정의되었다고 가정해 봅시다:
CREATE OR REPLACE PROCEDURE
sayHello (name IN VARCHAR2, greeting OUT VARCHAR2)
AS
BEGIN
greeting := 'Hello ' || name;
END;
/
위 구분은 SQL*Plus 커맨드 라인을 통해서도 실행이 가능합니다.
(SAYHELLO.SQL) 파일에 구문을 저장합시다. 그런 다음, SQL*Plus에 로그인합니다:$ sqlplus username@SID그런 다음 START 커맨드를 이용하여 프로시저를 생성합니다:
SQL> START /home/username/SAYHELLO.SQL프로시저를 호출하기 위한 PHP 스크립트가 아래와 같습니다:
<?php
$conn = oci_connect('SCOTT','TIGER') or die;
$sql = 'BEGIN sayHello(:name, :message); END;';
$stmt = oci_parse($conn,$sql);
// Bind the input parameter
oci_bind_by_name($stmt,':name',$name,32);
// Bind the output parameter
oci_bind_by_name($stmt,':message',$message,32);
// Assign a value to the input
$name = 'Harry';
oci_execute($stmt);
// $message is now populated with the output value
print "$message\n";
?>
Blog 패키지의 활용. 스토어드 프로시저의 호출 과정에서 다소 까다로울
수 있는 부분을 처리하기 위해, 여기에서는 blog라는 패키지를 사용하기로
합니다. blog는 블로그 애플리케이션의 게시물을 조회하고 수정하기 위한 API를
제공합니다. 패키지는 네임스페이스 내부의 프로시저, 함수, 데이터를 해당 네임스페이스의 스코프에 인캡슐레이트하고,
글로벌 데이터베이스 네임스페이스의 다른 프로시저로부터 격리하는 역할을 담당합니다. 패키지에서 프로시저를 호출하는
경우, 프로시저명과 패키지명을 구분하기 위해 마침표를 사용합니다.blog 패키지는 다음과 같이
선언됩니다:CREATE OR REPLACE PACKAGE blog AS
TYPE cursorType IS REF CURSOR RETURN blogs%ROWTYPE;
/*
Fetch the latest num_entries_in from the blogs table, populating
entries_cursor_out with the result
*/
PROCEDURE latest(
num_entries_in IN NUMBER,
entries_cursor_out OUT cursorType
);
/*
Edit a blog entry. If id_inout is NULL, results in an INSERT, otherwise
attempts to UPDATE the existing blog entry. status_out will have the value
1 on success, otherwise a negative number on failure with status_msg_out
containing a description
categories_in is a collection where list_of_numbers is described by
TYPE list_of_numbers AS VARRAY(50) OF NUMBER;
*/
PROCEDURE edit_entry(
status_out OUT NUMBER,
status_msg_out OUT VARCHAR2,
id_inout IN OUT INTEGER,
title_in IN VARCHAR2,
text_out OUT CLOB,
categories_in IN list_of_numbers
);
END blog;
/
위 패키지는 두 가지 프로시저를 포함하고 있습니다: blog.latest는 가장 최근의 num_entries 블로그 게시물을 포함하는 결과 커서를 반환합니다. blog.edit_entry는 새로운 블로그 게시물을 INSERT 하거나 기존 블로그 게시물을 수정하는데
사용됩니다. id_inout 매개변수에 값이 입력되는 경우, 프로시저는 해당 id의 블로그
게시물을 수정하려 시도합니다. 그렇지 않은 경우에는 새로운 blog 게시물이 INSERT 되고,
새로운 로우의 프라이머리 키 값이 id_inout 매개변수로 반환됩니다. 이 프로시저는
CLOB 오브젝트의 처리를 지원하며, 이 경우 블로그 게시물의 본문과 카테고리 리스트에
해당하는 컬렉션 오브젝트가 사용됩니다. 위 패키지에서 참조되는 list_of_numbers 컬렉션 타입은
아래와 같이 정의됩니다:CREATE OR REPLACE TYPE list_of_numbers AS VARRAY(50) OF NUMBER;패키지의 본문이 아래와 같습니다. PL/SQL에 대한 깊은 지식이 없는 개발자라도 커멘트를 통해 대략적인 개념을 이해하실 수 있을 것입니다:
CREATE OR REPLACE PACKAGE BODY blog AS
/*------------------------------------------------*/
PROCEDURE latest(
num_entries_in IN NUMBER,
entries_cursor_out OUT cursorType
) AS
BEGIN
OPEN entries_cursor_out FOR
SELECT * FROM blogs WHERE rownum < num_entries_in
ORDER BY date_published DESC;
END latest;
/*------------------------------------------------*/
PROCEDURE edit_entry(
status_out OUT NUMBER,
status_msg_out OUT VARCHAR2,
id_inout IN OUT INTEGER,
title_in IN VARCHAR2,
text_out OUT CLOB,
categories_in IN list_of_numbers
) AS
ENTRY_NOT_FOUND EXCEPTION;
entry_found INTEGER := 0;
BEGIN
/* Default status to success */
status_out := 1;
/* If id_inout has a value then attempt to UPDATE */
IF id_inout IS NOT NULL THEN
/* Check the id exists - raise ENTRY_NOT_FOUND if not */
SELECT COUNT(*) INTO entry_found
FROM blogs b WHERE b.id = id_inout;
IF entry_found != 1 THEN RAISE ENTRY_NOT_FOUND; END IF;
/* Update the blogs table returning the CLOB field */
UPDATE blogs b SET b.title = title_in, b.text = EMPTY_CLOB()
WHERE b.id = id_inout RETURNING b.text INTO text_out;
/* Remove any existing relationships to categories
- new categories inserted below */
DELETE FROM blogs_to_categories WHERE blog_id = id_inout;
status_msg_out := 'Blog entry ' || id_inout || ' updated';
/* id_inout was null so INSERT new record */
ELSE
INSERT INTO blogs b ( b.id, b.title, b.date_published, b.text )
VALUES ( blog_id_seq.nextval, title_in, SYSDATE, EMPTY_CLOB() )
RETURNING b.id, b.text INTO id_inout, text_out;
status_msg_out := 'Blog entry ' || id_inout || ' inserted';
END IF;
/* Now handle assignment to categories.
Loop over the categories_in collection,
inserting the new category assignments */
FOR i IN 1 .. categories_in.count
LOOP
INSERT INTO blogs_to_categories (blog_id,category_id)
VALUES (id_inout,categories_in(i));
END LOOP;
status_msg_out := status_msg_out || ' - added to '
|| categories_in.count || ' categories';
EXCEPTION
/* Catch the exception when id_inout not found */
WHEN ENTRY_NOT_FOUND THEN
status_out := -1001;
status_msg_out := 'No entry found in table blogs with id = '
|| id_inout;
/* Catch any other exceptions raised by Oracle */
WHEN OTHERS THEN
status_out := -1;
status_msg_out := 'Error: ' || TO_CHAR (SQLCODE) || SQLERRM;
END edit_entry;
END blog;
/
프로시저가
사용하는 하부 테이블 구조가 다음과 같습니다:CREATE SEQUENCE blog_id_seq
INCREMENT BY 1;
/
CREATE TABLE blogs (
id NUMBER PRIMARY KEY,
title VARCHAR2(200),
date_published DATE,
text CLOB
);
/
CREATE SEQUENCE category_id_seq
INCREMENT BY 1;
CREATE TABLE categories (
id NUMBER PRIMARY KEY,
name VARCHAR2(30) UNIQUE
);
/
CREATE TABLE blogs_to_categories (
blog_id INTEGER NOT NULL
REFERENCES blogs(id),
category_id INTEGER NOT NULL
REFERENCES categories(id),
PRIMARY KEY (blog_id, category_id)
);
/
스토어드 프로시저와 레퍼런스 커서
blog.latest 프로시저에서, blogs 테이블의 여러 로우를 반복적으로 조회하기 위해 레퍼런스 커서(reference cursor)가 반환됨을 확인할 수 있습니다.
PHP에서 커서를 사용하기 위해서는 SELECT 구문을 통해 로우에 직접 접근하는 경우와 비교했을 때 두 단계의 추가 작업이 필요합니다. 먼저 oci_new_cursor() 함수를 이용하여 PHP에서 커서 리소스를 준비하는 과정이 필요합니다. 이렇게 준비된 커서 리소스는 매개변수를 바인딩하는데 활용됩니다. 두 번째로, SQL 구문을 실행한 다음 커서 리소스에 대해 oci_execute()를 호출해야 합니다.아래 PHP 스크립트에서 절차를 확인할 수 있습니다:<?php
$conn = oci_connect('SCOTT','TIGER') or die;
$sql = 'BEGIN blog.latest(:num_entries, :blog_entries); END;';
$stmt = oci_parse($conn, $sql);
// Bind the input num_entries argument to the $max_entries PHP variable
$max_entries = 5;
oci_bind_by_name($stmt,":num_entries",$max_entries,32);
// Create a new cursor resource
$blog_entries = oci_new_cursor($conn);
// Bind the cursor resource to the Oracle argument
oci_bind_by_name($stmt,":blog_entries",$blog_entries,-1,OCI_B_CURSOR);
// Execute the statement
oci_execute($stmt);
// Execute the cursor
oci_execute($blog_entries);
print "The $max_entries most recent blog entries\n";
// Use OCIFetchinto in the same way as you would with SELECT
while ($entry = oci_fetch_assoc($blog_entries, OCI_RETURN_LOBS )) {
print_r($entry);
}
?>
스토어드
프로시저와 LOB오라클 long 오브젝트를 스토어드 프로시저를 통해 전달하는 방법은 네이티브
SQL의 경우와 크게 다르지 않습니다.아래 예제는 CLOB를 이용하여 blog.edit_entry 프로시저를 호출하는 방법을 보여주고 있습니다. 이 예제에서는 id 매개변수에 값이 할당되지 않았으며, 따라서 새로운 blog 게시물의 INSERT 작업이 수행됩니다:
<?php
$conn = oci_connect('SCOTT','TIGER') or die;
$sql = 'BEGIN blog.edit_entry(:status, :status_msg, :id, :title, :text, :categories); END;';
$stmt = oci_parse($conn,$sql);
$title = 'This is a test entry';
oci_bind_by_name($stmt,":status",$status,32);
oci_bind_by_name($stmt,":status_msg",$status_msg,500);
oci_bind_by_name($stmt,":id",$id,32);
oci_bind_by_name($stmt,":title",$title,200);
// Explained in the next example... (use an empty value for now)
$Categories = oci_new_collection($conn,'LIST_OF_NUMBERS');
oci_bind_by_name($stmt,':categories',$Categories,32,OCI_B_SQLT_NTY);
// Create a new lob descriptor object
$textLob = oci_new_descriptor($conn, OCI_D_LOB);
// Bind it to the parameter
oci_bind_by_name($stmt, ":text", $textLob, -1, OCI_B_CLOB);
// Execute the statement but do not commit
oci_execute($stmt, OCI_DEFAULT);
// The status parameter will be negative if the procedure encountered a problem
if ( !$status ) {
// Rollback the procedure
oci_rollback($conn);
die ("$status_msg\n");
}
// Save the body of the blog entry to the CLOB
if ( !$textLob->save('This is the body of the test entry') ) {
// Rollback the procedure
oci_rollback($conn);
die ("Error saving lob\n");
}
// Everything OK so commit
oci_commit($conn);
print $status_msg."\n";
?>
위
스크립트에서 확인할 수 있는 것처럼, LOB를 사용하는 과정에서 트랜잭션을 어떻게 처리할
것인지의 문제가 중요한 관건이 됩니다. 여기에서는 LOB 업데이트가 두 단계로 진행되는
프로세스임을 감안하여, PHP 스크립트가 모든 트랜잭션 처리를 담당하도록 하였습니다.디폴트 환경에서, 오라클은
주어진 세션에서 동시에 하나의 트랜잭션 실행만을 허용한다는 점을 참고하시기 바랍니다. 따라서
PHP를 통해 프로시저 내부에서 커밋/롤백 구문을 실행하는 경우,oci_commit() 또는 oci_rollback()의
호출이 무시(override)됩니다. 프로시저 정의 부분에 PRAGMA AUTONOMOUS_TRANSACTION을 추가함으로써 “autonomous”
트랜잭션을 사용하고 이러한 디폴트 모드를 해제할 수도 있습니다. 다른 프로시저에서 로깅(logging)
패키지를 호출하는 경우 autonomous 트랜잭션을 사용할 수 잇을 것입니다. 이와 같이
하는 경우 세션 내부에서 실행 중인 트랜잭션의 간섭을 받지 않는 상태에서
스토어드 프로시저에 관련된 정보를 로그에 저장할 수 있습니다.스토어드 프로시저와 컬렉션
컬렉션(collection)은 스토어드 프로시저에 컴플렉스 데이터 타입을 전달하기 위한 메커니즘으로 활용됩니다. 위의
블로그 애플리케이션 예제에서 하나의 블로그 엔트리를 여러 개의 카테고리에 포함시키려면 “blogs”
테이블과 “categories” 테이블 간의 N:N 관계가 필요합니다.오라클의 컬렉션 타입은 데이터베이스에서 글로벌하게
선언되어야 합니다. 이 예제에서는 다음과 같은 정의를 사용하기로 합니다:CREATE OR REPLACE TYPE list_of_numbers AS VARRAY(50) OF NUMBER;위 구문은 blog.edit_entry 프로시저에 컬렉션 인스턴스를 전달함으로써, 하나의 블로그 엔트리를 최대 50 개의 카테고리에 포함시킬 수 있음을 의미합니다.PHP에서는 사전 정의된 OCI-Collection PHP 클래스를 이용하여 컬렉션을 처리합니다. 이 클래스의 인스턴스는 oci_new_collection() 오브젝트가 제공하는 메소드가 다음과 같습니다:
- append: 엘리먼트를 컬렉션 마지막 부분에 추가합니다
- assign: 기존 컬렉션의 엘리먼트를 해당 컬렉션에 추가합니다
- assignElem: 컬렉션에 값을 할당하고, 컬렉션에서의 엘리먼트 위치를 지정하기 위해 인덱스를 정의합니다
- free: 컬렉션 핸들(collection handle)에 설정된 리소스를 해제합니다
- getElem: 컬렉션의 특정 인덱스 위치로부터 엘리먼트를 가져옵니다
- max: 컬렉션의 최대 엘리먼트 수를 반환합니다
- size: 컬렉션의 현재 크기를 반환합니다
- trim: 컬렉션의 마지막 부분에서부터 일정한 수의 엘리먼트를 제거합니다
<?php
$conn = oci_connect('SCOTT','TIGER') or die;
$sql = 'BEGIN blog.edit_entry(:status, :status_msg, :id, :title, :text, :categories); END;';
$stmt = oci_parse($conn, $sql);
$id = 1; // ID of the new entry
$title = 'This is a test entry (v2)';
oci_bind_by_name($stmt,":status",$status,32);
oci_bind_by_name($stmt,":status_msg",$status_msg,500);
oci_bind_by_name($stmt,":id",$id,32);
oci_bind_by_name($stmt,":title",$title,200);
$textLob = oci_new_descriptor($conn, OCI_D_LOB);
oci_bind_by_name($stmt, ":text", $textLob, -1, OCI_B_CLOB);
// Create an OCI-Collection object
$Categories = oci_new_collection($conn,'LIST_OF_NUMBERS');
// Append some category IDs to the collection;
$Categories->append(2);
$Categories->append(4);
$Categories->append(5);
// Bind the collection to the parameter
oci_bind_by_name($stmt,':categories',$Categories,-1,OCI_B_SQLT_NTY);
oci_execute($stmt, OCI_DEFAULT);
if ( !$status ) {
oci_rollback($conn);
die ("$status_msg\n");
}
if ( !$textLob->save('This is the body of the test entry [v2]') ) {
oci_rollback($conn);
die ("Error saving lob\n");
}
oci_commit($conn);
print $status_msg."\n";
?>
결론지금까지 PHP에서 스토어드 프로시저를 호출하는 방법을 예제를 통해 설명하고,
스칼라 데이터 타입만을 이용한 단순한 프로시저와 LOB를 이용하는 보다 복잡한 형태의
프로시저를 사용하는 방법을 알아보았습니다. 또 PL/SQL 인터페이스를 사용하여 스토어드 프로시저를 정의하고,
PHP에서 스토어드 프로시저를 호출한 후 타입 바인딩을 수행하는 방법을 이해하셨으리라 믿습니다.
$S_date = date("Y-m-d");
ex) 2007-09-10
date()함수로 구해진 일자에서 2일을 빼고 싶다면?
$S_date = date("Y-m-d",strtotime(date("Y-m-d")."-2day"));
ex) 2007-09-08
1. 익명 사용자 설정
- 익명(anonymous) 사용자의 로그인을 허용할 것인지의 여부를 설정하는 옵션.
| # Allow anonymous FTP? (Beware - allowed by default if you comment this out). #anonymous_enable=YES anonymous_enable=NO |
2. 파일 전송 로그 설정
- 파일 전송의 결과를 로그로 남길지 결정하는 옵션, (기본 값은 YES)
| # Activate logging of uploads/downloads. xferlog_enable=YES |
3. xferlog(저장 로그) 경로 설정 (기본값은 주석처리)
- 저장되는 로그의 파일명 및 경로를 지정해 준다.
| # You may override where the log file goes if you like. The default is shown # below. xferlog_file=/var/log/vsftpd.log |
4. 로그 포맷 설정
- 로그를 어떤 포맷으로 기록할지 설정. YES= 표준방식(알아보기 힘듬), NO=사용자가 알아보기 쉬운 방식으로 남는다.
- YES : 업로드, 다운로드 로그 남김 (로그인 로그는 /var/log/messages 확인해야함)
- NO : 로그인, 업로드 ,다운로드 로그 남김
xferlog_std_format=NO |
5. 배너 메시지 설정
- 사용자가 FTP 서버로 접속할 때 배너 메시지를 설정. 기본값은 vsftpd의 버전 정보가 출력되기
때문에 아무 정보도 보여주지 않으려면 빈칸으로 남기면 된다.
| # You may fully customise the login banner string: ftpd_banner= |
6. chroot 환경 설정 (* 중요)
- FTP 사용자들이 자신의 홈디렉토리를 최상위 디렉토리(chroot 환경)로 인식하게 되어 홈디렉토리 이외의 상위 디렉토리로 이동하지 못하도록 설정. 기본 값은 NO 이기때문에 반드시 YES로 전환하여
시스템에 아무나 들어와 다운로드나 리스트를 확인 할 수 없게 해야 한다.
|
다음을 추가하면, 모든 사용자는 자신의 홈디렉토리만 접근할 수 있다. chroot_local_user=YES |
html에서 작성한 checkbox element 이름
cd[]
php 에서 받기.
$ArrayCd = isset($_POST['cd']) && $_POST['cd'] ? $_POST['cd'] : false;
foreach($ArrayCd as $filename) {
echo $filename;
}
차암.. 쉽져잉..



