Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Diego Miranda

[Resolvido] Compartilhando conexões de banco entre classes

Recommended Posts

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/.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Registry não compartilha classes, apenas monta um array de objetos, você está usando ele de forma desnecessária.

quando será feita somente uma conexão, a melhor forma de fazer, seria um Singleton, registry é bom quando tem 2 ou mais

bancos de dados a serem usados em uma mesma aplicação, agora o registry, não implementa métodos estáticos, você está errando

em algum lugar aí, faça assim:

$Registry = new ArrayObject();
$Registry->offsetSet( 'PDO', new PDO( ... ) ); 
...
Recuperando o objeto da caixa:
$PDO = $Registry->offsetGet( 'PDO' );

quanto a tua classe, tem vários erros no teu código aí.. um deles e isso aqui

private $username;

você tem essa propriedade, desse jeito

public function setUserName($user_name){
    $this->user_name = $user_name; 
}

você seta outra propriedade aqui. username é 'diferente' de user_name

outra coisa é isso aqui:

public function __construct(){
   $this->db = Registry::get('pdo');
}

a propriedade $db não existe, por isso tá dando undefined property ali ..

outra coisa e teu execute, PDO não tem propriedade chamada execute, ele apenas

implementa o método responsável pela execução da query

$stm->execute();

ao invés de:

$stm->execute;

Compartilhar este post


Link para o post
Compartilhar em outros sites

Caraca, nem acredito... reescrevi isso tantas vezes que na última nem me liguei nos parenteses, quanto ao $this->db não existir e ao $username|$user_name, foi um erro de transcrição da minha classe pra cá. Referente ao singleton e o registry no tópico, li exatamente oq você falou, só que ao contrario, quando estava pesquisando sobre classes singleton para conexão com o banco, vou dar mais uma lida sobre isso. De qualquer maneira, vlwzão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido sim cara, a questão do singleton vs registry vou dar mais uma lida, pra entender exatamente o que ambos fazem. Meu único problema era mesmo os parenteses =P, o resto como disse foram um problema de transcrição da classe pra cá, resumi ela só pra mostrar o problema mesmo e acabei cometendo alguns erros de digitação.

 

Novamente, muito obrigado pela ajuda :joia:

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tranquilo, cara o negócio do singleton é o seguinte, ele tem um simples e claro objetivo, permitir uma única

instância de tal objeto em toda aplicação, só isso, já o registry, e uma garagem de objetos, você guarda tudo que

der e vier na sua mente ali dentro, por isso eu disse: 'se você está trabalhando com vários bancos e dados'

o singleton já sai do seu conceito principal, porque você vai ter vários singletons para um mesmo objeto, o registry já e adotável

nesse momento, você vai ter UM Objeto, pra vários objetos, ou seja, você apenas recupera esses caras do registry ( objeto pai )

 

;)

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.