Ir para conteúdo

POWERED BY:

Arquivado

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

junaooaks

[Resolvido] pdo get set conexao firebird

Recommended Posts

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

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

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:

 

  1. Não precisamos redeclarar a PDO só para isso
     
  2. 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":

 

  1. Propriedades públicas não devem existir.
     
  2. 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

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

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

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

×

Informação importante

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