/*

事务脚本模式: 类似于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事务讲解,PHP面向对象之事务脚本模式(详解)相关推荐

  1. php事务 面向对象,PHP面向对象之事务脚本模式(详解)

    如下所示: /* 事务脚本模式: 类似于thinkphp中的model层,或者说就是操作数据库的类. 个人觉得实践中使用起来还是挺简单方便的,就是SQL语句写死了的话,灵活性就不够. 示例代码如下: ...

  2. 【elasticsearch】Elasticsearch 7.X Scripting 脚本使用详解

    1.概述 转载:Elasticsearch 7.X Scripting脚本使用详解 0.题记 除了官方文档,其他能找到的介绍Elasticsearch脚本(Scripting)的资料少之又少. 一方面 ...

  3. Scala进阶之路-面向对象编程之类的成员详解

    Scala进阶之路-面向对象编程之类的成员详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Scala中的object对象及apply方法 1>.scala 单例对象 ...

  4. fofa自动化爬虫脚本更新+详解

    fofa自动化爬虫脚本更新+详解 起因 最近要用到fofa爬虫,为什么要用爬虫不用api,问就是穷,想起来之前写过一个相关的脚本:Fofa-python-脚本,是很久以前写的了,之前写的时候有点问题, ...

  5. rcs开机启动mysql_linux添加开机自启动脚本示例详解-阿里云开发者社区

    linux添加开机自启动脚本示例详解 double2li 2017-04-14 1652浏览量 简介: linux下(以RedHat为范本)添加开机自启动脚本有两种方法,先来简单的;一.在/etc/r ...

  6. python的类和对象_Python面向对象之类和对象实例详解

    本文实例讲述了Python面向对象之类和对象.分享给大家供大家参考,具体如下: 类和对象(1) 对象是什么? 对象=属性(静态)+方法(动态): 属性一般是一个个变量:方法是一个个函数: #类的属性 ...

  7. java dtu 采集程序_DTU脚本编程_本地采集脚本指令详解

    前言: 通过配置DTU的脚本指令实现DTU定时自动采集,用户只需知道外接仪表.无需再单独增加控制器传感器的采集流程,然后通过编写脚本指令即可让DTU按照用户的流程自动采集.上传数据.脚本实现了基本的开 ...

  8. 分布式事务(Seata) 四大模式详解

    前言 在上一节中我们讲解了,关于分布式事务和seata的基本介绍和使用,感兴趣的小伙伴可以回顾一下<别再说你不知道分布式事务了!> 最后小农也说了,下期会带给大家关于Seata中关于sea ...

  9. 什么是分布式事务Seata?Seata的几种事务模式详解

    最后更新于:2020-04-08 17:37 目录 概念 发展历程 核心组件 三种事务模式 AT模式 前提 一个分布式事务在Seata中的执行流程 Seata 的事务提交方式与 XA 协议的两段式提交 ...

最新文章

  1. CSP 2019-09-1 小明种苹果 Python实现+详解
  2. 电商那些年,我摸爬打滚出的高并发架构实战精髓
  3. 执行COUNT(1)、COUNT(*) 与 COUNT(列名) 到底有什么区别?
  4. 程序幽默:会让程序员争论起来的几个话题
  5. maven(6)仓库
  6. “电脑人才”是怎么炼成的
  7. 克隆git文件_如何在Git中克隆,修改,添加和删除文件
  8. Kafka : kafka无法消费的情况
  9. typora代码块语言linux命令,typora工具的使用以及MarkDown语法
  10. 博弈——无向图删边游戏
  11. 泛型与容器连载(一)泛型的基本概念和原理
  12. 了解为什么要使用微服务!
  13. 蕊动矿机linux cpu超频,蚂蚁l3矿机超频方法!最佳超频参数!  |  呆毛网
  14. Linux系统上QQ闪退的问题
  15. 大厂团队协作工具推荐
  16. 5款知名bug管理工具
  17. CentOS7防火墙关闭
  18. 点击按钮复制文本框内容
  19. webpack中的style-resources-loader加载全局css变量
  20. 2022年中职——网络搭建国赛windows脚本写法(正式题详细解析)

热门文章

  1. Java基本数据类型总结(转)
  2. 女人水润有诀窍,菜谱保你水灵灵 - 生活至上,美容至尚!
  3. php 中 map和array,浅析php中array_map和array_walk的使用对比
  4. android7.0 Jack编译器报错解决
  5. Common lisp之加载方式(一)
  6. git diff生成patch用法
  7. ios libfdk-aac encode
  8. wpf之blend之自定义最小化按钮
  9. VSCode之调试html
  10. seqkit根据基因id_ID转换靠的是深厚的背景知识加上一点代码技巧