代码之家  ›  专栏  ›  技术社区  ›  icecub

PDO:MySQL服务器已经消失,无法捕获异常

  •  1
  • icecub  · 技术社区  · 8 年前

    一般说明
    我正在使用websockets(棘轮)开发一个聊天系统。聊天效果很好,但我的数据库类有一些问题。

    问题

    <?php
    
    Class Database {
        private $host = DB_HOST;
        private $user = DB_USER;
        private $pass = DB_PASS;
        private $dbname = DB_NAME;
    
        private $dbh;
        private $error;
    
        private $stmt;
    
        public function __construct(){
    
            if($this->dbh === null){
                $this->reconnect();
            }
        }
    
        private function reconnect(){
            // Set DSN
            $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
            // Set options
            $options = array(
                PDO::ATTR_PERSISTENT    => false,
                PDO::ATTR_ERRMODE       => PDO::ERRMODE_EXCEPTION
            );
            // Create a new PDO instanace
            try{
                $this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
            }
            // Catch any errors
            catch(PDOException $e){
                $this->error = $e->getMessage();
                return $this->error;
            }
        }
    
        /* Execute query */
        public function execute(){
            try{
                return $this->stmt->execute();
            }
            catch(PDOException $e){
                $this->reconnect();
    
                try{
                    return $this->stmt->execute();
                }
                catch(PDOException $e){
                    $this->error = $e->getMessage();
                    return $this->error;
                }
            }
        }
    

    当然,还有很多类似的方法,但这些方法并不重要。

    我遇到的错误如下:

    PHP致命错误:uncaughtpdoexception:SQLSTATE[HY000]:一般错误:2006 MySQL服务器在/var/www/clients/client1/web4/web/src/Pdo中消失了。php:43
    /var/www/clients/client1/web4/web/src/Pdo.php(43):PDOStatement->执行()

    这个错误指向 return $this->stmt->execute(); 在 execute() 方法。

    1. 当我清楚地抓住它的时候?
    2. PDO::ATTR_PERSISTENT => false,
    1 回复  |  直到 8 年前
        1
  •  4
  •   miken32 Amit D    8 年前

    catch (PDOException $e) 实际上是 catch (\Your\Namespace\PDOException $e)

    catch(\PDOException $e){
        $this->error = $e->getMessage();
        return $this->error;
    }
    

    或者 use

    use \PDOException;