新しいPDOデータベース操作クラスphp版(Mysqlのみ)

13017 ワード

 
  
/**
* :
* :2012/07/21
* :[email protected]
*/

class HRDB{
protected $pdo;
protected $res;
protected $config;

/* */
function __construct($config){
$this->Config = $config;
$this->connect();
}

/* */
public function 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);
// Exception
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}

/* */
public function close(){
$this->pdo = null;
}

public function query($sql){
$res = $this->pdo->query($sql);
if($res){
$this->res = $res;
}
}
public function exec($sql){
$res = $this->pdo->exec($sql);
if($res){
$this->res = $res;
}
}
public function fetchAll(){
return $this->res->fetchAll();
}
public function fetch(){
return $this->res->fetch();
}
public function fetchColumn(){
return $this->res->fetchColumn();
}
public function lastInsertId(){
return $this->res->lastInsertId();
}

/**
*
* int $debug , sql
* 0
* 1
* 2
* int $mode
* 0
* 1
* 2
* string/array $table ,
* :
* 'tb_member, tb_money'
* :
* array('tb_member', 'tb_money')
* string/array $fields , , ,
* :
* 'username, password'
* :
* array('username', 'password')
* string/array $sqlwhere , ,
* :
* 'and type = 1 and username like "%os%"'
* :
* array('type = 1', 'username like "%os%"')
* string $orderby , id
*/
public function select($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 count(tbid) from $table where 1=1 $sqlwhere");
$return = $this->fetchColumn();
}else if($mode === 1){
$this->query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
$return = $this->fetch();
}else{
$this->query("select $fields from $table where 1=1 $sqlwhere order by $orderby");
$return = $this->fetchAll();
}
return $return;
}else{
if($mode === 2){
echo "select count(tbid) from $table where 1=1 $sqlwhere";
}else if($mode === 1){
echo "select $fields from $table where 1=1 $sqlwhere order by $orderby";
}
else{
echo "select $fields from $table where 1=1 $sqlwhere order by $orderby";
}
if($debug === 2){
exit;
}
}
}

/**
*
* int $debug , sql
* 0
* 1
* 2
* int $mode
* 0
* 1
* 2 id
* string/array $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()')
*/
public function 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("insert into $table set $set");
$return = $this->lastInsertId();
}else if($mode === 1){
$this->exec("insert into $table set $set");
$return = $this->res;
}else{
$this->query("insert into $table set $set");
$return = NULL;
}
return $return;
}else{
echo "insert into $table set $set";
if($debug === 2){
exit;
}
}
}

/**
*
* int $debug , sql
* 0
* 1
* 2
* int $mode
* 0
* 1
* string $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()')
* string/array $sqlwhere , ,
* :
* 'and type = 1 and username like "%os%"'
* :
* array('type = 1', 'username like "%os%"')
*/
public function update($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;
}else{
echo "update $table set $set where 1=1 $sqlwhere";
if($debug === 2){
exit;
}
}
}

/**
*
* int $debug , sql
* 0
* 1
* 2
* int $mode
* 0
* 1
* string $table
* string/array $sqlwhere , ,
* :
* 'and type = 1 and username like "%os%"'
* :
* array('type = 1', 'username like "%os%"')
*/
public function delete($debug, $mode, $table, $sqlwhere=""){
//
if(is_array($sqlwhere)){
$sqlwhere = ' and '.implode(' and ', $sqlwhere);
}
//
if($debug === 0){
if($mode === 1){
$this->exec("delete from $table where 1=1 $sqlwhere");
$return = $this->res;
}else{
$this->query("delete from $table where 1=1 $sqlwhere");
$return = NULL;
}
return $return;
}else{
echo "delete from $table where 1=1 $sqlwhere";
if($debug === 2){
exit;
}
}
}
}

実は使用上、これまでとあまり差がなく、移植を容易にすることを目的としています.
今回の書き換えでは、いくつかの問題に焦点を当てました.
①insert文が複雑すぎて、fieldsとvaluesの対応に誤差が出やすい
最も一般的なsql挿入文を見てみましょう

   insert into tb_member (username, type, dt) values ('test', 1, now()) 
 

従来のモードではfieldsパラメータとvaluesパラメータは別々に伝達されるが,両者のパラメータ伝達の順序が一致することを保証しなければならない.これは、順序が乱れたり、パラメータが漏れたりしやすい.
今回は問題を修正しましたが、mysql独自のinsert文法を採用しています.同じように上の機能で、このような書き方に変えることができます.

   insert into tb_member set username = "test", type = 1, lastlogindt = now() 
 

updateのように、一目瞭然です.
②一部パラメータは配列で代用可能
例えばこのようなsql

   delete from tb_member where 1=1 and tbid = 1 and username = "hooray" 
 

メソッドを呼び出すときは、where条件を手動で組み立てる必要があります.このような操作はコストが高く、今では完全にこの形式で使用できます.
 
  
$where = array(
'tbid = 1',
'username = "hooray"'
);
$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, password from tb_member');
$rs = $db->fetchAll();

pdo原生態の書き方に似ているのではないでしょうか.
④マルチデータベース接続の作成サポート
従来はデータベース操作方法のみであったため、マルチデータベース接続はサポートされておらず、実装上は同じファイルを2つコピーし、変数の一部を修正する必要があり、操作は複雑であった.今この問題も解決した.
 
  
$db_hoorayos_config = array(
'dsn'=>'mysql:host=localhost;dbname=hoorayos',
'name'=>'root',
'password'=>'hooray'
);
$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
';
echo ' ,
';
$rs = $db->select(1, 0, 'tb_member', 'username, password', 'and type = 1 and username like "%os%"');
echo '

';
$fields = array('username', 'password');
$where = array('type = 1', 'username like "%os%"');
$rs = $db->select(1, 0, 'tb_member', $fields, $where);

echo '
insert
';
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 '
update
';
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
';
echo ' ,
';
$db->delete(1, 0, 'tb_member', 'and tbid = 1 and username = "hooray"');
echo '

';
$where = array(
'tbid = 1',
'username = "hooray"'
);
$db->delete(1, 0, 'tb_member', $where);

echo '
sql
';
$db->query('select username, password from tb_member');
$rs = $db->fetchAll();
var_dump($rs);

$db->close();

作者:胡�睿丶