'Database'에 해당되는 글 1건

  1. 2006.02.18 화니의 PHP강의 - 1편 DB의 사용 (9)
이 강의는 코딩에 지친 웹프로그래머들에게 바칩니다;;
저는 PHP를 접한지 5년이란 세월이 흘렀습니다.
어떡하면 효율적으로 코딩을 할까? 어떻하면 코딩을 간결하게 할 수 있을까? 하는 많은 고민을 했습니다.
그 동안 저의 노하우를 강의를 합니다.
이건 단지 저의 방식이고 더욱 편한 방법이나 자신과 스타일이 맞지 않으면 이 글을 안읽으셔도 됩니다.
다만 자신이 웹프로그래밍을 하면서 너무 반복적인일을 한다고 생각되면 한번쯤 읽어보시면 분명 도움이 되리라 생각합니다.

일단 글을 다 읽고 소스는 강의의 끝에 첨부합니다.
처음에는 부담없이 읽기만 해주세요^^

1편 DB의 사용
본 강의는 MySQL기준입니다.

웹프로그램에서 빠질 수 없는 DB의 사용입니다.
mysql_connect, mysql_fetch_array등의 함수를 아직도 이용하시나요? 그럼 본 강의를 본것은 행운입니다^^

저는 일단 Pear를 사용하여 DB를 사용합니다. 하지만 Pear도 복잡한 함수와 사용법을 배워야 합니다.
Pear에 대한 설명은 3편을 참고해주세요
그래서 저는 Pear를 한번더 감싸서 편리하게 사용하고 있습니다.(Adapter패턴)
일단 제가 사용하고 있는 DB 클래스입니다.
  1. <?php
  2. require_once 'DB.php'; //Pear
  3. require_once 'common.php';
  4. class mydb
  5. {
  6.    var $db;
  7.    var $debug=true;
  8.    function mydb($user='유져', $pass='암호', $name='데이타베이스')
  9.    {
  10.        $dsn = "mysql://$user:$pass@localhost/$name";
  11.        $this->db = DB::connect($dsn);
  12.        if(DB::isError($this->db)) die("DB Connect Error<br>죄송합니다. 잠시만 기다려주세요.");
  13.    }
  14.    function close()
  15.    {
  16.        if($this->db)
  17.        {
  18.            $this->db->disconnect();
  19.        }
  20.    }
  21.    //데이타 가져오기
  22.    function select($dbname, $arr='', $where='')
  23.    {
  24.        if($arr)
  25.        {
  26.            $sel=join(", ", $arr);
  27.        }
  28.        else
  29.        {
  30.            $sel=" * ";
  31.        }
  32.        $sql="select $sel from $dbname $where";
  33.        $data=$this->q($sql);
  34.        if($data && count($data) == 1)
  35.        {
  36.            return $data[0];
  37.        }
  38.        else
  39.        {
  40.            return $data;
  41.        }
  42.    }
  43.    //일반퀴리
  44.    function q($sql)
  45.    {
  46.        $data=$this->db->query($sql);
  47.        $this->error($data);
  48.        while ($row = $data->fetchRow(DB_FETCHMODE_ASSOC))
  49.        {
  50.            $var[] = $row;
  51.        }
  52.        return $var;
  53.    }
  54.    //퀴리 한줄만 얻기
  55.    function ql($sql)
  56.    {
  57.        $data=$this->q($sql);
  58.        if(!$data) return false;
  59.        $data2=$data[0];
  60.        return $data2;
  61.    }
  62.    //저장용 퀴리
  63.    function sq($sql)
  64.    {
  65.        $data=$this->db->query($sql);
  66.        $this->error($data);
  67.        return $data;
  68.    }
  69.    //한개의 값만 얻어오기
  70.    function qo($sql)
  71.    {
  72.        $data=$this->db->getOne($sql);
  73.        $this->error($data);
  74.        return $data;
  75.    }
  76.    //데이타 넣기
  77.    function in($dbname, $arr)
  78.    {
  79.        $num=$this->db->autoExecute($dbname, $arr, DB_AUTOQUERY_INSERT);
  80.        $this->error($num);
  81.        return $num;
  82.    }
  83.    //데이타 업데이트
  84.    function up($dbname, $arr, $where)
  85.    {
  86.        $num=$this->db->autoExecute($dbname, $arr, DB_AUTOQUERY_UPDATE, $where);
  87.        $this->error($num);
  88.        return $num;
  89.    }
  90.    //데이타 수정하기 up=up+1 이 되게
  91.    function up2($dbname, $arr, $where='')
  92.    {
  93.        foreach($arr as $key=>$val)
  94.        {
  95.            if( (!find_str($val, "+") && !find_str($val, "-") && !find_str($val, "*") ) && is_string($val) )
  96.            {
  97.                $val="'".$val."'";
  98.            }
  99.            $filed[]="$key = $val";
  100.        }
  101.        $view=join(",", $filed);
  102.        if($where) $where=" where " . $where;
  103.        $sql="update $dbname set $view $where";    //sql문 생성
  104.        $data=$this->sq($sql);
  105.        return $data;
  106.    }
  107.    //auto_increment 현재값
  108.    function seq($dbname, $field)
  109.    {
  110.        $sql="select max($field) from $dbname ";
  111.        $val=$this->qo($sql)+0;
  112.        return $val;
  113.    }
  114.    //최근 auto_increment 값
  115.    function auto()
  116.    {
  117.        $sql="select LAST_INSERT_ID()";
  118.        $val=$this->qo($sql);
  119.        return $val;
  120.    }
  121.    //에러 첵킹
  122.    function error($info)
  123.    {
  124.        if (DB::isError($info))
  125.        {
  126.            if($this->debug)
  127.            {
  128.                die($info->getDebugInfo());
  129.            }
  130.            else
  131.            {
  132.                die("DB 에러");
  133.            }
  134.        }
  135.    }
  136. }
  137. ?>
굳이 소스코드를 이해할려고 하실 필요는 없습니다.
DB의 사용이 이렇게 간결하게 될 수 있다는 것을 알려드릴려는것 뿐입니다.
많이 사용하는 방식의 DB처리를 예제로 보여드리겠습니다.

  1. <?php
  2. $db=new mydb();    //DB의 접속
  3. //다른 db에 접속하려면 $db=new mydb("aaaa", "bbbb", "cccc"); 방식으로 접속하면된다
  4. //사용자 정보의 갯수 가져오기
  5. $sql="select count(*) from user";    //퀴리문
  6. $data=$db->qo($sql);    //QueryOne 의 줄임표현입니다. 한개의 정보만 가져옵니다.
  7. echo $data;    //사용자 정보 갯수 출력
  8. // aaaa란 사용자의 정보 출력
  9. $sql="select * from user where id='aaaa' ";
  10. $data=$db->ql($sql);    //QueryLine 의 줄임표현입니다. 한라인의 정보만 가져옵니다.
  11. echo "이름 : $data[name] - 생일 : $data[birth] ";    //$data 에는 각 필드명으로 배열에 들어가 있습니다.
  12. //모든 사용자 정보 가져오기
  13. $sql="select * from user ";
  14. $data=$db->q($sql);    //보통 Query의 줄임표현입니다.
  15. foreach($data as $key => $val)    //루프를 돌립니다.
  16. {
  17.    echo "이름 : $val[name] - 생일 : $val[birth] ";    //$val 에는 한라인의 정보가 들어있습니다.
  18. }
  19. //사용자의 정보 넣기
  20. $in[name]="이름";    //정보의 배열은 $in[필드명]=값 의 형식이다.
  21. $in[birth]="1213";
  22. $in[id]="bbbb";
  23. $db->in("user", $in);    //Insert 의 줄임표현이다. 만든 배열을 넣는다
  24. //사용자 정보 수정
  25. $up[name]="이름2";    //정보의 배열은 $up[필드명]=값 의 형식이다.
  26. $up[birth]="1111";
  27. $db->up("user", $up, "id='bbbb' ");    //Update의 줄임표현이다.
  28. //+ - 되는 정보수정
  29. $up[age]="age + 1";
  30. $db->up2("user", $up, "id='bbbb' ");     //Update 에서 + - 가 필요한 형식의 경우를 위해 따로 함수를 만들었다
  31. /*
  32. 기존의 Insert문으로 보면 많이 간단해졌다는것을 알 수 있다.
  33. $sql = " insert into user set name = '이름',    birth = '1213',    id = 'bbbb' ";
  34. 필드명이 많아질수록 처리가 힘들것을 많이 격어봤을 것입니다.
  35. DB의 Insert와 Update를 배열로 넣는것은 보기편한것 외에 더 많은 장점이 있다.
  36. 배열로 사용하면서 많은 처리를 줄일 수 있다.
  37. */
  38. /*
  39. .........
  40. 여러가지 처리들(아이디 중복같은 검사들)
  41. ......
  42. $data[name]="이름";
  43. */
  44. if($no)    //회원번호가 있을경우
  45. {
  46.    $db->up("user", $data, "no=$no");
  47. }
  48. else    //회원번호가 없을경우
  49. {
  50.    $db->in("user", $data);
  51. }
  52. /*
  53. 이렇게 수많은 처리를 앞쪽에 두고 뒤에는 해당 데이타를 업데이트할 것인지 인설트할것인지를 정해서 처리하면 된다.
  54. */
  55. /*
  56. 이 방법을 보시면 더욱 놀랄것입니다.
  57. PHP는 $_POST에 배열로 전송하는 값들을 담고 있습니다. DB처리의 배열을 이것과 연결하면 수많은 단계를 줄일 수 있습니다.
  58. 아래와 같이 폼이 있다고 봅니다.
  59. <form target=post>
  60. <input type=text name=id>
  61. <input type=text name=name>
  62. <input type=text name=birth>
  63. <input type=submit value=save>
  64. </form>
  65. */
  66. $data=$_POST;    //POST로 넘어온값을 data에 저장한다
  67. unset($data[save]);    //POST 데이타중 필요없는 정보는 지운다
  68. $db->in("user", $data);    //배열을 DB에 넣는다.
  69. /*
  70. 보통 이것보다 더 많은 필드를 처리해야 했을것입니다.
  71. 물론 이 방법은 보안에 문제가 생길 수도 있습니다.
  72. 하지만 예외처리를 적당히 해주시면 수많은 DB코딩을 줄일 수 있게 됩니다.
  73. */
  74. $db->close();    //DB연결 종료
  75. ?>

이것으로 DB의 사용에 대한 강의를 마칩니다.

'자료들 > PHP' 카테고리의 다른 글

화니의 PHP강의 - 3편 코드 및 정리  (4) 2006.02.19
화니의 PHP강의 - 2편 게시판  (2) 2006.02.18
화니의 PHP강의 - 1편 DB의 사용  (9) 2006.02.18
Posted by 화니.

댓글을 달아 주세요

  1. 느낌표 2006.02.20 10:11  댓글주소  수정/삭제  댓글쓰기

    'DB.php' 클래스 파일은 어디서 구하나요 ?

  2. 자루스 2006.03.13 19:47  댓글주소  수정/삭제  댓글쓰기

    "DB.php 는 Pear 파일로 Pear를 설치하시거나 3편을 참고해주세요 "

    3편을 참조하고 DB.php를 받아보니 잘 돌아갑니다.
    그런데 perl 화일로 pear를 설치해라는 잘 이해가 안갑니다. perl을 아시는 분만이 가능한 것일까요?

  3. BlogIcon php초보 2006.04.01 00:48  댓글주소  수정/삭제  댓글쓰기

    Pear이 무엇인지 자세히 알고 싶습니다.

    • Favicon of http://d-3-b.com/blog/ BlogIcon 화니 2006.04.01 11:37  댓글주소  수정/삭제

      3편에 자세히 나와있습니다.
      pear에 대해 먼저 설명했어야 했나보네요.
      일종의 라이브러리입니다.

  4. 박성덕 2006.04.10 18:03  댓글주소  수정/삭제  댓글쓰기

    DELETE 구문은 어케 처리를 하는지요..
    자세한 답변 부탁드립니다...

    mrparkx@hanmail.net

  5. Favicon of http://blog.babyz.co.kr BlogIcon 아이젠 2006.12.26 18:45  댓글주소  수정/삭제  댓글쓰기

    화니님께서 남겨주신 위 PEAR를 이용해 프로그램중인데...
    비밀번호에 password 화 시켜서 입력을 할려면 어떻게 해야 하는지요?

    $in['pass'] = "password('$pass')";

    요런씩으로 하니 DB에 그냥 password('1234567890') 처럼 입력이 되어 버리네요;;;
    다른 방법으로 해야 한다면 어떻게 해야하는지 알려주시와요~

    그리고 새해 복 많이 받으세요(__)