Ir para conteúdo

POWERED BY:

Arquivado

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

rafwell

Duas conexões, bancos distintos, mesma classe

Recommended Posts

Boa noite a todos!

 

Estou com problemas para conectar em dois bancos de dados distintos usando uma mesma classe, instanciando-a duas vezes. Acontece que, ao conectar na segunda instância, a primeira é sobrescrita. Não sei o que poderia estar errado.

 

Agradeço qualquer ajuda!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei mais rápido desconectar e reconectar ao banco, pois este projeto é bem simples e só vou usar essa função uma única vez.

 

Estudarei com mais calma o pattern Registry mais tarde. Era exatamente o que eu precisava. Mas me demandaria um bom tempo estuda-lo como desejo agora.

 

Obrigado pela luz.

 

Abs.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Registry é um anti-pattern da mesma forma que o singleton.

 

 

Estou com problemas para conectar em dois bancos de dados distintos usando uma mesma classe, instanciando-a duas vezes. Acontece que, ao conectar na segunda instância, a primeira é sobrescrita. Não sei o que poderia estar errado.

 

Como assim? pode postar o código?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu tendo a seguinte classe:

class banco{
       function __construct($ip = '' , $banco= '', $user = '', $pass = '', $tipo = 'mysql'){
		$this->ip     = ($ip) ? $ip : $this->ip;
		$this->banco  = ($banco) ? $banco : $this->banco;
		$this->user   = ($user) ? $user : $this->user;
		$this->pass   = ($pass) ? $pass : $this->pass;
		$this->tipo   = ($tipo) ? $tipo : $this->tipo; 
		$this->Conecta();
	}
	
	function Conecta(){
	    global $Loja;
		if ($this->tipo == 'mysql'){
			if(!$this->con){
			    $Loja->GravaLog("Conectando no banco de dados $this->banco, em: $this->ip");
				$this->con = mysql_connect($this->ip, $this->user, $this->pass) or die('Impossível conectar com o banco de dados informado. Motivo: '.mysql_error());
				mysql_select_db($this->banco);	
		return $this->con;
			}
		}
	}
}

 


Aí eu instancio a classe duas vezes.


$Banco1 = new banco('ip', 'banco', 'senha');

$Banco2 = new banco('outroip', 'outrobanco', 'outrasenha');

 

Quando eu instancio a segunda vez a primeira se perde. Se eu tento executar uma query no Banco1 ele usa a conexão que foi ativada pelo banco2.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Basicamente porque você está usando global. Você está tentando usar orientação a objetos, todavia está cometendo um grave erro, basicamente porque a OO é um paradigma onde o estado não é global e sim individual p/ cada objeto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Senhores,

 

Por favor me ajudem a entender o que estou fazendo de errado. Segui a explicação do João, neste post: http://forum.imasters.com.br/topic/400014-resolvidopdo-singleton/?p=1566101

 

E fiz o seguinte código:

 

<?php
require_once('classes/registry.class.php');
require_once('classes/banco.class.php');
require_once('classes/loja.class.php');
$Loja       = new Loja();
$Registry   = Registry::getInstance();
$Banco      = new banco('ip','banco','usuario','senha');
$Registry->set('Banco', $Banco);
//guardar o $Banco no Registry 
$Banco2 = new banco('ip2','banco2','usuario2','senha2');
$Registry->set('Banco2', $Banco2);

$Banco = $Registry->get('Banco');
$Banco->Query('select database()');
var_dump($Banco->FetchAssoc()); echo '<br />';

$Banco2 = $Registry->get('Banco2');
$Banco2->Query('select database()');
var_dump($Banco2->FetchAssoc()); 
?>

 

Mas me retorna o seguinte na tela:

array(1) { ["database()"]=> string(6) "banco2" } 
array(1) { ["database()"]=> string(6) "banco2" }

 

Mas eu esperava que a primeira conexão me retornasse 'banco'. Viram que a primeira conexão que fiz, no objeto Banco foi sobrescrita quando eu instanciei a classe novamente?

 

Agradeço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Enrico,

 

Não entendi o que você quis dizer. Está se referindo ao fato de eu usar global $Loja dentro das funções da classe banco? Não vejo porque isso seria errado, eu preciso dos métodos de Loja na classe banco, mas não posso usar uma extensão na classe banco.

 

Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Seu problema é que você não informa uma conexão nas funções mysql_*

 

Veja que, na maioria das funções, há um segundo argumento opcional, [inline]$link_identifier[/inline]

The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If no connection is found or established, an E_WARNING level error is generated.

http://br2.php.net/manual/en/function.mysql-select-db.php

 

Você precisa guardar a conexão e sempre passá-la às chamadas posteriores:

$conn1 = mysql_connect('localhost', 'root', 'root');
$conn2 = mysql_connect('remotehost', 'root', 'root');

mysql_select_db('local_db', $conn1);
mysql_select_db('remote_db', $conn2);

Compartilhar este post


Link para o post
Compartilhar em outros sites

Exatamente Evandro, não percebi. E esqueça mysql_*, essas funções estão obsoletas. Use PDO ao invés.

 

E o global é venenoso, use injeção de dependências.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Cara, eu não acredito que meu problema era só esse, desde o início! Tem tanto tempo que eu fiz essa classe que eu não me lembrava que esses métodos estavam sem o identificador do link.

Engraçado porque, eu tirei o Registry do meu fonte e funcionou corretamente. Após colocar o identificador funcionou, tanto usando o registry quanto sem usar.

Segue o meu código agora:

 

$Banco      = new banco('ip','banco','usuario','senha');
$Banco2     = new banco('ip2','banco2','usuario2','senha2');

$Banco->Query('select database()');
var_dump($Banco->FetchAssoc()); echo '<br />';

$Banco2->Query('select database()');
var_dump($Banco2->FetchAssoc()); 

 

Resultado:

array(1) { ["database()"]=> string(6) "banco1" } 
array(1) { ["database()"]=> string(6) "banco2" }

 

Então, agora está funcionando, mas qual é a real necessidade de utilizar o Registry, então? Seria só para padronizar o projeto?

 

Obrigado!

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.