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


Posted in PHP onJune 07, 2017

如下所示:

/*
事务脚本模式: 类似于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 相关文章推荐
建立文件交换功能的脚本(一)
Oct 09 PHP
留言板翻页的实现详解
Oct 09 PHP
让你同时上传 1000 个文件 (一)
Oct 09 PHP
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
删除及到期域名的查看(抢域名必备哦)
May 14 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
May 08 PHP
PHP实现生成透明背景的PNG缩略图函数分享
Jul 08 PHP
PHP清除数组中所有字符串两端空格的方法
Oct 20 PHP
PHP5.2中PDO的简单使用方法
Mar 25 PHP
Linux(CentOS)下PHP扩展PDO编译安装的方法
Apr 07 PHP
PHP实现数据分页显示的简单实例
May 26 PHP
php实现单笔转账到支付宝功能
Oct 09 PHP
PHP框架自动加载类文件原理详解
Jun 06 #PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 #PHP
Yii 2.0在Grid中格式化时间方法示例
Jun 06 #PHP
解决php-fpm.service not found问题的办法
Jun 06 #PHP
PHP使用new StdClass()创建空对象的方法分析
Jun 06 #PHP
php 7新特性之类型申明详解
Jun 06 #PHP
thinkPHP+phpexcel实现excel报表输出功能示例
Jun 06 #PHP
You might like
一个数据采集类
2007/02/14 PHP
关于使用key/value数据库redis和TTSERVER的心得体会
2013/06/28 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
PHP实现的文件上传类与用法详解
2017/07/05 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
jquery validate在ie8下的bug解决方法
2013/11/13 Javascript
jquery数组封装使用方法分享(jquery数组遍历)
2014/03/25 Javascript
随鼠标移动的时钟非常漂亮遗憾的是只支持IE
2014/08/12 Javascript
Jquery使用val方法读写value值
2015/05/18 Javascript
JS判断字符串字节数并截取长度的方法
2016/03/05 Javascript
浅析jquery如何判断滚动条滚到页面底部并执行事件
2016/04/29 Javascript
Bootstrap3学习笔记(二)之排版
2016/05/20 Javascript
基于vuejs+webpack的日期选择插件
2020/05/21 Javascript
Bootstrap fileinput 上传新文件移除时触发服务器同步删除的配置
2018/10/08 Javascript
vue读取本地的excel文件并显示在网页上方法示例
2019/05/29 Javascript
微信小程序 select 下拉框组件功能
2019/09/09 Javascript
vue数据更新UI不刷新显示的解决办法
2020/08/06 Javascript
Vue实现点击当前行变色
2020/12/14 Vue.js
[02:25]DOTA2英雄基础教程 虚空假面
2014/01/02 DOTA
python解析xml模块封装代码
2014/02/07 Python
python调用短信猫控件实现发短信功能实例
2014/07/04 Python
在python中将字符串转为json对象并取值的方法
2018/12/31 Python
python障碍式期权定价公式
2019/07/19 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
python 给图像添加透明度(alpha通道)
2020/04/09 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
html5拖曳操作 HTML5实现网页元素的拖放操作
2013/01/02 HTML / CSS
马来西亚综合购物网站:Lazada马来西亚
2018/06/05 全球购物
贝斯特韦斯特酒店集团官网:Best Western
2019/01/03 全球购物
南京迈特望C/C++面试题
2012/07/09 面试题
大学生年度自我鉴定
2013/10/31 职场文书
会计专业大学生职业生涯规划范文
2014/01/11 职场文书
小学教师节活动方案
2014/01/31 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
高中地理教学反思
2016/02/19 职场文书