junaooaks 3 Denunciar post Postado Outubro 18, 2012 ola pessoal estou tentando fazer uma conexao com o firebird deixando o host do servidor e o caminho do db para ser informado pelo usuario do sistema estou carrado no seguinte. envio a variavel e set ela no model() public function setHost ($host){ $this->host = $host; } public function getHost(){ return $this->host; } public function setCaminho ($caminho){ $this->caminho = $caminho; } public function getCaminho(){ return $this->caminho; } como uso o valor setado dentro da class <?php class Firebird extends PDO { public $dsn = 'firebird:dbname='; //C:\BASE.FDB'; public $user = 'SYSDBA'; public $password = 'masterkey'; public $handle = null; function __construct(modelExportar $model ) { try { if ( $this->handle == null ) { $dbh = parent::__construct( $this->dsn.$model->getHost().':'.$model->getCaminho() , $this->user , $this->password); $this->handle = $dbh; return $this->handle; } } catch ( PDOException $e ) { echo 'FALHA NA CONEXAO: ' . $e->getMessage( ); return false; } } function __destruct( ) { $this->handle = NULL; } } ?> Compartilhar este post Link para o post Compartilhar em outros sites
Vinicius Rangel 208 Denunciar post Postado Outubro 18, 2012 Como você chama essa classe? Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 18, 2012 require("../model/conexao/Firebird.php");$model = new modelExportar(); // os valores são passados para BEAN $model->setHost($descricao['host']); $model->setCaminho($descricao['caminho']); $db = new Firebird($model); basicamente e isto Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 22, 2012 pessoal ate hoje nao consegui resolver este problema vou postar a class de conexao que estou usando o problema esta em utilizar a variável externa erro que esta aparecendo. Catchable fatal error</b>: Argument 1 passed to Firebird::__construct() must be an instance of modelExportar, none given, called in <?php class Firebird extends PDO { //usando este metodo consigo conectar sem problema public $dsn = 'firebird:dbname=localhost:C:\BASE.FDB'; public $user = 'SYSDBA'; public $password = 'masterkey'; public $handle = null; function __construct(modelExportar $model) { //utilizando este nao consigo conectar $this->dsn = 'firebird:dbname='.$model->getHost().':'.$model->getCaminho(); //mostra normal o conteúdo da variável sem problema //echo "$caminho \n".$this->dsn; //exit(); try { if ( $this->handle == null ) { $dbh = parent::__construct( $this->dsn , $this->user , $this->password); $this->handle = $dbh; return $this->handle; } } catch ( PDOException $e ) { echo 'FALHA NA CONEXAO: ' . $e->getMessage( ); return false; } } function __destruct( ) { $this->handle = NULL; } } ?> --------------- Ponto de Mesclagem --------------- pessoal o erro esta aqui function __construct(modelExportar $model) { no metodo __construct, não posso receber a variável ? como faço para passar o get do metodo para a class ? Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 22, 2012 O problema aí é um pouco mais conceitual. Entendendo o conceito e ajustando o código você resolve fácil. class Firebird extends PDO { Um erro "clássico". Firebird não é PDO e muito menos usa ela. É totalmente ao contrário. Seria algo assim: class PDO { public function __construct( Firebird $firbird ) {} } Mas dessa forma caímos em outros dois problemas: Não precisamos redeclarar a PDO só para isso Dessa forma amarramos a classe apenas à objetos que sejam ou estendam a classe Firebird ou que implementem uma interface com esse nome. Os outros bancos vão pro beleléu. Nesse caso o melhor a se fazer é simplesmente usar a PDO definindo o DSN apropriado. public $dsn = 'firebird:dbname=localhost:C:\BASE.FDB'; public $user = 'SYSDBA'; public $password = 'masterkey'; public $handle = null; Outro erro "clássico": Propriedades públicas não devem existir. A classe de conexão não deve conhecer as informações de conexão. Você até pode definir valores-padrão, mas ainda assim não via propriedades públicas. function __construct(modelExportar $model) { Tanto quanto eu sei, um driver de conexão não usa uma model, e sim as informações dela. Não tenho como lhe dizer exatamente como você deveria proceder nesse caso pois difere bastante do modo que eu uso, em que um objeto recebe tanto o bjeto da Model quanto o objeto do Driver e trabalha com essas informações de forma isolada. Consertando esses pontos, aquela propriedade dsn pode vir a deixar de existir e o restante apenas mudaria parent por um new PDO. Veja se só com isso já resolve. Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 23, 2012 Bruno Augusto obrigado pela ajuda fiz alterações que entendi mas estou errando no metodo construct, tem como me da uma ajuda. class conexao <?php class Firebird { private $user = 'SYSDBA'; private $password = 'masterkey'; private $handle = null; public function __construct() { } public function odbc(modelExportar $model){ try { if ( $this->handle == null ) { $dbh = new PDO("firebird:dbname={$model->getHost()}:{$model->getCaminho()}", $this->user, $this->password); //$dbh = new PDO( $this->dsn , $this->user , $this->password); $this->handle = $dbh; return $this->handle; } } catch ( PDOException $e ) { echo 'FALHA NA CONEXAO: ' . $e->getMessage( ); return false; } } function __destruct( ) { $this->handle = NULL; } } ?> consulta sql class DBExportar { private $conex; public function __construct(){ //estou errando aqui. $this->conex = new Firebird(); } public function selectAll(){ $sql = 'SELECT * FROM C000007'; //estou errando aqui $rs = $this->conex->query($sql); if($rs){ while($ln = $rs->fetch(PDO::FETCH_OBJ)){ $pessoa = new modelExportar(); $pessoa->setCliente($ln->NOME); print_r($pessoa->getCliente()."\n"); $pessoas[] = $pessoa; } } controller <?php require("../model/conexao/Firebird.php"); require("../model/sql/DBExportar.php"); require("../model/modelExportar.php"); // resgatando os dados do formulário $descricao = $_POST; // guardando num array $dados = array( $descricao['host'], $descricao['caminho'], $descricao['produto'], $descricao['cliente'] ); // validação switch ($dados) { case (empty($descricao['host'])): $erro = "PREENCHA CAMPO HOST"; echo $erro; break; case(empty($descricao['caminho'])): $erro = "PREENCHA CAMPO CAMINHO"; echo $erro; break; case (empty($erro)): // caso não haja erro a instância é criada $model = new modelExportar(); // os valores são passados para o objeto $model->setHost($descricao['host']); $model->setCaminho($descricao['caminho']); $model->setCliente($descricao['cliente']); $model->setProduto($descricao['produto']); //conexao com banco de dados $db = new Firebird(); $db->odbc($model); //consulta sql $dbex = new DBExportar(); $dbex->selectAll(); break; } ?> obrigado, Compartilhar este post Link para o post Compartilhar em outros sites
Bruno Augusto 417 Denunciar post Postado Outubro 25, 2012 Normalmente eu não costumo pegar na mão da pessoa e levá-la até o outro lado da rua. SEMPRE explique seu problema para que conhecendo o problema, possamos solucioná-lo. 1. Você sabe o que o construtor de uma classe faz? Como o próprio nome diz ele ele constrói o objeto, definindo tudo aquilo que for necessário para que quando instanciado ele esteja pronto para o uso. Com isso, a conexão com banco que você faz em Firebird::odbc() devia ter sido feita no próprio construtor. 2. Model guardando informações de conexão Parte do que uma Model faz é guardar informações. Mas a conexão deve ser feita com informações guardadas na própria model. Não chega a caracterizar um loop infinito, mas conceitualmente o que você estaria fazendo seria: Banco -> Recebe Model -> Conecta -> Devolve Model -> Envia ao Banco -> Recebe Model -> Conecta -> Devolve Model... Os dados da conexão construirão o DSN, e se vai construir vai no __construct. Mas nem por isso é a model que vai para ele. Resumindo: class Firebird { private $connection; public function __construct( $dbname, $host = 'localhost' ) { $connection = new PDO( sprintf( 'firebird:dbname=%s:%s', $host, $dbname ), $username, $password ); } } 3. DRY (Don't repeat yourself) e KISS (Keep it simple, stupid) A PDO abstrai a interface de acesso ao banco de dados. Isto significa que você vai invocar, por exemplo, PDO::query() a partir do objeto de instância da PDO seja qual for o banco escolhido. Sendo assim, olha a trabalheira que você teria se porventura o SGBD escolhido precisasse mudar ou ainda, supondo que nunca mude, a volta toda que você deu só para conectar. É N vezes mais produtivo você usar um Registry para armazenar a conexão feita diretamente com a PDO, do que ficar intermediando as coisas. Se há a possibilidade de mudança, então você deve abstrair todo o procedimento de conexão, se não cada classe, de cada banco terá essa mesma repetição de construtor. Nesse caso você só precisa abstrair o DSN. Veja um fragmento parcial e enormement adaptado da forma como eu faço: abstract class AbstractPDO { public function __construct( array $options ) { $this -> connection = new PDO( $this -> getDSN( $options ), $options['username'], $options['password'] ); } abstract protected function getDSN( array $options ); } class MySQL extends AbstractPDO { protected function getDSN( array $options ) { return sprintf( 'mysql:host=%s;dbname=%s', $options['host'], $options['database'] ); } } class SQLite extends AbstractPDO { protected function getDSN( array $options ) { return sprintf( 'sqlite:%s/%s', $options['path'], $options['database'] ); } } E na hora de usar algo como: $MySQLConn = new MySQL( array( 'username' => 'username', 'password' => 'password', 'database' => 'mydatabase' ) ); $SQLiteConn = new MySQL( array( 'path' => 'path/to/sqlite.sqlite', 'database' => 'mydatabase' ) ); Veja se isso te ajuda a clarear as idéias. Compartilhar este post Link para o post Compartilhar em outros sites
junaooaks 3 Denunciar post Postado Outubro 25, 2012 Bruno Augusto obrigado resolvi de outra forma, gostei da forma que você faz, mais pra frente vou adaptar Compartilhar este post Link para o post Compartilhar em outros sites