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 相关文章推荐
web方式ftp
Oct 09 PHP
Smarty+QUICKFORM小小演示
Feb 25 PHP
PHPwind整合最土系统用户同步登录实现方法
Dec 08 PHP
php中serialize序列化与json性能测试的示例分析
Apr 27 PHP
thinkphp循环结构用法实例
Nov 24 PHP
php实现json编码的方法
Jul 30 PHP
php开发时容易忘记的一些技术细节
Feb 03 PHP
PHP入门教程之使用Mysqli操作数据库的方法(连接,查询,事务回滚等)
Sep 11 PHP
PHP 极验验证码实例讲解
Sep 29 PHP
PHP正则匹配反斜杠'\'和美元'$'的方法
Feb 08 PHP
php格式文件打开的四种方法
Feb 24 PHP
Laravel框架搜索分页功能示例
Feb 01 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
短波的认识
2021/03/01 无线电
php 网页播放器用来播放在线视频的代码(自动判断并选择视频文件类型)
2010/06/03 PHP
php计算两个文件相对路径的方法
2015/03/14 PHP
PHP基于phpqrcode生成带LOGO图像的二维码实例
2015/07/10 PHP
linux下php上传文件注意事项
2016/06/11 PHP
redis+php实现微博(二)发布与关注功能详解
2019/09/23 PHP
6个常见的 PHP 安全性攻击实例和阻止方法
2020/12/16 PHP
运用jquery实现table单双行不同显示并能单行选中
2009/07/25 Javascript
什么是JavaScript
2009/08/13 Javascript
30个最好的jQuery 灯箱插件分享
2011/04/25 Javascript
jQuery当鼠标悬停时放大图片的效果实例
2013/07/03 Javascript
jquery如何把数组变为字符串传到服务端并处理
2014/04/30 Javascript
详解JavaScript中setSeconds()方法的使用
2015/06/11 Javascript
学习Bootstrap组件之下拉菜单
2015/07/28 Javascript
Jqgrid之强大的表格插件应用
2015/12/02 Javascript
JS使用正则表达式实现关键字替换加粗功能示例
2016/08/03 Javascript
微信小程序之小豆瓣图书实例
2016/11/30 Javascript
利用HTML5+Socket.io实现摇一摇控制PC端歌曲切换
2017/01/13 Javascript
ndm:NPM的桌面GUI应用程序
2018/10/15 Javascript
微信小程序利用云函数获取手机号码
2019/12/17 Javascript
JavaScript 面向对象程序设计详解【类的创建、实例对象、构造函数、原型等】
2020/05/12 Javascript
vue实现页面切换滑动效果
2020/06/29 Javascript
Flask Web开发入门之文件上传(八)
2018/08/17 Python
python 运用Django 开发后台接口的实例
2018/12/11 Python
Python合并同一个文件夹下所有PDF文件的方法
2019/03/11 Python
Python 实现打印单词的菱形字符图案
2020/04/12 Python
Keras在训练期间可视化训练误差和测试误差实例
2020/06/16 Python
Python将list元素转存为CSV文件的实现
2020/11/16 Python
澳大利亚电子产品购物网站:Dick Smith
2017/02/02 全球购物
JD Sports丹麦:英国领先的运动时尚零售商
2020/11/24 全球购物
简短清晨问候语
2015/11/10 职场文书
工作报告范文
2019/06/20 职场文书
Python爬虫基础初探selenium
2021/05/31 Python
Python预测分词的实现
2021/06/18 Python
SQL实现LeetCode(175.联合两表)
2021/08/04 MySQL
《战锤40K:暗潮》跳票至9月 公布新宣传片
2022/04/03 其他游戏