본문 바로가기

개발/Mysql

mysqli 클래스

Mysqli 클래스


query , insert , modify , delete 인터페이스 정리


DB 접속 클래스

<?php

interface dbconn

{

public function query($query); // 쿼리

public function insert($query); //  삽입

public function modify($query); // 수정

public function delete($query); //삭제

public function bindParams($query,$args=array()); // 쿼리문자 바인드

}

?>


DB 접속정보

<?php

define('_DB_HOST','localhost');

define('_DB_USER','userid');

define('_DB_PASS','pass');

define('_DB_NAME','dbname');

?>


DbMySqli : [클래스1개] mysqli, [인터페이서 2개] DbSwitch, ArrayAccess 를 상속 받아 구현을 합니다.

< ?php

# Parent : MySqli

# Parent : DBSwitch

# purpose : mysqli을 활용해 확장한다

class DbMySqli extends mysqli implements DbSwitch,ArrayAccess

{

    private $params = array();

     

    # dsn : host:dbname = localhost:dbname

    public function __construct($dsn='',$user='',$passwd='',$chrset='utf8')

    {

        # 데이타베이스 접속

        if(!empty($dsn)){

            $dsn_args = explode(':',$dsn);

            parent::__construct($dsn_args[0],$user,$passwd,$dsn_args[1]);

        }else{//config.inc.php --> config.db.php

            parent::__construct(_DB_HOST_,_DB_USER_,_DB_PASSWD_,_DB_NAME_);

        }

         

        if (mysqli_connect_error()){

            throw new ErrorException(mysqli_connect_error(),mysqli_connect_errno());

        }

 

        # 문자셋

        $chrset_is = parent::character_set_name();

        if(strcmp($chrset_is,$chrset)) parent::set_charset($chrset);

    }

     

    #@ interface : ArrayAccess

    # 사용법 : $obj["two"] = "A value";

    public function offsetSet($offset, $value) {

        $this->params[$offset] = parent::real_escape_string($value);

    }

     

    #@ interface : ArrayAccess

    # 사용법 : isset($obj["two"]); -> bool(true)

    public function offsetExists($offset) {

        return isset($this->params[$offset]);

    }

     

    #@ interface : ArrayAccess

    # 사용법 : unset($obj["two"]); -> bool(false)

    public function offsetUnset($offset) {

        unset($this->params[$offset]);

    }

     

    #@ interface : ArrayAccess

   # 사용법 : $obj["two"]; -> string(7) "A value"

    public function offsetGet($offset) {

        return isset($this->params[$offset]) ? $this->params[$offset] : null;

    }

     

    # @ interface : DBSwitch

    # :s1 -> :[문자타입]+[변수]

    # :s[문자], :d[정수], :f[소수], :b[바이너리]

    # 변수타입, :s1,:sa,:sA, :d1, :d2, :dA 어떻게든 상관없음

    # 단 :s1, :s1 이렇게 중복 되어서는 안됨 

        # where 구문만 변경

    // ("SELECT * FROM `TABLE` WHERE name=':s1' and age=':d2'",array('php',26,'나','ㅈㄷ',22));

    public function bindParams($query,$args=array()){

        if(strpos($query,':') !==false){

            preg_match_all("/(\:[s|d|f|b])+[0-9]+/s",$query,$matches);

            if(is_array($matches))

            {

                foreach($matches[0] as $n => $s)

                {

                    # 문자타입과 값이 일치하는지 체크

                    $bindtype = substr($s,1,1);

                    $bvmatched = false;

                    switch($bindtype){

                        case 's': if(is_string($args[$n])) $bvmatched = true; break;

                        case 'd': if(is_int($args[$n])) $bvmatched = true; break;

                        case 'f': if(is_float($args[$n])) $bvmatched = true; break;

                        case 'b': if(is_binary($args[$n])) $bvmatched = true; break;

                    }

                    if($bvmatched){

                        $query = str_replace($s,'%'.$bindtype,$query);

                        $query = sprintf("{$query}",parent::real_escape_string($args[$n]));

                    }else{

                        $query = false;

                        break;

                    }

                }

            }

        }

    return $query;

    }

 

    #@ return int

    # 총게시물 갯수 추출

    public function get_total_record($table, $where="", $field='*'){

        $wh = ($where) ? " WHERE ".$where : '';

        if($result = parent::query('SELECT count('.$field.') FROM `'.$table.'`'.$wh)){

            $row = $result->fetch_row();

            return $row[0];

        }

    return 0;

    }

 

    // 하나의 레코드 값을 가져오기

    public function get_record($field, $table, $where){

        $where = ($where) ? " WHERE ".$where : '';

        $qry = "SELECT ".$field." FROM `".$table."` ".$where;

        if($result = $this->query($qry)){

            $row = $result->fetch_assoc();

            return $row;

        }

    return false;

    }

 

    # @ interface : DBSwitch

    public function query($query){

        $result = parent::query($query);

        if( !$result ){

            throw new ErrorException(mysqli_error(&$this).' '.$query,mysqli_errno(&$this));

        }

    return $result;

    }

 

    # @ interface : DBSwitch

    # args = array(key => value)

    # args['name'] = 1, args['age'] = 2;

    public function insert($table){

        $fieldk = '';

        $datav  = '';

        if(count($this->params)<1) return false;

        foreach($this->params as $k => $v){

            $fieldk .= sprintf("`%s`,",$k);

            $datav .= sprintf("'%s',", parent::real_escape_string($v));

        }

        $fieldk = substr($fieldk,0,-1);

        $datav  = substr($datav,0,-1);

        $this->params = array(); #변수값 초기화

         

        $query  = sprintf("INSERT INTO `%s` (%s) VALUES (%s)",$table,$fieldk,$datav);

        $this->query($query);

    }

     

    # @ interface : DBSwitch

    public function update($table,$where)

    {

        $fieldkv = '';

         

        if(count($this->params)<1) return false;

        foreach($this->params as $k => $v){

            $fieldkv .= sprintf("`%s`='%s',",$k,parent::real_escape_string($v));

        }

        $fieldkv = substr($fieldkv,0,-1);

        $this->params = array(); #변수값 초기화

         

        $query  = sprintf("UPDATE `%s` SET %s WHERE %s",$table,$fieldkv,$where);

        $this->query($query);

    }

 

    # @ interface : DBSwitch

    public function delete($table,$where){

        $query = sprintf("DELETE FROM `%s` WHERE %s",$table,$where);

        $this->query($query);

    }

     

    # 상속한 부모 프라퍼티 값 포함한 가져오기

    public function __get($propertyName){

        if(property_exists(__CLASS__,$propertyName)){

            return $this->{$propertyName};

        }

    }

     

    # db close

    public function __destruct(){

        parent::close();

    }

}

? >


여기서 부터는

member 테이블이 있다고 가정하고

uid : 회원고유번호 userid : 아이디 name : 이름 passwd : 비밀번호 email : 이메일 정보 hp : 휴대폰 


1. 데이타 입력

2. 데이타 쿼리

3. 데이타 수정

4. 데이타 삭제  예문을 보겠습니다.


1.  insert 디비 저장 /-------------------

<?php

# 클래스 선언

$db = new DbMySqli();

 

# 디비 저장

$db['uid']      = 1;

$db['userid']   = 'apmsoft';

$db['passwd']   = 'pwd1004';

$db['name']     = '멋쟁이';

$db['email']    = 'apmsoft@test.com';

$db['hp']       = '010-3456-9876';

 

$db->insert();

?>


2. query  디비 쿼리 /---------------------------

/**

  일반적인 복수의 데이타 쿼리문

*/

< ?php

# 디비 선언

$db = new DbMySqli();

 

# 쿼리

$result = $db->query("SELECT * FROM `member` WHERE uid='1'");

while( $row = $result->fetch_assoc() )

{

       echo $row['uid'];

       echo $row['userid'];

       echo $row['name'];

}

? >


/**

    단순 데이타 쿼리문

*/

< ?php

# 디비 선언

$db = new DbMySqli();

 

# 쿼리

$row = $db->get_record('*', 'member',  "uid='1'");

 

echo $row['uid'];

echo $row['userid'];

echo $row['name'];

? >


3. update 디비 정보 수정 /----------------------------------

< ?php

# 디비선언

$db = new DbMySqli();

 

# 디비정보 수정

$db['name']     = '홍길동';

$db['email']    = 'ddd@gmail.com';

 

$db->update('member', "uid='1'");

? >


4. delete 디비 삭제 /----------------------------------------

< ?php

# 디비선언

$db = new DbMySqli();

 

# 디비정보 삭제하기

$db->delete('member', "uid='1'");

? >


'개발 > Mysql' 카테고리의 다른 글

mysql 백업및 복구  (0) 2018.11.10
PHP5 Exception 예외처리 사용 방법과 그 종류  (0) 2013.11.21
mysqli 일반 사용법  (1) 2013.11.21
mysql 패스워드분실시 변경방법  (0) 2012.02.05
myisam 자동복구 옵션  (0) 2012.02.05