2013. 11. 21. 07:37ㆍ개발/Mysql
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 |