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

 更新时间:2017年06月07日 07:52:28   投稿:jingxian  
下面小编就为大家带来一篇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面向对象之事务脚本模式(详解)就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 超级简单的php+mysql留言本源码

    超级简单的php+mysql留言本源码

    超级简单的php+mysql留言本源码,需要的朋友可以参考下。
    2009-11-11
  • php 文件上传实例代码

    php 文件上传实例代码

    php 文件上传实例代码,php中上传文件就比asp的容易多了,代码量比较少
    2012-04-04
  • Laravel获取所有的数据库表及结构的方法

    Laravel获取所有的数据库表及结构的方法

    今天小编就为大家分享一篇Laravel获取所有的数据库表及结构的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • Laravel关系模型指定条件查询方法

    Laravel关系模型指定条件查询方法

    今天小编就为大家分享一篇Laravel关系模型指定条件查询方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • PHP ceil()函数浮点数向上取整实现示例

    PHP ceil()函数浮点数向上取整实现示例

    这篇文章主要为大家介绍了PHP ceil()函数实现浮点数向上取整示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • laravel 查询数据库获取结果实现判断是否为空

    laravel 查询数据库获取结果实现判断是否为空

    今天小编就为大家分享一篇laravel 查询数据库获取结果实现判断是否为空,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-10-10
  • 两种php给图片加水印的实现代码

    两种php给图片加水印的实现代码

    本文提供了两种php给图片加水印的实现代码,其中一种是添加文字水印,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2015-07-07
  • php使用异或实现的加密解密实例

    php使用异或实现的加密解密实例

    字符串的加密解密在数据的处理中应该是经常使用的,但MD5加密是不可逆的,所以自能自己动手写一个加密解密函数,思路很。网上看了几个用异或实现的思路,看懂后就自己写了一下。异或的思路很简单,用个公示简单的表示下吧
    2013-09-09
  • php之php.ini配置文件讲解案例

    php之php.ini配置文件讲解案例

    这篇文章主要介绍了php之php.ini配置文件讲解案例,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-08-08
  • php实例分享之二维数组排序

    php实例分享之二维数组排序

    PHP一维数组的排序可以用sort(),asort(),arsort()等函数,PHP二维数组的排序需要自定义。
    2014-05-05

最新评论