본문 바로가기

Knowhow/Programming

PHP 강의 1 조회(217)

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

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

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

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

저는 일단 Pear를 사용하여 DB를 사용합니다. 하지만 Pear도 복잡한 함수와 사용법을 배워야 합니다.
그래서 저는 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의 사용에 대한 강의를 마칩니다. [이 게시물은 PHPSCHOOL님에 의해 2006-02-21 15:10:54 팁앤테크에서 복사 됨]