PHP & Others

오라클 클래스

페이지 정보

본문

class ora9 {
        var $ORA_USER;                                        //오라클 사용자
        var $ORA_PASSWD;                                //오라클 암호
        var $ORA_DNS;                                                //오라클 DNS
        var $db;                                                                //db접속
        var $autocommit = true;                //자동커밋
        var $debug=false;                                        //디버그모드

        function ora9($user='기본아이디', $passwd='기본암호', $dns='기본DNS') {        //오라클 접속정보 초기화
                $this->ORA_USER=$user;
                $this->ORA_PASSWD=$passwd;
                $this->ORA_DNS=$dns;
        }

        function con() {        //오라클 접속
                $this->db= OCILogon($this->ORA_USER,$this->ORA_PASSWD,$this->ORA_DNS) or die("DB Connect Error");
        }

        function discon() {        //오라클 접속 해제
                return @OCILogoff($this->db);
        }

        function error($mes) {        //에러메세지 출력
                $this->discon();
                echo "<script language=JavaScript>
        alert(\\"$mes\\");
        </script>";
                exit;
        }

        function autocommit($autocommit = false) {
                $this->autocommit=$autocommit;
        }

        function set_str($str) {        //값이 문자열경우 '' 붙여줌
                $chk="sysdate|nextval|curval|null";        //무시할 문자열

                if(!preg_match("/$chk/i", $str)) {
                        $var=intval($str);
                        $ok=("$str"=="$var");
                        if(!$ok ){
                                $str="'".$str."'";
                        }
                }
                return $str;
        }
//######################################################퀴리 날리기
        function query($query) {        //일반 퀴리
                if($this->debug) echo $query;

                $stmt = @OCIParse($this->db, $query);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
            $err=@OCIExecute($stmt);
                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                if(@OCIFetchinto($stmt, &$value, OCI_ASSOC)) {
                        @OCIFreeStatement($stmt);
                        return $value;                                //배열형태로 전송
                } else {
                        @OCIFreeStatement($stmt);
                        return false;
                }
        }

        function querys($query) {        //여러개의 결과용 퀴리
                if($this->debug) echo $query;

                $stmt = @OCIParse($this->db, $query);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
            $err=OCIExecute($stmt);
                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                while (OciFetchinto($stmt,&$row,OCI_ASSOC)) {
                        $value[]=$row;

                }

                @OCIFreeStatement($stmt);
                return $value;                                //배열형태로 전송
        }

        function queryone($query) {        //한개의 값만 출력
                if($this->debug) echo $query;

                $stmt = @OCIParse($this->db, $query);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
            $err=@OCIExecute($stmt);
                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                if(@OciFetchinto($stmt,&$value,OCI_NUM )) {
                        @OCIFreeStatement($stmt);
                        return $value[0];
                } else {
                        @OCIFreeStatement($stmt);
                        return false;
                }
        }

//################################################################        insert 용 퀴리
        function squery($query) {        //insert & update & delete 용 퀴리
                if($this->debug) echo $query;

                $stmt = @OCIParse($this->db, $query);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }

            if($this->autocommit) {
                        $err=@OCIExecute($stmt);
                } else {
                    $err=@OCIExecute($stmt, OCI_DEFAULT);
                }

                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                $count=@OCIRowCount($stmt);
                @OCIFreeStatement($stmt);
                return $count;
        }

        function squery_inarr($dbname, $query_arr) {        //배열형태로 인설트
                $arr_total=count($query_arr);        //전체 배열수
                foreach($query_arr as $key=>$val) {
                        $set.=$key;
                        $input.=$this->set_str($val);

                        $arr_total--;
                        if($arr_total > 0) {
                                $set.=", ";
                                $input.=", ";
                        }
                }
               
                $sql="insert into $dbname($set) values($input)";        //sql문 생성
                if($this->debug) echo $sql;
                $stmt = @OCIParse($this->db, $sql);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
           
            if($this->autocommit) {
                        $err=@OCIExecute($stmt);
                } else {
                    $err=@OCIExecute($stmt, OCI_DEFAULT);
                }

                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                @OCIFreeStatement($stmt);
        }

        function squery_uparr($dbname, $query_arr, $where) {        //배열형태로 업데이트
                $arr_total=count($query_arr);        //전체 배열수
                foreach($query_arr as $key=>$val) {
                        $query .= $key ."=".$this->set_str($val);

                        $arr_total--;
                        if($arr_total > 0) {
                                $query.=", ";
                        }
                }
               
                $sql="update $dbname set $query $where";        //sql문 생성
                if($this->debug) echo $sql;
                $stmt = @OCIParse($this->db, $sql);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
           
            if($this->autocommit) {
                        $err=@OCIExecute($stmt);
                } else {
                    $err=@OCIExecute($stmt, OCI_DEFAULT);
                }

                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                $count=@OCIRowCount($stmt);
                @OCIFreeStatement($stmt);
                return $count;
        }



        function squery_inclob($dbname, $query_arr, $lobname, $lobdata) {        //clob형식 입력 퀴리(배열형)
                $arr_total=count($query_arr);        //전체 배열수
                foreach($query_arr as $key=>$val) {
                        $set.=$key;
                        $input.=$this->set_str($val);

                        $arr_total--;
                        if($arr_total > 0) {
                                $set.=", ";
                                $input.=", ";
                        }
                }
               
                $sql="insert into $dbname($set, $lobname) values($input, empty_clob()) returning $lobname into :CONTB";        //sql문 생성
                if($this->debug) echo $sql;

                $clob = OCINewDescriptor($this->db, OCI_D_LOB);
                $stmt = @OCIParse($this->db, $sql);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }

                OCIBindByName ($stmt, ":CONTB", &$clob, -1, OCI_B_CLOB);
            $err=@OCIExecute($stmt, OCI_DEFAULT);
                $clob->save($lobdata);
                $this->commit();
       
                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                @OCIFreeDesc($clob);
                @OCIFreeStatement($stmt);
        }

        //CLOB 형식 업데이트용
        function squery_upclob($dbname, $query_arr, $lobname, $lobdata, $where) {
                $arr_total=count($query_arr);        //전체 배열수
                foreach($query_arr as $key=>$val) {
                        $query .= $key ."=".$this->set_str($val);

                        $arr_total--;
                        if($arr_total > 0) {
                                $query.=", ";
                        }
                }
               
                $sql="update $dbname set $query, $lobname=empty_clob() $where  returning $lobname into :CONTB ";        //sql문 생성
                if($this->debug) echo $sql;
//                $stmt = @OCIParse($this->db, $sql);

                $clob = OCINewDescriptor($this->db, OCI_D_LOB);
                $stmt = @OCIParse($this->db, $sql);
                if (!$stmt) {                //에러가 났을경우
                        $erra=OCIError($stmt);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                OCIBindByName ($stmt, ":CONTB", &$clob, -1, OCI_B_CLOB);
                $err=OCIExecute($stmt, OCI_DEFAULT);
                if (!$err) {                //에러가 났을경우
                        $erra=OCIError($err);
                        $this->error("SQL Error: $erra[code] $erra[message]");
                }
                $count=@OCIRowCount($stmt);
                $clob->save($lobdata);
                $this->commit();
                @OCIFreeDesc($clob);
                @OCIFreeStatement($stmt);
                return $count;
        }



       
//############################################# 오토커밋이 True일경우만 가능
        function commit() {        //커밋
                return @OCICommit($this->db);
        }

        function rollback() {        //롤백
                return @OCIRollback($this->db);
        }


}





/////////////////////////////////예제
$db=new ora9();        //초기화        만약 다른 db접속시 ora9('아이디','암호','dns');
$db->con();        //접속
$sql="select count(id) from familyinfo where id='aaa' ";
$num=$db->queryone($sql);        //하나의 값만 받아온다 없으면 false

$sql = "INSERT INTO TokenLog(TOKEN_NO ,ID, Type, Token_Date, Content, Pay_Amount)  values(TokenLog_seq.nextval, 'ggg', 4, SYSDATE, 'ggg', 100) ";
$num=$db->squery($sql);        //업데이트&인설트용&delete 퀴리 return 업데이트, 인설트 갯수

$sql="select SubClass_Code, Title, PotoFile, Cont, Reg_Id, OpenFlag, Pick_OpenFlag, Reg_NickName, HTML from gggg where No='10' and id='ggg' ";
$val=$db->query($sql);        //일반 퀴리 $val[TITLE] 형식으로 배열로 값이 날라온다. 키값은 대문자임 없으면 false

$sql="select SubClass_Code, SubClass_Name from MiniHP_SubClass where Id='gggg' ";
$val=$this->db->querys($sql);        //여러개 결과용 일반퀴리 $val[0][SUBCLASS_NAME] 식의 배열로 날라온다 없으면 false

$sql_data = Array (
        NO => $b_no,
        SubClass_Code => $cate,
        ID => $this->user_id,
        Title => $org[TITLE],
        PotoFile => $filename,
        Cont => $org[CONT],
        Reg_Id => $this->user_id,
        Reg_Nickname => $this->user_nick,
        OpenFlag => $open,
        filesize => $org[FILESIZE],
        Pick_Memo => $memo,
        PICK_ID => $this->dbid,
        Pick_OpenFlag => 0
);        //배열형태로 키값=필드명으로 해서 만든다
$db->squery_inarr('board', $sql_data);        //db명과 배열을 넣어서 인설트한다.

//위에꺼와 같이 배열로 만들어서 사용. 업데이트용입니다. db명, 배열, 조건
$num=$db->squery_uparr('baord', $sql_data, " where no=10");                //업데이트 갯수 리턴


$sql_data = Array (
        NO => "mynote_seq.nextval",
        SUBCLASS_CODE => $cate,
        ID => $this->dbid,
        Title => $title,
        Reg_Id => $this->user_id,
        Reg_NickName => $this->user_nick,
        OPEN_FLAG => $open,
        PICKFLAG => $popen,
        Pick_Memo => '',
        HTML_Flag => $html,
);
//CLOB형식 데이타를 인설트하기 위한 퀴리        db명, 배열, CLOB필드명, CLOB데이타
$db->squery_inclob('gggg', $sql_data, 'CONT', $cont);

$sql_data = Array (
                SUBCLASS_CODE => $cate,
                Title => $title,
                Reg_NickName => $this->user_nick,
                Open_Flag => $open,
                PICKFLAG => $popen,
                HTML_Flag => $html
        );
//clob형 업데이트 함수        db명, 배열, clob필드명, clob데이타, 조건 return 업데이트 갯수
$num=$db->squery_upclob('gggg', $sql_data, 'CONT', $cont, " where no=$no");

$db->discon();        //접속해제


///기타
$db->autocommit(true);        //commit() 과 rollback() 을 사용할 수 있게한다. 기본 false
$db->debug=true;        //디버그모드;; sql문이 출력된다.

한달정도 사용했는데 별로 문제점은 없었습니다^^; 문제점 있으시면 알려주세요.

 
 

 
 거친마루 문제점은 아니고.. DNS 라는 프로퍼티 변수는 sid 가 아닌가 해서요.. 혹여나 용어 충돌때문에 핵갈려하시는분들 계실까봐 글 남깁니다

관련자료

등록된 댓글이 없습니다.
Today's proverb
나는 모든 작품마다 넘어졌다. 발레는 최선을 다하면 넘어지게 되어 있다. 인간이니까. (강수진, 발레리나)