php PDO mysql问题解决

由于公司需要做一个php的客户端,需要有多线程和数据操作,于是选用tp的DB类加以改用。

问题:

1、测试mysql是否连接正常

private function pdo_ping(){
      try{
        $this->pdo->getAttribute(PDO::ATTR_SERVER_INFO);
      } catch (PDOException $e) {
        $this->connect();
        echo "mysql reconnect success\n\t";
      }
  }

若连接不正常则重新连接

1、事务报错

可能由于已经开启一个数据库事务,在其未提交或撤回期间再开一个事务则报错。

修改代码如下:

  public function beginTransaction(){
        ++$this->transactionLevel;
        if(1==$this->transactionLevel){

            $this->pdo_ping();

            return $this->pdo->beginTransaction();    
        }
    }
    public function commit(){
        return $this->endTransaction(__FUNCTION__);
    }
    public function rollback(){
        return $this->endTransaction(__FUNCTION__);
    }
    private function endTransaction($method){
        $r=true;
        if(1==$this->transactionLevel){
            if(method_exists($this->pdo,$method)){

               $this->pdo_ping();               

               $r=$this->pdo->$method();    
            }
            $this->transactionLevel=0;    
        }else{
            $this->transactionLevel--;
        }
        return $r;    
    }

解释:

若为第一次开始事务 beginTransaction则正常开启,否则不做处理,commit、rollback进行$this->transactionLevel归零做正常处理,否则$this->transactionLevel减一。

2、连接超时

sql语句正确执行query时报错:MySQL server has gone away 是和mysql的连接断开了。

修改代码如下:

   public function query($query)
    {
        $this->pdo_ping();
        $this->queryString = $query;
        try {
            $r=$this->pdo->query($query);    
        } catch (PDOException $e) {
            $this->connect();
            $r=$this->pdo->query($query);
        }
        return $r;
    }

解释:

用try catch 判断$this->pdo->query()是否正常,不正常则重新连接,异常一定要用PDOException获取。

用这个流程写的客户端后来还是被费了,php多线程再windows环境下不稳定,当时没有用swoole和redis觉得麻烦。后改为java连的后台的对应的接口,用接口不用担心mysql连接的问题,而且还更安全。

相关连接:

http://blog.csdn.net/jelope/article/details/11964983

http://blog.csdn.net/hello_katty/article/details/45220825

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lsswear

感谢大佬打赏 q(≧▽≦q)

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值