phaiapi框架自带的,数据库处理类,
问题1:所有数据库int,查询结果全部变成sring
问题2:不能嵌套事物
fix 1:原因:PDO的一个参数
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);//grace 修复 int to sting 问题
fix2:事物本身不能嵌套使用
为了不影响原生框架类,决定重写数据库基类,然后注册服务
以下是源码:
<?php /** * Created by PhpStorm. * User: Administrator * Date: 2017/9/15 * Time: 14:12 */ namespace App\Common; use PDO; use PhalApi\Database\NotORMDatabase; /** * 重写数据库基类 * Class TourNotORMDatabase * @package App\Common */ class TourNotORMDatabase extends NotORMDatabase { /** * 事物计数个数 * @var int */ protected $transactions = 0; /** * 重写框架 createPDOBy 方法 * * 加入设置PDO ATTR_EMULATE_PREPARES false 修复 int to string 问题 * * 针对MySQL的PDO链接,如果需要采用其他数据库,可重载此函数 * @param array $dbCfg 数据库配置 * @return PDO */ protected function createPDOBy($dbCfg) { $dsn = sprintf('mysql:dbname=%s;host=%s;port=%d', $dbCfg['name'], isset($dbCfg['host']) ? $dbCfg['host'] : 'localhost', isset($dbCfg['port']) ? $dbCfg['port'] : 3306 ); $charset = isset($dbCfg['charset']) ? $dbCfg['charset'] : 'UTF8'; $pdo = new PDO( $dsn, $dbCfg['user'], $dbCfg['password'] ); $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);//grace 修复 int to sting 问题 $pdo->exec("SET NAMES '{$charset}'"); return $pdo; } /** ------------------ 事务操作 ------------------ **/ /** * 开启数据库事务 * @param string $whichDB 指定数据库标识 * @return NULL */ public function beginTransaction($whichDB) { ++$this->transactions; if ($this->transactions == 1) { $this->getPdo($whichDB)->beginTransaction(); } } /** * 提交数据库事务 * @param string $whichDB 指定数据库标识 * @return NULL */ public function commit($whichDB) { if ($this->transactions == 1) $this->getPdo($whichDB)->commit();; --$this->transactions; } /** * 回滚数据库事务 * @param string $whichDB 指定数据库标识 * @return NULL */ public function rollback($whichDB) { if ($this->transactions == 1) { $this->transactions = 0; $this->getPdo($whichDB)->rollback(); } else { --$this->transactions; } } }
数据库事物嵌套的,想法,来源
http://www.cnblogs.com/rrsina/p/4463589.html
以上源码中,采用里简单粗暴的方式...