2016-12-15 62 views
1

这是我的数据库类通过PDO持久连接MySQL的连接:为什么持久性PDO连接会与每个请求建立新连接?

class database{ 
    private $_db; 
    public function conn() 
    { 
     $user = 'xxx'; 
     $pass = 'xxxxxxx'; 
     try 
     { 
      $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true)); 
      $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
      $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
      return $this->_db; 
     } 

     catch(PDOException $e) 
     { 
      return "-1"; 
     } 
    } 

} 

我调用这个类中的另一个函数来查询数据库。每次我调用函数时,都会在数据库中创建一个新的连接。为什么持续的pdo连接为每个请求创建一个新的连接?

+2

如果你每次都做$ db = new database(); $ db-> conn();你将创建一个新对象,并且每次都定义一个新连接 – MacBooc

+0

在创建一个新的'conn()'方法之前,'conn()'方法不检查私有'$ _db'是否为空连接到你的数据库。 – WillardSolutions

回答

0

我正在使用我在项目开始时定义的静态类,唯一不好的部分就是您无法创建多个数据库。

<?php 

/** 
* 
************************************************ 
*     PlainFramework    * 
************************************************ 
* 
* Created by Niels Hamelink 
* File: class.database.php 
* Created at: 14-11-2016 02:08 
**/ 
class Database 
{ 
    private static $_db; 

    public static function connect($dsn, $username, $password, $debug) 
    { 
     try 
     { 
      $_db = new PDO($dsn, $username, $password); 
     } catch(PDOException $e) 
     { 
      if($debug) 
       Application::throw_error($e->getMessage()); 
     } 
    } 

    public static function close() 
    { 
     $_db = null; 
    } 

    public static function isConnected() 
    { 
     return isset($_db) 
      && $_db != null; 
    } 

    public static function getPDO() 
    { 
     if(!isset($_db)) 
      $_db = null; 

     return $_db; 
    } 

    public static function executeQuery(Query $query) 
    { 
     try 
     { 
      return Database::getPDO()->query($query->toString()); 
     } catch(PDOException $ex) 
     { 
      Application::throw_error($ex->getMessage()); 
     } 
    } 

} 
+0

为什么不让executeQuery()使用prepare/execute而不是查询? –

+0

另外我很好奇,什么是查询类? –

+0

@YourCommonSense我正在使用命名参数,这对于PDO查询功能是不可能的。 Query类是一个自定义的查询生成器(字符串生成器),所以我不必编写查询。 – DevNiels

1

您需要检查连接是否已经建立,然后再次连接。这可以通过添加一个快捷的方法到类,你的conn()方法内调用来完成 -

class database{ 
    private $_db; 

    private function isConnected() 
    { 
     return ($this->_db) ? TRUE : FALSE; 
    } 

    public function conn() 
    { 

     if ($this->isConnected()) 
     { 
      return $this->_db; 
     } else { 

      $user = 'xxx'; 
      $pass = 'xxxxxxx'; 
      try 
      { 
       $this->_db = new PDO('mysql:dbname=x;host=x.x.x.x',$user,$pass,array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',PDO::ATTR_PERSISTENT => true)); 
       $this->_db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
       $this->_db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
       return $this->_db; 
      } 

      catch(PDOException $e) 
      { 
       return "-1"; 
      } 
     } 
    } 

} 

此代码将返回现有连接(如果存在),或者一个新的,如果它没有。