Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá a todos,
Bom acompanho o iMasters a muito tempo, mas esse é o meu primeiro tópico.
Estou desenvolvendo um sistemas de gráficos e relatórios baseados no Google Visualization Api. Como não é nada urgente, resolvi fazer tudo "dentro dos conformes", assim aproveito para aperfeiçoar minhas skills de POO.
Vamos ao problema...
Estou tentando compartilhar uma mesma instância do banco entre diversas classes mas não estou tendo muito sucesso.
Como já estou tentando a 2 dias já resolver este problema já tentei diversas formas, e durante a pesquisa de uma solução descobri, aqui mesmo no forum, o Registry, que achei uma forma bem elegante de manter apenas uma instância de um mesmo banco :D.
config.inc.php
require_once('registry.class.php');
$dsn = 'mysql:dbname=mydb;host=myhost';
$user = 'mysuser';
$password = 'mypasswd';
$dbh = new PDO($dsn,$user,$password,array(PDO::ATTR_PERSISTENT => true));
$dbh->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
Registry::set($dbh,'pdo');
Tudo funciona maravilhosamente bem, contanto que eu não esteja dentro do escopo de uma classe. Se eu tentar usar a conexão no index.php por exemplo:
index.php
require_once('config.inc.php')
$dbh = Registry::get('pdo');
$sql = "select campo from tabela where 1=1";
$stm = $dbh->prepare($sql);
$stm->execute();
$rows = $stm->fetchAll();
var_dump($rows);
Tenho o seguinte resultado:
array(1) {
[0]=> array(2) {
["campo"]=> string(5) "campo"
[0]=> string(5) "campo"
}
}
Agora se eu tendo utilizar isto dentro de uma classe recebo o uma mensagem dizendo que execute não é um metodo de PDOStatement. Segue:
user.class.php
require_once('config.inc.php')
class User{
private $id;
private $username;
public function __construct(){
$this->db = Registry::get('pdo');
}
public function setUserName($user_name){
$this->user_name = $user_name;
}
public function setId($id){
$this->id = $id;
}
public function getUserById($id){
$this->setId($id);
$query = "select id, user_name from users where id = '".$this->getId()."'";
$db = $this->db;
$stm = $db->prepare($query);
var_dump($stm);
/*até aqui o mundo é feito de algodão doce e tudo funciona*/
/* o var_dump de $stm me retorna*/
/* object(PDOStatement)#4 (1) { */
/* ["queryString"]=> string(47) "select id from users where id = 'seed_chris_id'"} */
$stm->execute;
/* mas quanto o execute é feito, o recebo essa msg de erro*/
/* Undefined property: PDOStatement::$execute */
$rows = $stm->fetchAll;
$this->setUserName($rows->user_name);
}
}
E então, alguém tem alguma idéia de qual pode ser o problema? Ou se alguém souber uma outra maneira de compartilhar a mesma instância do banco entre várias classes já seria de grande ajuda também.
Agradeço desde já o apoio o/.
Carregando comentários...