这是我通过PDO持久连接连接MySQL的数据库类:
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连接会根据请求建立新连接?
答案 0 :(得分: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";
}
}
}
}
此代码将返回现有连接(如果存在),如果不存在,则返回新连接。
答案 1 :(得分: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());
}
}
}