[英]PDO too many connections using factory pattern for connection PHP
經過teresko的一些幫助后,我設法實現了工廠設計方法,以便僅一次連接到我的數據庫(這就是我的想法),但是現在收到此錯誤:
致命錯誤:出現消息“ SQLSTATE [08004] [1040]連接過多”的未捕獲異常“ PDOException”
然后繼續描述不同位置的大約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;
}
...
}
你們能幫我找出問題所在嗎?
干杯湯姆
您的structureFactory
可能看起來像這樣。
namespace App\Core;
class structureFactory
{
protected $connection;
public function getConnection()
{
if (!$this->connection) {
$this->connection = new PDO('dsn');
}
return $this->connection;
}
}
namespace App\Core\Models;
use App\Core\structureFactory as structureFactory;
abstract class baseModel {
protected $factory;
public function __construct(structureFactory $factory)
{
$this->factory = $factory;
}
protected function getAdapter() {
return $this->factory->getConnection();
}
}
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(App\Core\structureFactory $factory) {
parent::__construct($factory);
$this->c_arr_database_connection_messages = array();
$this->c_obj_pdo = $this->getAdapter();
echo $this->c_obj_pdo;
$this->c_obj_stmt = null;
}
...
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.