본문 바로가기

Web Development/PHP

[PHP] DB 연동하기

PHP언어로 만들수 있는 프로그램이나
만들어져있는 프로그램의 95%는 DB와 연동하는 프로그램입니다.


중요한부분입니다.
 

MySQL 데이터베이스 관련 PHP함수

mysql_connect();

--MySQL 서버에 접속하는 함수

mysql_select_db();

--MySQL 데이터베이스를 선택하는 함수

mysql_query();

--MySQL 서버에 query를 보낸후 실행시키는 함수

mysql_fetch_array();

--쿼리 실행후 결과를 필드이름색인 또는 숫자색인으로 된 배열로 반환하는 함수 

mysql_free_result();

--결과값을 제거(해체)하는 함수

mysql_close();

--MySQL 접속을 닫는 함수

 

mysql_connect() 함수 예제

<? 

$link = mysql_connect("localhost","byc","freely21c");

//# MySQL 서버에 접속 #//

// 접속에 성공하면 $link변수에는 DB연결에 대한 링크식별자 값이 들어가며 접속에 실패하면
// 아무값도 들어가지 않는다.

 

if ($link)
echo "연결성공";
else
echo "연결실패";

 

//# MySQL 접속해체 #//

mysql_close($link);

 

?>

※ localhost을 써놓는부분은 해당 MySQL서버가 있는 위치를 말한다.
해당 서버에 MySQL서버가 있다면 localhost을 쓰지만 다른곳에 있느다면 해당 ip나 도메인을 씁니다.

 

mysql_select_db() 함수 예제

<?

 

$link = mysql_connect("localhost","byc","freely21c");

//# MySQL 서버에 접속 #//

// 접속에 성공하면 $link변수에는 DB연결에 대한 링크식별자 값이 들어가며 접속에 실패하면

// 아무값도 들어가지 않는다.

 

mysql_select_db("byc",$link);

//링크 식별자값으로 이용하여 사용가능한 데이터베이스를 선택한다.

 

//# MySQL 접속해체 #//

mysql_close($link);

?>

 

※ or die("출력할내용"); 을 mysql관련함수 모두의 뒤에 붙이면
mysql관련함수가 에러나면 에러 메세지를 출력하지 않고 "출력할내용"이 화면에 출력된다.

ex > mysql_select_db("byc",$link) or die("에러입니다.^^");

 

mysql_query() 함수 예제

select query

<?

$link = mysql_connect("localhost","byc","freely21c");

//# MySQL 서버에 접속 #//

// 접속에 성공하면 $link변수에는 DB연결에 대한 링크식별자 값이 들어가며 접속에 실패하면

// 아무값도 들어가지 않는다.

 

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");

//링크 식별자값으로 이용하여 사용가능한 데이터베이스를 선택한다.

 

$qry_chk = mysql_query(" select * from pet3 ",$link);
//# 링크식별자로 연결된 DB에 query를 보낸후 해당 MySQL에서 실행시킨다. #//
//# 링크식별자를 입력하지 않으면 가장 최근에 열어진 링크식별자를 자동으로 사용하게 된다. #//
//# SELECT문,INSERT문,UPDATE문,DELETE문 모두 사용하다.
//# 리턴되는 값은 성공이면 참(TRUE), 거짓이면 거짓(FALSE)을 리턴한다. #//

 

if($qry_chk)
echo "실행 성공";
else
echo "실행 실패";

 

//# MySQL 접속해체 #//

mysql_close($link);

 

?>

 

insert query

<?

$link = mysql_connect("localhost","byc","freely21c");

//# MySQL 서버에 접속 #//

// 접속에 성공하면 $link변수에는 DB연결에 대한 링크식별자 값이 들어가며 접속에 실패하면

// 아무값도 들어가지 않는다.

 

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");

//링크 식별자값으로 이용하여 사용가능한 데이터베이스를 선택한다.

 

$qry_chk = mysql_query(" insert into pet3 values('jun','lee','sik','0','1988-02-01',12,13) ",$link);

//# 링크식별자로 연결된 DB에 query를 보낸후 해당 MySQL에서 실행시킨다. #//
//# 링크식별자를 입력하지 않으면 가장 최근에 열어진 링크식별자를 자동으로 사용하게 된다. #//
//# SELECT문,INSERT문,UPDATE문,DELETE문 모두 사용하다.
//# 리턴되는 값은 성공이면 참(TRUE), 거짓이면 거짓(FALSE)을 리턴한다. #//

 

if($qry_chk)
echo "실행 성공";
else
echo "실행 실패";

 

//# MySQL 접속해체 #//

mysql_close($link);

?>



※ 파란색은 주석입니다. 코딩하지 않아도 되삼

 

mysql_query() 함수 예제

update query

<?

$link = mysql_connect("localhost","byc","freely21c");
//# MySQL 서버에 접속 #//
// 접속에 성공하면 $link변수에는 DB연결에 대한 링크식별자 값이 들어가며 접속에 실패하면
// 아무값도 들어가지 않는다.

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");
//링크 식별자값으로 이용하여 사용가능한 데이터베이스를 선택한다.

 

$qry_chk = mysql_query(" update pet3 set owner = 'haha' where name = 'lee' ",$link);
//# 링크식별자로 연결된 DB에 query를 보낸후 해당 MySQL에서 실행시킨다. #//
//# 링크식별자를 입력하지 않으면 가장 최근에 열어진 링크식별자를 자동으로 사용하게 된다. #//
//# SELECT문,INSERT문,UPDATE문,DELETE문 모두 사용하다.
//# 리턴되는 값은 성공이면 참(TRUE), 거짓이면 거짓(FALSE)을 리턴한다. #//

 

if($qry_chk)
echo "실행 성공";
else
echo "실행 실패";

 

mysql_close($link);
//# MySQL 접속해체 #//

 

?>

delete query

<?

$link = mysql_connect("localhost","byc","freely21c");
//# MySQL 서버에 접속 #//
// 접속에 성공하면 $link변수에는 DB연결에 대한 링크식별자 값이 들어가며 접속에 실패하면
// 아무값도 들어가지 않는다.

 

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");
//링크 식별자값으로 이용하여 사용가능한 데이터베이스를 선택한다.

 

$qry_chk = mysql_query(" delete from pet3 where name = 'jun' ",$link);
//# 링크식별자로 연결된 DB에 query를 보낸후 해당 MySQL에서 실행시킨다. #//
//# 링크식별자를 입력하지 않으면 가장 최근에 열어진 링크식별자를 자동으로 사용하게 된다. #//
//# SELECT문,INSERT문,UPDATE문,DELETE문 모두 사용하다.
//# 리턴되는 값은 성공이면 참(TRUE), 거짓이면 거짓(FALSE)을 리턴한다. #//

 

if($qry_chk)
echo "실행 성공";
else
echo "실행 실패";

 

mysql_close($link);
//# MySQL 접속해체 #//

 

?>

 

mysql_fetch_array() 함수 예제

 

쿼리 실행후 결과를 필드명 색인 또는 숫자 색인으로 된 배열형태로 반환하는 함수입니다.

INSERT, UPDATE, DELETE 는 결과 데이타가 없습니다.
왜냐하면 실행후 결과가 나오지 않기 때문입니다.

하지만 SELECT 는 쿼리실행후 결과가 출력되며
이렇게 출력된 데이타를 PHP파일에서 처리해서 브라우저에게 출력하게 됩니다.

 

결과 데이타셋에서 첫번째 레코드의 단일 컬럼정보를 출력하기

 

<?

 

$link = mysql_connect("localhost","byc","freely21c");

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");

$qry_result = mysql_query(" select * from pet3 ",$link);

 

$qry_row = mysql_fetch_array($qry_result);

//# $qry_result 변수값에서 select 쿼리의 결과 레코드등중 첫번째 레코드를 한줄가져와서

//# 배열형태로 $qry_row변수에 넣습니다.

 

echo $qry_row["name"];

//# 대입한 배열변수에서 출력할 단일 컬럼명을 이용해 데이타를 출력한다.

 

//# MySQL 접속해체 #//

mysql_close($link);

 

?>

 

결과 데이타셋에서 첫번째 레코드의 모든 컬럼정보를 출력하기

 

<?

 

$link = mysql_connect("localhost","byc","freely21c");

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");

$qry_result = mysql_query(" select * from pet3 ",$link);

 

$qry_row = mysql_fetch_array($qry_result);

//# $qry_result 변수값에서 select 쿼리의 결과 레코드등중 첫번째 레코드를 한줄가져와서

//# 배열형태로 $qry_row변수에 넣습니다.

 

echo $qry_row["name"] . " " . $qry_row["owner"] . " " . $qry_row["jong"] . " " . $qry_row["sex"] . " " . $qry_row["birth"];

//# 대입한 배열변수에서 출력할 여러 컬럼명을 이용해 데이타를 출력한다.

 

//# MySQL 접속해체 #//

mysql_close($link);

 

?>

 

결과데이타셋에서 모든 레코드의 모든 컬럼정보를 출력하기

 

<?

 

$link = mysql_connect("localhost","byc","freely21c");

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");

$qry_result = mysql_query(" select * from pet3 ",$link);

 

//# $qry_result 변수값에서 select 쿼리의 결과 레코드를 첫번째부터 하나씩 가져온다.

 

 첫번째 레코드를 한줄가져와서

//# 배열형태로 $qry_row변수에 넣습니다.

 

//# while 반복문으로 조회결과를 한 로우씩 뽑아온다.

//# 로우결과가 없을때까지 반복해서 실행합니다.

while($qry_row = mysql_fetch_array($qry_result))
{

echo $qry_row["name"] . " " . $qry_row["owner"] . "<br>";

echo $qry_row["jong"] . " " . $qry_row["sex"] . " " . $qry_row["birth"] . "<br>";

}

 

//# MySQL 접속해체 #//

mysql_close($link);

 

?>

 

mysql_free_result() 함수 예제

결과값(result)을 제거(해체)하는 함수

 

<?

 

$link = mysql_connect("localhost","byc","freely21c");

mysql_select_db("byc",$link) or die("데이터베이스를 잘못선택하였습니다.");

$qry_result = mysql_query(" select * from pet3 ",$link);

 

//# $qry_result 변수값에서 select 쿼리의 결과 레코드등중 첫번째 레코드를 한줄가져와서
//# 배열형태로 $qry_row변수에 넣습니다.
$qry_row = mysql_fetch_array($qry_result);

 

//# mysql_query함수의 리턴값인 result(데이타셋)에 내용을 모두 제거한다.

//# 사실 안해줘야 되지만 이런게 있다는것을 알아두자.

mysql_free_result($qry_result);

 

//# MySQL 접속해체 #//
mysql_close($link);

 

?>

 

mysql_close() 함수 예제

 

MySQL 접속을 닫는 함수

 

<?

 

$link = mysql_connect("localhost","byc","freely21c");
//# MySQL 서버에 접속 #//
// 접속에 성공하면 $link변수에는 DB연결에 대한 링크식별자 값이 들어가며 접속에 실패하면
// 아무값도 들어가지 않는다.

 

mysql_close($link);
//# MySQL 접속해체 #//
//# 사실 mysql_close()함수도 마지막 부분에서 자동으로 종료되기

//# 때문에 사용할 필요가 없다.

 

?>

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. ?>

'Web Development > PHP' 카테고리의 다른 글

[PHP] DB의 데이타를 게시판형식으로...  (1) 2009.06.06
[PHP] 로그인(login) 프로그램 구현  (2) 2009.06.06
[PHP] 카운터 만들기  (0) 2009.06.05
[PHP] 함수에 대해서  (0) 2009.06.05
[PHP] 제어 구조에 대해서  (0) 2009.06.05