Здравейте, имам един проблем. Тествам фреймуорка на gatakka. Първо ще обясня, и после ще дам кодовете свързани с прблема. Значи правя си един модел в който имам заявка към базата данни. Модела наследява класа SimpleDB. В контролера си викам модела и получавам следната грешка Fatal error: Cannot use object of type PDO as array. Грешката е свързана по някакъв начин с конекцията към базата данни. Във фреймуорка има клас DBSession който, също използва конекцията към базата и също наследява класа SimpleDB. DBSession винаги се изпълнява първи защото го викаме в стартиращия клас. Конекцията определяме каква да бъде посредством функцията getDatabaseConnection() в класа Database защото може да имаме конекция към повече от една база данни. Цялата работа е че ако изключа сесията(демек DBSession което, става от конфигурацията или задам на сесията да не работи с базата данни) тогава не получавам грешката и модела си върши работата, но това не ме урежда защото ми трябва сесията в базата. Ето и кодовете.
Модел
SimpleDB
Database
DBSession не пускам целия код защото няма общо с проблема
Контролера в който викам модела
Модел
Код:
namespace models;
class LoginModel extends \application\SimpleDB{
public function __construct($dbConnection) {
parent::__construct($dbConnection);
}
public function do_something($dataEmail, $dataPass) {
$this->prepare('INSERT INTO login (email,pass) VALUES(?,?)', array($dataEmail, $dataPass))->execute();
}
}
SimpleDB
Код:
namespace application;
class SimpleDB{
protected $_connection = 'default';
private $_db = null;
private $_stmt = null;
private $_params = array();
private $_sql = null;
public function __construct($connection = null) {
if ($connection instanceof \PDO) {
$this->_db = $connection;
} elseif ($connection != null) {
$this->_db = \application\Database::getInstance()->getDatabaseConnection($connection);
$this->_connection = $connection;
} else {
$this->_db = \application\Database::getInstance()->getDatabaseConnection($this->_connection);
}
}
public function prepare($sql, $params = array(), $pdoOptions = array()) {
$this->_stmt = $this->_db->prepare($sql, $pdoOptions);
$this->_params = $params;
$this->_sql = $sql;
return $this;
}
public function execute($params = array()) {
if ($params) {
$this->_params = $params;
}
$this->_stmt->execute($this->_params);
return $this;
}
Database
Код:
namespace application;
class Database {
private static $_instance = null;
/**
*
* @var \application\Config
*/
private $_config;
private $_dbConnection = array();
private function __construct() {
$this->_config = \application\Config::getInstance();
}
/**
*
* @return \application\Database
*/
public static function getInstance() {
if (self::$_instance == null) {
self::$_instance = new \application\Database();
}
return self::$_instance;
}
public function getDatabaseConnection($connection = 'default') {
if (!$connection) {
throw new \Exception('No indetificator', 500);
}
if ($this->_dbConnection[$connection]) {
return $this->_dbConnection[$connection];
}
$cnf = $this->_config->db_config_file;
if (!$cnf[$connection]) {
throw new \Exception('No valid indetificator', 500);
}
$dbh = new \PDO($cnf[$connection]['host_and_dbName'], $cnf[$connection]['username'], $cnf[$connection]['password'], $cnf[$connection]['pdo_options']);
$this->_dbConnection = $dbh;
return $dbh;
}
}
DBSession не пускам целия код защото няма общо с проблема
Код:
namespace application\sessions;
class DBSession extends \application\SimpleDB implements \application\sessions\ISession {
public function __construct($dbConnection, $name, $tableName = 'session', $lifetime = 3600, $path = null, $domain = null, $secure = FALSE) {
parent::__construct($dbConnection);
}
}
Контролера в който викам модела
Код:
namespace controllers;
class Login extends \application\BaseController {
public function bar() {
$model = new \models\LoginModel($dbConnection = 'default');
$model->do_something($dataEmail, $dataPass);
}
}