【发布时间】:2014-05-14 09:35:17
【问题描述】:
在 teresko 的帮助下,我设法实现了工厂设计方法,以便只连接到我的数据库一次(这就是我的想法),但现在我收到此错误:
致命错误:未捕获的异常 'PDOException' 带有消息 'SQLSTATE[08004] [1040] Too many connections' in
然后它继续描述不同地方的大约 8 种不同的连接。我怎么会建立这么多联系?
这是我的工厂类:
namespace App\Core;
class structureFactory
{
protected $provider = null;
protected $connection = null;
public function __construct( callable $provider )
{
$this->provider = $provider;
}
public function create( $name)
{
if ( $this->connection === null )
{
$this->connection = call_user_func( $this->provider );
}
return new $name( $this->connection );
}
}
因为我只需要模型类中的连接,所以我创建了一个 baseModel 类,它从 structureFactory 获取数据库连接,如下所示:
namespace App\Core\Models;
use App\Core\structureFactory as SF;
abstract class baseModel {
public $getConnection;
protected function getAdapter() {
$this->getConnection = function() {
$m_rdbms = 'mysql';
$m_host = 'localhost';
$m_db_name = 'cvcms';
$m_host_name = $m_rdbms . ':host=' . $m_host. ';dbname=' . $m_db_name;
$m_uname = 'root';
$m_pwd ='';
$instance = new \PDO($m_host_name, $m_uname, $m_pwd);
$instance->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
$instance->setAttribute(\PDO::ATTR_EMULATE_PREPARES, false);
return $instance;
};
$factory = new SF($this->getConnection);
return $factory->create('App\\Core\\Models\\DAL');
}
}
所以这基本上是用getConnection函数中的Connection创建一个新的SF,然后返回一个新的DAL。
这是我的控制器的一个例子,它创建了一个新的 DAL 并调用了函数 safeQuery:
namespace App\Frontend\Base\Index;
use App\Frontend\Base\baseController as base;
use App\Core\Models\DAL as DAL;
class indexController extends base{
public $data;
public function __construct(){
parent::__construct();
}
function indexMethod(){
$query = "SELECT site_data FROM site_data WHERE site_data = :name;";
$args = array(":name" => 'site_name');
$this->data = new DAL;
$this->data = $this->data->safeQuery($query,$args);
}
function render(){
//Render the index template/view parsing the data acquired from model.
}
}
在我的 DAL 构造中,我通过从 baseModel 获取连接将连接存储在一个局部变量中:
use App\Core\Models\baseModel as BM;
class DAL extends BM {
private $c_arr_database_connection_messages;
private $c_obj_pdo;
private $c_obj_stmt;
public function __construct() {
$this->c_arr_database_connection_messages = array();
$this->c_obj_pdo = $this->getAdapter();
echo $this->c_obj_pdo;
$this->c_obj_stmt = null;
}
...
}
你们能帮我找出我哪里出错了吗?
干杯 汤姆
【问题讨论】:
-
$this->connection在App\Core\structureFactory中将始终为null,因此当您实例化一个新的structureFactory时,会在每个模型中创建一个新的PDO 对象 -
好的,那我该如何纠正这个伊恩?非常感谢
标签: php pdo factory-pattern