rafwell 1 Denunciar post Postado Maio 6, 2013 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
cristianoolv 93 Denunciar post Postado Maio 6, 2013 Usa Registry. Compartilhar este post Link para o post Compartilhar em outros sites
rafwell 1 Denunciar post Postado Maio 7, 2013 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
cristianoolv 93 Denunciar post Postado Maio 7, 2013 Olha um exemplo bem bacana. Compartilhar este post Link para o post Compartilhar em outros sites
Enrico Pereira 299 Denunciar post Postado Maio 7, 2013 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
rafwell 1 Denunciar post Postado Maio 9, 2013 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
Enrico Pereira 299 Denunciar post Postado Maio 9, 2013 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
rafwell 1 Denunciar post Postado Maio 9, 2013 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
Enrico Pereira 299 Denunciar post Postado Maio 9, 2013 Você continua com o estado global em sua classe........ Compartilhar este post Link para o post Compartilhar em outros sites
rafwell 1 Denunciar post Postado Maio 9, 2013 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
Evandro Oliveira 331 Denunciar post Postado Maio 9, 2013 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
Enrico Pereira 299 Denunciar post Postado Maio 9, 2013 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
rafwell 1 Denunciar post Postado Maio 9, 2013 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
Evandro Oliveira 331 Denunciar post Postado Maio 9, 2013 Se continuar usando errado, a utilidade seria só pra adicionar uma complexidade a mais. Compartilhar este post Link para o post Compartilhar em outros sites
rafwell 1 Denunciar post Postado Maio 10, 2013 Obrigado a todos pela ajuda! Compartilhar este post Link para o post Compartilhar em outros sites