需要开启php的pdo支持,php5.1以上版本支持
实现数据库连接单例化,有三要素 静态变量、静态实例化方法、私有构造函数 DPDO.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
class DPDO{
private $DSN ;
private $DBUser ;
private $DBPwd ;
private $longLink ;
private $pdo ;
//私有构造函数 防止被直接实例化
private function __construct( $dsn , $DBUser , $DBPwd , $longLink = false) {
$this ->DSN = $dsn ;
$this ->DBUser = $DBUser ;
$this ->DBPwd = $DBPwd ;
$this ->longLink = $longLink ;
$this ->connect();
}
//私有 空克隆函数 防止被克隆
private function __clone(){}
//静态 实例化函数 返回一个pdo对象
static public function instance( $dsn , $DBUser , $DBPwd , $longLink = false){
static $singleton = array (); //静态函数 用于存储实例化对象
$singIndex = md5( $dsn . $DBUser . $DBPwd . $longLink );
if ( empty ( $singleton [ $singIndex ])) {
$singleton [ $singIndex ] = new self( $dsn , $DBUser , $DBPwd , $longLink = false);
}
return $singleton [ $singIndex ]->pdo;
}
private function connect(){
try {
if ( $this ->longLink){
$this ->pdo = new PDO( $this ->DSN, $this ->DBUser, $this ->DBPwd, array (PDO::ATTR_PERSISTENT => true));
} else {
$this ->pdo = new PDO( $this ->DSN, $this ->DBUser, $this ->DBPwd);
}
$this ->pdo->query( 'SET NAMES UTF-8' );
} catch (PDOException $e ) {
die ( 'Error:' . $e ->getMessage() . '<br/>' );
}
}
}
|
用于处理字段映射,使用pdo的字段映射,可以有效避免sql注入
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
//字段关联数组处理, 主要用于写入和更新数据、同and 或 or 的查询条件,产生sql语句和映射字段的数组
public function FDFields( $data , $link = ',' , $judge = array (), $aliasTable = '' ){
$sql = '' ;
$mapData = array ();
foreach ( $data as $key => $value ) {
$mapIndex = ':' . ( $link != ',' ? 'c' : '' ) . $aliasTable . $key ;
$sql .= ' ' . ( $aliasTable ? $aliasTable . '.' : '' ) . '`' . $key . '` ' . ( $judge [ $key ] ? $judge [ $key ] : '=' ) . ' ' . $mapIndex . ' ' . $link ;
$mapData [ $mapIndex ] = $value ;
}
$sql = trim( $sql , $link );
return array ( $sql , $mapData );
}
//用于处理单个字段处理
public function FDField( $field , $value , $judge = '=' , $preMap = 'cn' , $aliasTable = '' ) {
$mapIndex = ':' . $preMap . $aliasTable . $field ;
$sql = ' ' . ( $aliasTable ? $aliasTable . '.' : '' ) . '`' . $field . '`' . $judge . $mapIndex ;
$mapData [ $mapIndex ] = $value ;
return array ( $sql , $mapData );
}
//使用刚方法可以便捷产生查询条件及对应数据数组
public function FDCondition( $condition , $mapData ) {
if ( is_string ( $condition )) {
$where = $condition ;
} else if ( is_array ( $condition )) {
if ( $condition [ 'str' ]) {
if ( is_string ( $condition [ 'str' ])) {
$where = $condition [ 'str' ];
} else {
return false;
}
}
if ( is_array ( $condition [ 'data' ])) {
$link = $condition [ 'link' ] ? $condition [ 'link' ] : 'and' ;
list( $conSql , $mapConData ) = $this ->FDFields( $condition [ 'data' ], $link , $condition [ 'judge' ]);
if ( $conSql ) {
$where .= ( $where ? ' ' . $link : '' ) . $conSql ;
$mapData = array_merge ( $mapData , $mapConData );
}
}
}
return array ( $where , $mapData );
}
|
增删改查的具体实现DB.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
public function fetch( $sql , $searchData = array (), $dataMode = PDO::FETCH_ASSOC, $preType = array (PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)) {
if ( $sql ) {
$sql .= ' limit 1' ;
$pdoStatement = $this ->pdo->prepare( $sql , $preType );
$pdoStatement ->execute( $searchData );
return $data = $pdoStatement ->fetch( $dataMode );
} else {
return false;
}
}
public function fetchAll( $sql , $searchData = array (), $limit = array (0, 10), $dataMode = PDO::FETCH_ASSOC, $preType = array (PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY)) {
if ( $sql ) {
$sql .= ' limit ' . (int) $limit [0] . ',' . ( intval ( $limit [1]) > 0 ? intval ( $limit [1]) : 10);
$pdoStatement = $this ->pdo->prepare( $sql , $preType );
$pdoStatement ->execute( $searchData );
return $data = $pdoStatement ->fetchAll( $dataMode );
} else {
return false;
}
}
public function insert( $tableName , $data , $returnInsertId = false, $replace = false) {
if (! empty ( $tableName ) && count ( $data ) > 0){
$sql = $replace ? 'REPLACE INTO ' : 'INSERT INTO ' ;
list( $setSql , $mapData ) = $this ->FDFields( $data );
$sql .= $tableName . ' set ' . $setSql ;
$pdoStatement = $this ->pdo->prepare( $sql , array (PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$execRet = $pdoStatement ->execute( $mapData );
return $execRet ? ( $returnInsertId ? $this ->pdo->lastInsertId() : $execRet ) : false;
} else {
return false;
}
}
public function update( $tableName , $data , $condition , $mapData = array (), $returnRowCount = true) {
if (! empty ( $tableName ) && count ( $data ) > 0) {
$sql = 'UPDATE ' . $tableName . ' SET ' ;
list( $setSql , $mapSetData ) = $this ->FDFields( $data );
$sql .= $setSql ;
$mapData = array_merge ( $mapData , $mapSetData );
list( $where , $mapData ) = $this ->FDCondition( $condition , $mapData );
$sql .= $where ? ' WHERE ' . $where : '' ;
$pdoStatement = $this ->pdo->prepare( $sql , array (PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$execRet = $pdoStatement ->execute( $mapData );
return $execRet ? ( $returnRowCount ? $pdoStatement ->rowCount() : $execRet ) : false;
} else {
return false;
}
}
public function delete ( $tableName , $condition , $mapData = array ()) {
if (! empty ( $tableName ) && $condition ){
$sql = 'DELETE FROM ' . $tableName ;
list( $where , $mapData ) = $this ->FDCondition( $condition , $mapData );
$sql .= $where ? ' WHERE ' . $where : '' ;
$pdoStatement = $this ->pdo->prepare( $sql , array (PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));
$execRet = $pdoStatement ->execute( $mapData );
return $execRet ;
}
}
|
测试文件test.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
header( "Content-type: text/html; charset=utf-8" );
define( 'APP_DIR' , dirname( __FILE__ ));
if (function_exists( 'spl_autoload_register' )) {
spl_autoload_register( 'autoClass' );
} else {
function __auto_load( $className ){
autoClass( $className );
}
}
function autoClass( $className ){
try {
require_once APP_DIR. '/class/' . $className . '.php' ;
} catch (Exception $e ) {
die ( 'Error:' . $e ->getMessage() . '<br />' );
}
}
$DB = new DB();
//插入
$inData [ 'a' ] = rand(1, 100);
$inData [ 'b' ] = rand(1, 1000);
$inData [ 'c' ] = rand(1,200) . '.' . rand(1,100);
$ret = $DB ->insert( 'a' , $inData );
echo '插入' . ( $ret ? '成功' : '失败' ) . '<br/>' ;
//更新
$upConData [ 'a' ] = 100;
$upConJudge [ 'a' ] = '<' ;
$upConData [ 'b' ] = 30;
$upConJudge [ 'b' ] = '>' ;
list( $upConStr , $mapUpConData ) = $DB ->FDField( 'b' , 200, '<' , 'gt' );
$condition = array (
'str' => $upConStr ,
'data' => $upConData ,
'judge' => $upConJudge ,
'link' => 'and'
);
$upData [ 'a' ] = rand(1, 10);
$upData [ 'b' ] = 1;
$upData [ 'c' ] = 1.00;
$changeRows = $DB ->update( 'a' , $upData , $condition , $mapUpConData );
echo '更新行数:' . (int) $changeRows . '<br/>' ;
//删除
$delVal = rand(1, 10);
list( $delCon , $mapDelCon ) = $DB ->FDField( 'a' , $delVal );
$delRet = $DB -> delete ( 'a' , $delCon , $mapDelCon );
echo '删除a=' . $delVal . ( $delRet ? '成功' : '失败' ) . '<br/>' ;
//查询
$data [ 'a' ] = '10' ;
$judge [ 'a' ] = '>' ;
$data [ 'b' ] = '400' ;
$judge [ 'b' ] = '<' ;
list( $conSql , $mapConData ) = $DB ->FDFields( $data , 'and' , $judge );
$mData = $DB ->fetch( 'select * from a where ' . $conSql . ' order by `a` desc' , $mapConData );
var_dump( $mData );
|
以上所述就是本文的全部内容了,希望大家能够喜欢。