2013년 12월 30일 월요일

[일반] "초보탈출" Apache + PHP + Oracle 연동[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

[일반] "초보탈출" Apache + PHP + Oracle 연동[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]


php와 오라클 연동.

기왕 설명 드리는 것이니 최신버전으로 설명을 드리겠습니다.^^
http://www.apache.org
http://www.php.net

사이트를 방문하셔서 가장 최신 버전을 다운 받습니다.
지금 들어오니 Apache/2.0.52,PHP/5.0.3 이 최신이네요^^
자세한 설명을 위해 다운로드 페이지로 바로 가르쳐드리고 싶지만, 그 사이트를 직접가서 메인부터
보시고 이것저것 눌러보시고 해보세요^^ 처음하시는 분이라면 더더욱 필요합니다.
영문사이트에 자주 가보는 것이 php 공부를 하는데 가장 필요하더라고요.

Apache/2.0.52
PHP Version 5.0.3
Oracle 9i

그럼, APM(Apache, PHP, MySql)처럼, OAP(Oracle, Apache, PHP) 연동을 시작하겠습니다.^^
OAP라고 하죠. 이름을 왜 이렇게 지었을까요? 그냥? 아닙니다. 설치 순서입니다. APM도 설치 순서인 것 처럼요^^
Oracle을 먼저 설치하는게 좋아요^^.

그럼 아파치를 설치합니다.
그다음 php를 설치합니다.

아파치와 PHP 설치부분과 연동부분은 아래 APM 설치 강좌를 보시면 자세히 나와 있습니다.
어렵지 않게 여기까지는 다 따라 오실 수 있을 겁니다.

이제 제가 설명드리고자 하는 PHP와 오라클 연동이 남았습니다.

우선은 php.ini 파일에서 ;extension=php_oci8.dll 오라클 모듈 부분이 있습니다.
우리는 오라클을 사용하려고 함으로 이부분의  ";" 주석을 풀어주세요.

수정전:  ;extension=php_oci8.dll
수정후:  extension=php_oci8.dll

그럼 php_oci8.dll 모듈을 사용한다고 했으니깐.. 당연히 php_oci8.dll 파일의 위치를 php에게 가르쳐 줘야 겠죠.
당근 ini 파일에서 extension 들이 나열되어 있다면 어딘가에 파일 경로도 넣을 수 있게 했겠죠^^

바로 ,
extension_dir = "" 이부분 입니다.
이부분은 php의 확장형모듈들이 모여있는 곳의 경로를 넣어주시면 됩니다.
APM 강좌에서 확장형모듈을 설정하는 부분이 나왔었습니다..참고하세요.
PHP Version 5.0.3 에서는 PHP설치 폴더 안에 ext 라는 폴더가 해당됩니다.
그안에 저희가 사용할 php_oci8.dll 가 위치되어 있는 것이 보이죠^^

그럼, 설정은 끝난 겁니다.

<?
        phpinfo();
?>
실행해서 설치된 정보들을 보죠.
oci8 이 보이신다면 오라클과의 연동은 끝난겁니다.

이제 가장 중요한 접속부분을 해보겠습니다.
저희가 도전할 과제 입니다.
아주 간단한 예제죠.

오라클에 접속해서 오라클 버전을 알아보는 것 입니다.
<?
        $conn = OCIlogon("scott","tiger","ORCL1");
        echo "Server Version=".OCIServerVersion($conn);
        OCIlogoff($conn);
?>

이를 실행해서 우리가 오라클 버전을 보는게 이번 강좌의 목표입니다.
Q/A를 보면서 이 부분 때문에 강좌를 열기로 했습니다.^^

$conn = OCIlogon("scott","tiger","ORCL1"); 특히 이분 입니다. 바로 오라클 접속 계정이죠.
오라클 서버에 접속을 하려면 인증이 필요합니다. 그래서 OCIlogon 이라고 하죠^^ login 아닙니다.
logon 입니다.

저희가 어느 사이트에 들어가기 위해 회원가입을 하죠. 그럼 우리가 오라클 서버에 접속해서 오라클을 사용하려면?
맞습니다. 잘 아시내요. 회원가입을 해야됩니다.
회원가입 시 id와 password 및 기본 정보를 넣죠. 이는 오라클에서 계정을 생성하는 것과 같습니다. 우선 저희는 오라클에서
기본적으로 생성되어 있는 scott/tiger 를 이용하겠습니다. id가 scott 이고 비번이 tiger 입니다.

OCIlogon("scott","tiger","orcl")
그럼 여기서 두개의 인자는 이해가 가셨죠?

그럼 orcl 은 멀까요? 바로 주소입니다. 오라클 서버의 주소. 저희가 어느 사이트에 들어가려면 가장 기초적인 url 이 있어야겠죠.

그럼 이 url 정보는 누가 가지고 있을까요.
$ORACLE_HOME/network/admin/tnsnames.ora  바로 이부분입니다.
이부분에 생성이 됩니다.
파일을 열어보시면, 이미 설정되어진 tnsname들이 보이실 것입니다.
이중에서 orcl 로 설정된 tnsname이 존재해야 되는 것입니다.

ex)
  orcl =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = jmc)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )
 저도 이렇게 생성이 되어 있습니다.

 이렇게 해서 다른 컴퓨터에 설치된 오라클서버에도 접속이 가능한 것입니다.
 자세한 부분은 오라클 리스너 구성하는 법을 찾아보세요^^;
 고생해서 찾아야지 자기것이 됩니다.
 무조건 고생해서 찾으세요.
 이해하셨으면, 이젠 당신은 "초보"가 아닙니다.

 다음 강좌는 오라클함수에 대해서 알아보겠습니다.
 


  • JAVA
  • ORACLE
  • iPhone/Android
  • .NET
  • 표준웹/HTML5
  • 채용/취업무료교육
  • 초보자(재학생)코스

  • [일반] "초보탈출" OCI함수들의 이야기 보따리[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

    [일반] "초보탈출" OCI함수들의 이야기 보따리[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]


    이번 강좌는 약속 했듯이 oci8 함수를 소개해 드리겠습니다.
    우선 함수를 간략하게 소개해드리고 나중에는 이 함수들을 가지고 class로 구성해 보겠습니다.

    1. string OCIServerVersion(int conn)
    오라클 데이터 서버의 버전정보를 출력합니다.
    oci8을 설정했을 경우, 가장 간단한 테스트 방법으로 많이 쓰입니다.

    <?php
            $conn = OCILogon("scott", "tiger", "orcl");
            echo "Server Version : " . OCIServerVersion($conn);
            $OCILogOff($conn);
    ?>
    result :
      Server Version : Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production With the Partitioning, OLAP and Oracle Data Mining options JServer Release 9.2.0.1.0 - Production
     
    위와같이 오라클 서버정보가 나오면 오라클과 PHP가 잘 연동된 것 입니다.
    모든 책의 기본인 "Hello World!"를 찍는 테스트용 소스라고 생각하시면 됩니다.


    2. int OCILogon(string username, string password, strin[ORACLE_SID])
      int OCILogoff(int connection)

    PHP에서 오라클에 접속하고 접속을 해제하는 함수입니다.
    이전에도 설명 했듯이 이부분은 간단하게 이해하시면 됩니다. 사용자가 인터넷에 연결할때 머가 필요하다고 했죠.
    "초보탈출" 강좌 PHP와 오라클 연동 부분을 읽으신 분들은 아하! 라는 탄성이 나오실 것입니다.
    OCILogon() 함수의 세번째 인수는 생략이 가능하며, 이를 생략할 경우에는 ORACLE_SID(Oracle instance) 또는 TWO_TASK(tnsames.ora) 환경변수 값을 이용해서 어떤 DB에 연결할지를 결정합니다.
    리턴값으로는 다른 OCI함수를 호출할때 필요한 connection 값을 반환 합니다.
    그럼 당연히 OCILogoff()함수은 무엇이겠습니까?
    맞습니다. OCILogon()의 리턴값을 인수로 받아 오라클 접속을 해지하는 것 입니다.

    3. intOCiParse(int conn, strint query)
    "Parse" - <문장을> 해부[분석]하다. 이죠.
    그럼 설명 할 필요 없겠죠.
    그래도 자세히. 첫번째 인수로 OCILogon의 리턴 값을 받습니다. 두번째 인수로는 유효한 오라클 SQL 구문이 옵니다.
    무엇을 분석하려고 할까요? 맞습니다. 바로 SQL 쿼리문입니다. 한마디로 유효성 검사라고 생각하시면 됩니다.
    이를 우리는 statement 라고들 합니다. 명사로 풀이하면 "성명서"라고 하죠. "성명서"란 만인한테 인증된 사실이죠.
    그럼 리턴값은 무엇일까요. 당근.... 참과 거짓. true나 false 입니다.  알고나니 쉽죠. 별것 아닙니다.
    알수록 재미있죠. 그럼 기운을 내서 ...

    4. int OCIExecute(int statement, int [mode])
    "execute" 다 아시는 단어. 또 나왔습니다. "<행동 등을> 행하다, 실시[실행]하다 " 입니다. 그럼 머하는 함수일까요?
    쉽습니다.^^ 바로 먼가를 실행하는 함수 입니다. 무엇을? 첫번째 인수가 statement 군요. "성명서" 기억나시죠.
    즉, SQL문이 true 인것을 실행하는 것 입니다. 이해 팍팍 오죠.
    그럼 두번째 인수는 멀까요? mode 내요. 두번째 인수는 생략할 수 있습니다. 생략을 하면 OCI_COMMIT_ON_SUCCESS 가 들어가죠.
    이는 SQL문을 실행하고 바로 commit 을 하도록 하는 것입니다.
    또다른 mode 로는 OCI_DEFAULT 를 지정할 수 있습니다. 그럼 이 옵션은 무엇일까요. commit을 바로 하지 않고 좀 생각할 여유를 줘서 아니다 싶으면 rollback을 할수 있게 해주는 옵션입니다.
    OCI_DEFAULT는 테이블을 변경하는 작업(CREATE, UPDATE, DELETE)에서 많이 사용하죠. 여기서 설명한 부분 상당히 중요합니다.
    commit과 rollback은 "트랜젝션"에 관한 것으로 DB 관련 용어입니다. 중요한 단어 아시겠죠. 바로 "트랜젝션" 입니다.
    "트랜젝션"은 너무너무 중요함으로 다음 강의에서 설명드리겠습니다.

    5. int OCIFreeStatement(int stmt)

    FreeStatement가 무엇을 의미할까요. Free "(속박이 없이) 자유로운" Statement는 머였죠? "성명서".
    즉, 이젠 더이상 쿼리문을 사용하지 않는다는 것입니다. 그럼, 이를 오라클이 알기 위해서는 동의가 필요하겠죠.
    그래서 리턴 값이 true, false 를 가집니다.

    그럼 지금까지 강의를 간단한 소스와 함께 간단히 글로 풀어보겠습니다.^^

    <?php
            /**
            * 오라클 접속 id: scott 과 pwd: tiger 을 이용해서 tnsnames에 있는 주소 orcl에 들어갔습니다.
            * 리턴값 true를 받아 사용가능하게 되었습니다.
            */
            $conn = OCILogon("scott", "tiger", "orcl");
           
            /**
            * 오라클을 사용해도 된다고 해서 자신의 이름의 이니셜로된 테이블을 만들려고 쿼리문을 보냈습니다.
            * 오라클은 쿼리문을 보고 유효성 검사를 하여 "성명서"를 발표합니다.
            */
            $query = "create table jmc(name varchar2(10))";
            $stmt  = OCIparse($conn, $query);

            /**
            * 오라클은 scott 이라는 사용자가 준 쿼리를 실행합니다.
            * jmc 라는 테이블이 name 이라는 칼럼을 가지고 생성되었습니다.
            * 오라클은 생성했다고 알리기 위해서 true 를 리턴했습니다.
            * 그래서 if문만나 echo 값이 찍힙니다.
            */
            if(OCIexecute($stmt))
            {
                    echo "jmc 라는 테이블이 생성되었습니다.";
            }
           
            /**
            * 이젠 더이상 필요없는 "성명서"를 거두어 드립니다.
            */
            OCIFreeStatement($stmt);
           
            /**
            * scott 이라는 사용자가 오라클에서 나갑니다. 나갈때는 당연히 로그아웃하고 나가죠^^
            */
            OCILogoff($conn);

    ?>

    이 예제의 이야기를 보셨죠. 두번 실행하면 당연히 error 납니다. 왜 일까요?
    같은 이름의 jmc라는 테이블을 또 생성하려고 하니깐 그렇겠죠^^
    그럼 이 이야기를 머리속에 정리하시면서 생성된 jmc 테이블을 drop 해보세요.

    그럼 다음 강좌에는 오라클에서 select 로 데이터를 배열로 받아서 화면에 뿌려보겠습니다.
    아차~ 다음번 강의는 트랜젝션이죠^^

    오라클 이야기를 다른사람한테 해줄 수 있는 당신은 절대 "초보"가 아닙니다.

  • JAVA
  • ORACLE
  • iPhone/Android
  • .NET
  • 표준웹/HTML5
  • 채용/취업무료교육
  • 초보자(재학생)코스



  •  

    #18. 기본위젯(체크박스:CheckBox)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

    #18. 기본위젯(체크박스:CheckBox)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육] 

    CheckBox 클래스의 상속구조
     
     
     
    isChecked() – checkbox의 상태를 리턴.
    setChecked(true/false) – checkboxcheck/unckeck .
    toggle() – checkboxtoggle.
     
     
    CheckBox를 사용했을 때 발생하는 event를 처리
     
     
    CompoundButton.OnCheckedChangeListener  상속
       = onCheckedChanged(CompoundButton buttonview,
          boolean isChecked)
          체크여부에 따른 interface 구현 메소드
    setOnCheckedChangeListener()
       = check 이벤트 발생했을 때 사용될 callback등록 하는 설정메소드
     
     
     
     
     

     
    import android.app.Activity;
    import android.os.Bundle;
    import android.widget.CheckBox;
    import android.widget.CompoundButton;
    // Activity를 상속 받아 
    // CompoundButton.OnCheckedChangedListener interface를 구현하는
    // MyCheckBox Activity class
    public class testSample extends Activity
    implements CompoundButton.OnCheckedChangeListener {
    CheckBox cb;
    public void onCreate(Bundle icicle) {
    super.onCreate(icicle);
    setContentView(R.layout.main);
    cb = (CheckBox) findViewById(R.id.check);
    cb.setOnCheckedChangeListener(this);
    }
     
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
    if (isChecked) {
    cb.setText("This checkbox is: checked");
    }
    else {
    cb.setText("This checkbox is: unchecked");
    }
    }
    }

     
     

     
     
     
     
     


  • JAVA
  • ORACLE
  • iPhone/Android
  • .NET
  • 표준웹/HTML5
  • 채용/취업무료교육
  • 초보자(재학생)코스

  • #19. 기본 위젯(RAdioGroup & RadioButton)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육]

    #19. 기본 위젯(RAdioGroup & RadioButton)[재직자무료교육/프로그래머교육/구로디지털IT교육,오라클/자바/닷넷/C#/iOS/안드로이드/아이폰교육] 



    RadioButton 클래스의 상속구조
     
     
    RadioButton은 보통 RadioGroup에 의해 여러 개가 한 묵음으로 사용됨.
    같은 RadioGroup내부의 RadioButton은 한 번에 하나만 선택 가능.
    RadioButtonCheckBox와 다르게 한번 check되면 사용자가 직접 unckeck 할 수 없음.
    (RadioGroup 내부의 다른 RadioButton을 선택 하는 것으로 unchecke )
     
     
    RadioGroup 클래스의 상속구조

     
     
    onCheckedChanged abstract method를 포함
      - CheckedChangeListener interface를 제공한다
    onCheckedChanged 메소드 정의  
       - OnCheckedChangedListener를 구현
     
    [실습예]

     
     
    <li tabindex="0" class="ui-state-default ui-corner-top ui-tabs-active ui-state-active" role="tab" aria-selected="true" aria-controls="tabs-1" aria-labelledby="ui-id-1">JAVA</li><li tabindex="-1" class="ui-state-default ui-corner-top" role="tab" aria-selected="false" aria-controls="tabs-2" aria-labelledby="ui-id-2">ORACLE</li><li tabindex="-1" class="ui-state-default ui-corner-top" role="tab" aria-selected="false" aria-controls="tabs-3" aria-labelledby="ui-id-3">iPhone/Android</li><li tabindex="-1" class="ui-state-default ui-corner-top" role="tab" aria-selected="false" aria-controls="tabs-4" aria-labelledby="ui-id-4">.NET</li><li tabindex="-1" class="ui-state-default ui-corner-top" role="tab" aria-selected="false" aria-controls="tabs-5" aria-labelledby="ui-id-5">표준웹/HTML5</li><li tabindex="-1" class="ui-state-default ui-corner-top" role="tab" aria-selected="false" aria-controls="tabs-6" aria-labelledby="ui-id-6">채용/취업무료교육</li><li tabindex="-1" class="ui-state-default ui-corner-top" role="tab" aria-selected="false" aria-controls="tabs-7" aria-labelledby="ui-id-7">초보자(재학생)코스</li>