簡體   English   中英

PDO使用工廠模式進行過多的連接以進行PHP連接

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM