php事务 面向对象,关于PHP面向对象的事务脚本模式

下面为大家带来一篇PHP面向对象之事务脚本模式(详解)。内容挺不错的,现在就分享给大家,也给大家做个参考。

如下所示:

/*

事务脚本模式: 类似于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中文网!

相关推荐:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/270991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

分布式数据库相关概念介绍

1、分布式数据库的概念分布式数据库系统(Distributed Database System,DDBS)是针对面向地理上分散,而管理上有需要不同程度集中管理的需求而提出的一种数据库管理信息系统。2、分布式数据库系统组成LDBMS(Local DBMS):…

社会管理网格化 源码_为什么说网格化管理是基层社会治理的有效武器

在社会治安综合治理中网格化管理是当前各地加强基层社会治理的一种有效“武器”。为什么要说网格化管理是基层社会治理的有效“武器”?这就要为大家讲讲以下几点了,好让大家清楚的明白为什么。网格化管理适应当代社会的基本特性。网格化服务管理是当前城…

【Time系列一】datetime的妙用

今天在弄个自动关机小脚本的时候,遇到了时间转换的问题,也难怪,以前没学过, 不能怪我不会哦! 首先,先学会打印出当前时间的几种方式 参考开源社区: http://my.oschina.net/u/1032854/blog/198179#OSC_h1_3 菜鸟编程:…

循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展

循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展

JS树结构操作:查找、遍历、筛选、树结构和列表结构相互转换

经常有同学问树结构的相关操作,也写了很多次,在这里总结一下 JS 树形结构一些操作的实现思路,并给出了简洁易懂的代码实现。本文内容结构大概如下:JS树结构相关操作1遍历树结构1. 树结构介绍JS中树结构一般是类似于这样的结构&…

python框架django的使用_Django框架的基本使用,若依框架

Django框架的基本使用,若依框架Django框架的基本使用Django是一个功能强大的web框架框架模式1、MVC和MTV框架MVC:Web服务器开发领域里著名的MVC模式,所谓MVC就是把Web应用分为模型(M),控制器(C)和视图(V)三层,结构说明…

初学js

今天开始接触js,知道了js的功能以及学习的意义, 今天从命名的规范和数值的规则就能看出js是1门非常严谨的课程,只有做好细节才能体现出js的强大之处, var是定义一个名字 var name1; 定义了还能赋值,可以是数…

数据库:SQLServer中GUID用法介绍

今天给大家分享一下SQLServer中生成GUID的用法。一、NEWID用法NEWID()作用是生成无顺序的GUID字符串。用法如下:SELECT NEWID() --生成36位的GUIDSELECT REPLACE(newid(), -, ) -- 生成32 位的GUID二、NEWSEQUENTIALID用法1、NEWSEQUENTIALID是什么?在指…

oracle po:默认申请分组,PR自动创建PO采购订单:强制按照PR行进行分组

有时候,需要实现强制按照PR行来自动创建PO。举个例子:假设2张PR,同一个物料,同一个需求日期等等的,在合并采购订单的时候,希望是2个PO行。按照标准功能的处理逻辑,如果是同一个物料需求日期(配置…

cserialport 循环发送信号_C++信号处理

免费C语言教程:阿里云大学——开发者课堂(点击文章最下方“了解更多”)信号是由操作系统传给进程的中断,会提早终止一个程序。在 UNIX、LINUX、Mac OS X 或 Windows 系统上,可以通过按 CtrlC 产生中断。有些信号不能被程序捕获,但…

Javascript第一天

引入的三种方法&#xff1a; 1、将javascript代码插入html文档<head>部分的<script>标签中 例&#xff1a;<head> <script type“text/javascript”> //javascript 代码 alert(‘hello world’); </script> </head> 2、将javascript代码存…

不要在foreach循环里进行元素的remove/add操作。remove元素请使用iteratot方式,如果并发操作,需要对Iterator对象加锁

不要在foreach循环里进行元素的remove/add操作。remove元素请使用iteratot方式&#xff0c;如果并发操作&#xff0c;需要对Iterator对象加锁

Win7和Win10操作系统优劣对比,看完你就懂了!

一直以来&#xff0c;针对微软的Windows系统讨论最热烈的莫过于win7和win10系统了&#xff0c;两者究竟谁好谁坏&#xff1f;小编今天就带大家从几个不同的角度分析两者的优缺点&#xff0c;如有不对&#xff0c;欢迎大家指正&#xff01;一、win 7系统的几大特点&#xff1a;1…

linux bash命令找不到,Linux下提示命令找不到:bash:command not found

Linux下输入某些命令时会提示&#xff1a;bash:command not found。首先&#xff0c;查看$PATH中是否包含了这些命令。$PATH&#xff1a;决定了shell到哪些目录中去寻找命令或程序&#xff0c;PATH值是一系列的目录。当运行程序时&#xff0c;linux到这些目录下搜索进行编译链接…

dhcp 续约review报文_Linux的私房菜 DHCP

译DHCP服务DHCP的全称是动态主机配置协议&#xff0c;用来自动给客户机分配TCP/IP信息的网络协议。Dynamic Host Configuration Protocol&#xff0c;前身是BOOTP协议&#xff0c;是一个局域网的网络协议&#xff0c;使用UDP协议工作&#xff0c;统一使用两个IANA分配的端口&am…

硬件编程:硬件开发中常用的几种通信接口总结

在嵌入式系统中&#xff0c;板上通信接口是指用于将各种集成电路与其他外围设备交互连接的通信通路或总线。以下内容为常用板上通信接口&#xff1a;包括I2C、SPI、UART、1-Wire&#xff1a;I2C总线I2C总线是一种同步、双向、半双工的两线式串行接口总线。这里&#xff0c;半双…

集合初始化时,指定集合初始值大小

集合初始化时&#xff0c;指定集合初始值大小

hadoop常用linux命令,# Hadoop学习笔记(二)——Linux常用命令

ifconfigLinux ifconfig命令用于显示或设置网络设备。ifconfig可设置网络设备的状态&#xff0c;或是显示目前的设置。ifconfig.png语法ifconfig [网络设备][down up -allmulti -arp -promisc][add][del][][io_addr][irq][media][mem_start][metric][mtu][netmask][tunnel][-br…

数据库:计算地球上两个坐标点之间里程

今天给大家分享计算地球上两个坐标点之间里程不同数据库版本的脚本。1、SQLServer脚本–-计算地球上两个坐标点&#xff08;经度&#xff0c;纬度&#xff09;之间距离sql函数 CREATE FUNCTION [dbo].[fnGetDistance](LatBegin REAL , LngBegin REAL, LatEnd REAL, LngEnd REA…