本文实例讲述了PHP数据库表操作的封装类及用法。分享给大家供大家参考,具体如下:
数据库表结构:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
CREATE TABLE `test_user` (
`id` int (11) NOT NULL AUTO_INCREMENT,
`username` varchar (45) NOT NULL ,
` password ` varchar (45) NOT NULL ,
`nickname` varchar (45) NOT NULL ,
`r` tinyint(4) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `test_blog` (
`id` int (11) NOT NULL AUTO_INCREMENT,
`user_id` int (11) NOT NULL ,
`title` varchar (45) NOT NULL ,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
设置字符编码:
?
1
|
header( 'Content-Type: text/html; charset=utf-8' );
|
引入Table类:
?
1
|
|
设置数据库参数:
?
1
2
3
4
5
|
Table:: $__host = '127.0.0.1:3306' ;
Table:: $__user = 'root' ;
Table:: $__pass = '123456' ;
Table:: $__name = 'test' ;
Table:: $__charset = 'utf8' ;
|
创建实体对象:
Table类有三个参数: $table, $pk, $pdo=null
$table: 表名称.
$pk: 主键名称. 不支持联合主键
$pdo: 独立的PDO对象. 一般不需要传
Notice: Table类是表操作的封装,不是Model层的基类,所以不支持表前缀,表前缀应该在Model层实现
?
1
2
|
$userTable = new Table( 'test_blog' );
$blogTable = new Table( 'test_blog' );
|
插入数据:
?
1
2
3
4
5
6
7
8
|
$user = array (
'username' => "admin1" ,
'password' => "admin1" ,
'nickname' => "管理员1" ,
'r' => mt_rand(0, 5),
);
echo $userTable ->insert( $user )->rowCount(), "\\n" ;
echo $userTable ->lastInsertId(), "\\n" ;
|
批量插入数据:
?
1
2
3
4
5
|
$fields = array ( 'username' , 'password' , 'nickname' , 'r' );
for ( $i =2; $i <=100; $i ++) {
$rows [] = array ( "admin$i" , "admin$i" , "管理员$i" , mt_rand(0, 5));
}
$userTable ->batchInsert( $fields , $rows );
|
查询所有数据:
select方法返回一个PDOStatement对象, fetchAll返回多行, fetch返回单行
?
1
|
var_dump( $userTable ->select()->fetchAll());
|
field自定义:
?
1
|
var_dump( $userTable ->select( 'id,nickname' )->fetchAll());
|
where查询:
?
1
|
var_dump( $userTable ->where( 'id > ?' , 50)->select()->fetchAll());
|
where and条件:
?
1
2
|
var_dump( $userTable ->where( 'id > ?' , 6)->where( 'id in (?)' , array (5,7,9))
->select()->fetchAll());
|
where or条件:
?
1
|
var_dump( $userTable ->where( 'id = ? OR id = ?' , 6, 8)->select()->fetchAll());
|
group分组 having过滤:
?
1
2
|
var_dump( $userTable ->group( 'r' )->having( 'c between ? and ?' , 10, 20)
->select( '*, r, count(*) as c' )->fetchAll());
|
order排序:
?
1
|
var_dump( $userTable ->order( 'r desc, id' )->select()->fetchAll());
|
limit 行数:
跳过30行 返回10行
?
1
|
var_dump( $userTable ->limitOffset(10, 30)->select()->fetchAll());
|
查询单行:
?
1
|
var_dump( $userTable ->where( 'id = ?' , 6)->select()->fetch());
|
根据主键查询数据:
?
1
|
var_dump( $userTable ->find(4));
|
update更新数据:
?
1
2
|
$user = array ( 'username' => 'admin4-1' , 'nickname' => '管理员4-1' , );
echo $userTable ->where( 'id = ?' , 4)->update( $user )->rowCount(), "\\n" ;
|
replace替换数据:
使用了MySQL的REPLACE语句
?
1
2
3
4
5
6
7
8
|
$user = array (
'id' => 4,
'username' => 'admin4' ,
'password' => 'admin4' ,
'nickname' => '管理员4' ,
'r' => mt_rand(0, 5),
);
echo $userTable ->replace( $user )->rowCount(), "\\n" ;
|
删除数据:
?
1
|
echo $userTable ->where( 'id = ?' , 4)-> delete ()->rowCount(), "\\n" ;
|
分页查询
第2页, 每页10行数据:
?
1
|
var_dump( $userTable ->page(2, 10)->select()->fetchAll());
|
分页查询的总行数:
?
1
2
3
|
$userTable ->where( 'r=?' , 3)->order( 'id desc' )->page(2, 10)
->select()->fetchAll();
echo $userTable -> count (), "\\n" ;
|
复杂查询:
?
1
2
3
|
var_dump( $userTable ->where( 'id > ?' , 1)->where( 'id < ?' , 100)
->group( 'r' )->having( 'c between ? and ?' , 1, 100)->having( 'c > ?' , 1)
->order( 'c desc' )->page(2, 3)->select( '*, count(*) as c' )->fetchAll());
|
自增:
?
1
2
3
4
5
6
7
|
$id = 2;
// 加一
var_dump( $userTable ->where( 'id = ?' , $id )->plus( 'r' )->find( $id ));
// 减一
var_dump( $userTable ->where( 'id = ?' , $id )->plus( 'r' , -1)->find( $id ));
// 多列
var_dump( $userTable ->where( 'id = ?' , $id )->plus( 'r' , 1, 'r' , -1)->find( $id ));
|
自增,并获得自增后的值:
?
1
2
3
4
5
|
$id = 2;
// 加一
echo $userTable ->where( 'id = ?' , $id )->incr( 'r' ), "\\n" ;
// 减一
echo $userTable ->where( 'id = ?' , $id )->incr( 'r' , -1), "\\n" ;
|
save 保存修改:
判断数据中是否存在主键字段,如果存在主键字段就update数据,反之insert数据
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
// 修改
$user = array (
'id' => 3,
'nickname' => '管理员3-3' ,
);
echo $userTable ->save( $user )->rowCount(), "\\n" ;
var_dump( $userTable ->find(3));
// 添加
$user = array (
'username' => 'admin11' ,
'password' => 'admin11' ,
'nickname' => '管理员11' ,
'r' => mt_rand(0, 5),
);
echo $userTable ->save( $user )->rowCount(), "\\n" ;
$id = $userTable ->lastInsertId();
var_dump( $userTable ->find( $id ));
|
生成外表测试数据:
?
1
2
3
4
5
6
7
8
9
10
11
12
|
$users = $userTable ->select( 'id' )->fetchAll();
$id = 0;
foreach ( $users as $user ) {
for ( $i =0; $i <10; $i ++) {
$id ++;
$blog = array (
'user_id' => $user [ 'id' ],
'title' => "blog$id" ,
);
$blogTable ->insert( $blog );
}
}
|
Table类不支持JOIN查询
需要的朋友可以手写sql语句,使用query方法来执行.或者自己修改Table类来支持JOIN
获取外表数据:
?
1
2
3
4
5
6
7
8
9
10
11
12
|
$blogs = $blogTable ->where( 'id in (?)' , array (1,12,23,34,56,67,78,89,90,101))
->select()->fetchAll();
// 获取外表数据 key为外表id value为外表行数据
var_dump( $userTable ->foreignKey( $blogs , 'user_id' )
->fetchAll(PDO::FETCH_UNIQUE));
var_dump( $userTable ->foreignKey( $blogs , 'user_id' , '*,id' )
->fetchAll(PDO::FETCH_UNIQUE));
var_dump( $userTable ->foreignKey( $blogs , 'user_id' , 'id,username,nickanem,id' )
->fetchAll(PDO::FETCH_UNIQUE));
// 获取外表数据 返回键值对数组 key为id value为username
var_dump( $userTable ->foreignKey( $blogs , 'user_id' , 'id,username' )
->fetchAll(PDO::FETCH_KEY_PAIR));
|
PDOStatement::fetchAll 示例:
?
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
|
// 获取映射数据
var_dump( $userTable ->select( '*, id' )->fetchAll(PDO::FETCH_UNIQUE));
// 获取数组
var_dump( $userTable ->select( 'nickname' )->fetchAll(PDO::FETCH_COLUMN));
// 获取键值对
var_dump( $userTable ->select( 'id, nickname' )->fetchAll(PDO::FETCH_KEY_PAIR));
// 获取数据分组
var_dump( $userTable ->select( 'r, id, nickname' )->fetchAll(PDO::FETCH_GROUP));
// 获取数据分组
var_dump( $userTable ->select( 'r, id' )->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_COLUMN));
// 获取数据分组
var_dump( $userTable ->select( 'r, nickname' )->fetchAll(PDO::FETCH_GROUP|PDO::FETCH_KEY_PAIR));
// 获取对象 指定获取方式,将结果集中的每一行作为一个属性名对应列名的对象返回。
var_dump( $userTable ->select()->fetchAll(PDO::FETCH_OBJ));
// 获取对象 指定获取方式,返回一个所请求类的新实例,映射列到类中对应的属性名。
// Note: 如果所请求的类中不存在该属性,则调用 __set() 魔术方法
var_dump( $userTable ->select()->fetchAll(PDO::FETCH_CLASS));
// 获取对象 指定获取方式,更新一个请求类的现有实例,映射列到类中对应的属性名。
var_dump( $userTable ->select()->fetchAll(PDO::FETCH_INTO));
// 获取自定义行
var_dump( $userTable ->select()->fetchAll(PDO::FETCH_FUNC, function ( $id , $username , $password , $r ){
return array ( 'id' => $id , 'name' => "$username - $password - $r" );
}));
// 获取单一值
var_dump( $userTable ->select()->fetchAll(PDO::FETCH_FUNC, function ( $id , $username , $password , $r ){
return "$id - $username - $password - $r" ;
}));
|
Table类源代码:
?
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
62
63
64
|