> php教程 > PHP开发 > 본문

새로운 PDO 데이터베이스 작업 클래스 PHP 버전

高洛峰
풀어 주다: 2016-12-02 13:55:56
원래의
1107명이 탐색했습니다.

코드 복사

class HRDB{
protected $pdo;
protected $res
protected $config; */
function __construct($config){
$this->Config = $config;
$this->connect()
}

/*데이터베이스 연결* /
공용 함수 connect(){
$this->pdo = new PDO($this->Config['dsn'], $this->Config['name'], $ this- >Config['password']);
$this->pdo->query('set names utf8;')//결과를 stdClass로 직렬화
//$ this- >pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ)
//예외를 포착하는 코드 작성
$this->pdo->setAttribute(PDO:: ATTR_ERRMODE, PDO: :ERRMODE_EXCEPTION)
}

/*데이터베이스 닫기*/
공용 함수 close(){
$this->pdo = null
} 🎜>
공용 함수 쿼리($sql){
$res = $this->pdo->query($sql)
if($res){
$this-> ;res = $ res;
}
}
공용 함수 exec($sql){
$res = $this->pdo->exec($sql)
($res) {
$this->res = $res;
}
}
공용 함수 fetchAll(){
return $this->res->fetchAll( );
}
공용 함수 fetch(){
return $this->res->fetch()
}
공용 함수 fetchColumn(){
return $ this->res->fetchColumn();
}
public function lastInsertId(){
return $this->res->lastInsertId(); 🎜>/* *
* 매개변수 설명
* int $debug 디버깅 활성화 여부, 활성화하면 sql 문이 출력됩니다.
* 0 비활성화
* 1 활성화
* 2 프로그램 활성화 및 종료
* int $ 모드 반환 유형
* 0은 여러 레코드를 반환합니다.
* 1은 단일 레코드를 반환합니다.
* 2 행 수를 반환합니다.
* 문자열/배열 $table 데이터베이스 테이블, 두 개의 값- 통과 모드
* 일반 모드:
* 'tb_member, tb_money'
* 배열 모드:
* array('tb_member', 'tb_money')
* 문자열/배열 $fields 데이터베이스 필드 쿼리됨, 비어 있음 허용, 기본값은 모두 검색, 두 가지 값 전달 모드
* 일반 모드:
* '사용자 이름, 비밀번호'
* 배열 모드:
* 배열( 'username', 'password')
* 문자열/배열 $sqlwhere 쿼리 조건, 비어 있음 허용, 두 가지 값 전달 모드
* 일반 모드:
* 'and type = 1 및 사용자 이름은 "%os %"'
* 배열 모드 :
* array('type = 1', 'username like "%os%"')
* string $orderby 정렬, 기본값은 역순 ID입니다
*/
공개 함수 선택($debug, $mode, $table, $fields="*", $sqlwhere="", $orderby="tbid desc"){
//매개변수 처리
if(is_array($table)){
$table = implode(', ', $table)
}
if(is_array($fields)){
$fields = implode(', ', $fields);
}
if(is_array($sqlwhere)){
$sqlwhere = ' and '.implode(' and ', $sqlwhere) ;
}
//데이터베이스 작업
if($debug === 0){
if($mode === 2){
$this->query("select 1=1인 $table의 count(tbid) $sqlwhere");
$return = $this->fetchColumn();
}else if($mode === 1){
$ this-> query("$orderby에 따라 1=1 $sql에서 $fields 선택");
$return = $this->fetch(); $this-> ;query("1=1 $sql에서 $orderby로 주문한 $fields 선택")
$return = $this->fetchAll()
}
return $return;
}else{
if($mode === 2){
echo "1=1인 $sqlwhere에서 개수(tbid) 선택"
}else if( $mode == = 1){
echo "$table에서 $fields 선택, 여기서 1=1 $sqlwhere by $orderby";
}
else{
echo "$에서 $fields 선택 1= 1 $sqlwhere order by $orderby";
}
if($debug === 2){
exit;
}
}
}

/ **
* 매개변수 설명
* int $debug 디버깅 활성화 여부, 활성화되면 sql 문이 출력됩니다.
* 0 비활성화
* 1 활성화
* 2 프로그램 활성화 및 종료
* int $mode 반환 유형
* 0 반환 정보 없음
* 1 실행 항목 수 반환
* 2 마지막으로 삽입된 레코드의 ID 반환
* 문자열/배열 $table 데이터베이스 테이블, 두 가지 유형의 값 전달 모드
* 일반 모드:
* 'tb_member, tb_money'
* 배열 모드:
* array('tb_member', 'tb_money')
* string/array $set 필드 및 삽입할 콘텐츠, 두 가지 값 전달 모드
* 일반 모드:
* 'username = "test", type = 1, dt = now()'
* 배열 모드:
* array('username = "test"', 'type = 1', 'dt = now()')
*/
공용 함수 insert($debug, $mode, $table, $set){
//매개변수 처리
if(is_array( $table)){
$table = implode(', ', $table);
}
if(is_array($set)){
$set = implode(', ', $ set);
}
//데이터베이스 작업
if($debug === 0){
if($mode === 2){
$this->query( "$table set $set에 삽입");
$return = $this->lastInsertId()
}else if($mode === 1){
$this->exec ("$table set $set에 삽입");
$return = $this->res
}else{
$this->query("$table set $set에 삽입" );
$return = NULL;
}
return $return;
}else{
echo "$table set에 삽입"
if($debug == = 2){
exit;
}
}
}

/**
* 매개변수 설명
* int $debug 디버깅 활성화 여부, 활성화하면 sql 문이 출력됩니다.
* 0 비활성화
* 1 활성화
* 2 프로그램 활성화 및 종료
* int $ 모드 반환 유형
* 0 반환 정보 없음
* 1 실행 항목 수 반환
* 문자열 $table 데이터베이스 테이블, 두 가지 값 전달 모드
* 일반 모드:
* 'tb_member, tb_money'
* 배열 모드:
* array('tb_member', 'tb_money')
* string/array $set 업데이트해야 할 필드 및 내용, 두 개의 값 전달 모드
* 일반 모드:
* 'username = "test", 유형 = 1, dt = now()'
* 배열 모드:
* array('username = "test"', 'type = 1', 'dt = now()')
* 문자열/배열 $sqlwhere 조건 수정, 비어 있음, 두 가지 값 전달 모드 허용
* 일반 모드:
* 'and type = 1 및 사용자 이름은 "%os% "'
* 배열 모드:
* array('type = 1', 'username like "%os%"')
*/
공개 함수 업데이트($debug, $mode, $table , $set, $sqlwhere=""){
//매개변수 처리
if(is_array($table)){
$table = implode(', ', $table)
}
if(is_array($set)){
$set = implode(', ', $set)
}
if(is_array($sqlwhere)){
$sqlwhere = ' and '.implode(' and ', $sqlwhere)
}
//데이터베이스 작업
if($debug === 0){
if($mode === 1) {
$this->exec("update $table set $set where 1=1 $sqlwhere")
$return = $this->res
}else{
$ this->query("update $table set $set where 1=1 $sqlwhere");
$return = NULL
}
return $return; echo "update $table set $set where 1=1 $sqlwhere";
if($debug === 2){
exit
}
}
}

/**
* 매개변수 설명
* int $debug 디버깅 활성화 여부, 활성화하면 sql 문이 출력됩니다.
* 0 비활성화
* 1 활성화
* 2 프로그램 활성화 및 종료
* int $ 모드 반환 유형
* 0 반환 정보 없음
* 1 실행 항목 수를 반환
* string $table 데이터베이스 테이블
* 문자열/배열 $sqlwhere 삭제 조건, 허용됨 비어 있음, 두 가지 값 전달 모드
* 일반 모드:
* 'and type = 1 및 "%os%"와 같은 사용자 이름'
* 배열 모드:
* array('type = 1 ', '사용자 이름은 "%os %"'와 같습니다.
*/
공용 함수 delete($debug, $mode, $table, $sqlwhere=""){
//매개변수 처리
if(is_array($sqlwhere) ){
$sqlwhere = ' and '.implode(' and ', $sqlwhere)
}
//데이터베이스 작업
if($debug === 0){
if ($mode === 1){
$this->exec("1=1인 $sqlwhere에서 삭제")
$return = $this->res
} else{
$this->query("1=1 $sqlwhere에서 삭제")
$return = NULL
}
return $return; {
echo "1=1인 $sqlwhere에서 삭제";
if($debug === 2){
exit
}
}
}
}

사실 사용법은 이전과 크게 다르지 않습니다. 이식을 용이하게 하는 것이 목적입니다.

이번 재작성에서는 여러 가지 문제를 다루었습니다.

① insert 문이 너무 복잡하고, 필드와 값의 대응에 오류가 발생하기 쉽습니다.

가장 많이 살펴보겠습니다. 공통 sql insert 문

코드 복사 코드는 다음과 같습니다. tb_member (username, type, dt) 값에 삽입 ​​('test', 1, now())
기존 모드에서는 필드와 값 매개변수는 별도로 전달되지만 매개변수가 전달되는 순서가 일관성이 있는지 확인해야 합니다. 이로 인해 순서가 잘못되거나 매개변수가 누락될 수 있습니다.

이번에는 MySQL 고유의 삽입 구문을 사용하여 문제를 수정했습니다. 위와 동일한 함수를 이렇게 작성하면 됩니다.

코드 복사 코드는 다음과 같습니다. tb_member에 삽입합니다. set username = "test", type = 1, lastlogindt = now()
 업데이트와 마찬가지로 한 눈에 알 수 있습니다.

 ② 일부 매개변수는 배열로 대체 가능

예를 들어 다음 SQL문은

코드 복사 코드는 다음과 같습니다. delete from tb_member where 1=1 and tbid = 1 및 사용자 이름 = "만세"
원래 메소드를 호출할 때 where 조건을 수동으로 조합해야 했습니다. 이제 이 양식을 완전히 사용할 수 있습니다.
코드를 복사하세요. 다음과 같습니다:
$where = array(
'tbid = 1',
'username = "만세"'
)
$db->delete(1, 0, ' tb_member', $where);

아무리 많은 조건이 있어도 생각의 흐름을 방해하지 않습니다. 마찬가지로 where 매개변수뿐만 아니라 update의 set도 이 형식일 수 있습니다(자세한 내용은 전체 소스 코드 참조)

코드 복사 코드는 다음과 같습니다.
$set = array( 'username = "123" ', 'type = 1', 'lastlogindt = now()')
$where = array('tbid = 1')
$db->update(1, 0, 'tb_member', $set, $where);

  ③ 사용자 정의 가능한 SQL 문

때로는 sql이 너무 복잡해서 클래스에서 제공하는 메소드를 사용하여 sql을 조립할 수 없는 경우도 있습니다. 이때, 제가 조립한 sql문을 직접 전달하여 실행하고 정보를 반환하는 기능입니다. 이제 이 기능도 사용할 수 있습니다.

코드 복사 코드는 다음과 같습니다.
$db->query('select username, pass from tb_member'); >fetchAll( );

pdo의 원래 작성 방법과 매우 유사합니까?

 4 다중 데이터베이스 연결 생성 지원

원래는 데이터베이스 운영 방식일 뿐이므로 다중 데이터베이스 연결을 지원하지 않습니다. 구현 시 동일한 파일 2개를 복사하여 수정해야 합니다. 몇 가지 변수가 있습니다. 작업이 정말 복잡합니다. 이제 이 문제가 해결되었습니다.

코드 복사 코드는 다음과 같습니다.
$db_hoorayos_config = array(
'dsn'=>'mysql:host=localhost;dbname=hoorayos',
'name'= >' 루트',
'비밀번호'=>'만세'
)
$db = new HRDB($db_hoorayos_config)

$db_hoorayos_config2 = array(
'dsn' =>'mysql:host=localhost;dbname=hoorayos2',
'name'=>'root',
'password'=>'hooray'
); >$db2 = new HRDB($db_hoorayos_config2);

이러한 방식으로 데이터베이스 간 상호 작용 처리를 용이하게 하기 위해 2개의 데이터베이스 연결을 동시에 생성할 수 있습니다.

여기까지가 새로운 기능의 전부입니다. 전체 코드는 많지 않습니다. 읽고 이해하시면 됩니다. 다음은 제가 글을 작성할 때 작성한 테스트 코드이며, 누구나 배울 수 있도록 제공됩니다.

코드 복사
require_once('global.php')
require_once('inc/setting.inc.php')

$db = new HRDB ($db_hoorayos_config);

echo '


select test
'
echo '일반 모드에서 문자열을 직접 전달합니다. br> ;'
$rs = $db->select(1, 0, 'tb_member', '사용자 이름, 비밀번호', '및 유형 = 1 및 사용자 이름 "%os%"'); echo '
배열 모드에서는 배열을 전달할 수 있습니다
'
$fields = array('username', 'password')
$where = array('type = 1' , ' 사용자 이름은 "%os%"');
$rs = $db->select(1, 0, 'tb_member', $fields, $where)

echo '< hr> insert test
';
echo '일반 모드, 문자열을
$db->insert(1, 0, 'tb_member', 'username = "test", type = 1, lastlogindt = now()')
echo '
배열 모드에서는 배열을 전달할 수 있습니다
';$set = array('username = "test"', 'type = 1', 'lastlogindt = now()')
$db->insert(1, 0, 'tb_member', $set);

echo '
업데이트 테스트
';
echo '일반 모드,
$에 문자열을 직접 전달합니다. db->update(1, 0, 'tb_member', 'username = "123", type = 1, lastlogindt = now()', 'and tbid = 7')
echo '';
$set = array('username = "123"', 'type = 1', 'lastlogindt = now()')
$where = array('tbid = 1');
$db->update(1, 0, 'tb_member', $set, $where)

echo '
delete test


';
echo '일반 모드,
$db->delete(1, 0, 'tb_member' , 'and tbid = 1 및 사용자 이름 = "만세"');
echo '
배열 모드에서는 배열을 전달할 수 있습니다
'; $where = array(
'tbid = 1 ',
'username = "만세"'
)
$db->delete(1, 0, 'tb_member', $where)

echo '< ;hr> ;사용자 정의 SQL
';
$db->query('tb_member에서 사용자 이름, 비밀번호 선택')
$rs = $db-> ;fetchAll( );
var_dump($rs)

$db->close();
관련 라벨:
php
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 추천
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿