如下所示:
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面向对象之事务脚本模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持服务器之家。