如下所示:
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
65
66
67
68
69
70
71
72
73
74
75
|
/*
事务脚本模式: 类似于thinkphp中的model层,或者说就是操作数据库的类。
个人觉得实践中使用起来还是挺简单方便的,就是SQL语句写死了的话,灵活性就不够。
示例代码如下:
*/
namespace woo\process;
abstract class Base{
static $DB ; //pdo对象
static $stmts = array (); //sql语句句柄
function __construct (){
$dsn = \woo\base\ApplicationRegistry::getDSN();
if ( is_null ( $dsn )){
throw new \woo\base\AppException( "No DSN" );
}
self:: $DB = new PDO( $dsn );
self:: $DB ->setAttribute(\PDO::ATTR_ERRMODE,\PDO::ERRMODE_EXCEPTION);
}
function prepareStatement( $stmt_s ){ //缓存sql语句句柄
if (isset(self:: $stmts ( $stmt_s )){
return self:: $stmts [ $stmt_s ];
}
$stmt_handle = self:: $DB ->prepare( $stmt_s );
self:: $stmts [ $stmt_s ] = $stmt_handle ;
return $stmt_handle ;
}
protected function doStatement( $stmt_s , $values_a ){ //执行sql并获取一个语句资源
$sth = $this ->prepareStatement( $stmt_s );
$sth ->closeCursor();
$db_result = $sth ->execute( $values_a );
return $sth ;
}
}
//这个类就是向数据库中写入一些数据,比较简单没什么好多说的
class VenueManager extends Base{
static $add_venue = "INSERT INTO venue (name) values(?)" ;
static $add_space = "INSERT INTO space (name,venue) values(?,?)" ;
static $check_slot = "SELECT id,name FROM event WHERE space = ? AND (start+duration)>? AND start <?" ;
static $add_event = "INSERT INTO event (name,space,start,duration) values(?,?,?,?)" ;
function addVenue( $name , $space_array ){
$ret = array ();
$ret [ 'venue' ] = array ( $name );
$this ->doStatement(self:: $add_venue , $ret [ 'venue' ]);
$v_id = self:: $DB ->lastInsertId();
$ret [ 'spaces' ] = array ();
foreach ( $space_array as $space_name ){
$values = array ( $space_name , $v_id );
$this ->doStatement(self:: $add_space , $values );
$s_id = self:: $DB ->lastInsertId();
array_unshift ( $values , $s_id );
$ret [ 'spaces' ][] = $values ;
}
return $ret ;
}
function bookEvent ( $space_id , $name , $time , $duration ){
$values = array ( $space_id , $time ,( $time + $duration ));
$stmt = $this ->doStatement(self:: $check_slot , $values ,false);
if ( $result = $stmt ->fetch()){
throw new \woo\base\AppException( "double booked! try again" );
}
$this ->doStatement(self:: $add_event , array ( $name , $space_id , $time , $duration ));
}
}
//客户端,使用起来还是比较简便的
$venue = new VenueManager();
$venue ->addVenue( 'test' , array ( 'test1' , 'test2' , 'test3' ));
|
以上这篇PHP面向对象之事务脚本模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。