phaiapi数据库重写类

本文介绍了如何解决PhaiAPI框架中数据库查询结果将整型转换为字符串的问题,并通过重写数据库基类实现事务的嵌套使用。文中详细展示了修复方法的源代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

以上源码中,采用里简单粗暴的方式...

 

转载于:https://my.oschina.net/osgrace/blog/1544637

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值