Ir para conteúdo

POWERED BY:

Arquivado

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

hvjohny

Pdo

Recommended Posts

Galera, olha eu aqui novamente rsrs.

Em outro post, pedi ajuda pois estava começando a criar uma classe com php para aprendizagem. Um colega me ajudou, e disse que seria melhor aprender logo com PDO.

Bom, li bastante a respeito, e realmente é muito bom, não era necessário eu criar classes e funções para conexão sendo que já existe uma.

Seguindo o raciocínio da primeira classe, eu quero o seguinte:

Fazer com que ao instanciar uma classe, seja passado os campos para serem selecionados, a tabela, a clausula, o operador, os casos, e outros parâmetros. Isso tudo para que eu possa fazer select em qualquer tabela. Após isso, seria salvo os dados em array, e depois ao instanciar o objeto, exibiria os dados.

Consegui fazer todo o processo, porém estou com dificuldade na listagem de dados. Peço para que me ajudem, desconsidere os erros ou as "cacas" contidas, estou aprendendo PHPOO, então qualquer crítica construtiva será bem vinda.

Estarei postando a classe conexao, a página de teste para exibição da listagem e a classe do select(Somente colocarei os campos importantes, a parte de validação não estará inclusa).

 

Conexão.php(Não estarei postando o arquivo .ini, acredito não ser necessário)

abstract class ConexaoBanco
{
   private function __construct(){}
   
   public static function open($nomeArquivo){
	  if(file_exists("{$nomeArquivo}.ini"))
	  {
		 $arrayConexao = parse_ini_file("{$nomeArquivo}.ini");		   
	  }
	  else
	  {
		 throw new Exception("Arquivo '$nomeArquivo' não encontrado.<br>");  
	  }
	  
	  $Host     = $arrayConexao['Hospedagem'];
	  $Banco    = $arrayConexao['Banco'];
	  $Usuario  = $arrayConexao['Usuario'];
	  $Senha    = $arrayConexao['Senha'];
	  $Tipo     = $arrayConexao['Tipo'];
	  
	  switch($Tipo){
		 case 'pgsql':
		    $conn = new PDO("pgsql:dbname=".$Banco.";user=".$Usuario.";password=".$Senha.";host=".$Host); break;
		 case 'mysql':
		    $conn = new PDO("mysql:host=".$Host.";dbname=".$Banco,$Usuario,$Senha); break;
		 case 'sqlite':
		    $conn = new PDO("sqlite:".$Banco);	  
	  }
	  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
	  return $conn;
   }
     
}

 

SSQL.class.php(onde recebo os dados, faço a validação e armazenaria os dados para serem mostrados)

 

class SSQL extends ConexaoBanco{
	protected $campoSelecionar;
	protected $tabelaSelecionar;
	protected $clausulaSelecionar;
	protected $operadorSelecionar;
	protected $parametroSelecionar;
	protected $caseSelecionar;
	
	public function __construct($campoSelecionar,$tabelaSelecionar,$clausulaSelecionar,$operadorSelecionar,$parametroSelecionar,$caseSelecionar){
	    $this->campoSelecionar     = $campoSelecionar;
		$this->tabelaSelecionar    = $tabelaSelecionar;
		$this->clausulaSelecionar  = $clausulaSelecionar;
		$this->operadorSelecionar  = $operadorSelecionar;
		$this->parametroSelecionar = $parametroSelecionar;
		$this->caseSelecionar      = $caseSelecionar; 
	}
    public function BuscarDados(){
  // FAÇO VARIAS VALIDAÇÕES DOS CAMPOS INFORMADOS
     ## ABAIXO Só foi um teste, futuramente vou incluir os dados informados para fazer o selec somente com eles usando BindParam.

   $conecta   = ConexaoBanco::open('config');
		$selectSQL = $conecta->prepare("SELECT * from agenda"); 
		$selectSQL->execute();
		    if($selectSQL->rowCount() > 0) 
			{
                         return $selectSQL->fetchAll(PDO::FETCH_OBJ);
			}
			else
                         echo "Não existem cadastros.";



	} // function		
  	
} // class

 

Teste.php(onde seria pra exibir os dados)

 

<?php include_once 'conexao.php'; ?>
<?php include_once 'SSQL.class.php'; ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Untitled Document</title>
</head>

<body>
<?php
  $buscar = new SSQL('age_cod, AGe_local','agenda','WHERE','AND','','age_cod:1##.age_local:Teste##.age_data:10/01/1993');
  $buscar->BuscarDados();
  
?>

<p> </p>
</body>
</html>

 

Bom, não está fazendo efeito nenhum os dados que estou instanciando, pois só quero fazer com que seja impresso o return $selectSQL['age_cod'], $selectSQL['age_local'], etc.

Entenderam o que estou tentando fazer?

Se não, posso tentar explicar melhor. por favor me ajudem, e caso esteja fazendo alguma coias errado, ou totalmente errado rs, me falem.

Muito obrigado novamente.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o correto é deixar a classe PDO estática e trabalhar com as consultas "manualmente"

 

no caso você iria fazer

 

 

 

DB::conn->query("SELECT O QUE QUISER DA TABELA DE QUISER"); //ou insere ou altera

DB:: sendo referencia ao objeto e conn o método que faz a chamada da query

 

sua classe seria apenas dados para conexão e não para consulta.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o correto é deixar a classe PDO estática e trabalhar com as consultas "manualmente"

 

no caso você iria fazer

 

 

 

DB::conn->query("SELECT O QUE QUISER DA TABELA DE QUISER"); //ou insere ou altera

DB:: sendo referencia ao objeto e conn o método que faz a chamada da query

 

sua classe seria apenas dados para conexão e não para consulta.

Acho que entendi. você diz pra abandonar essa classe SSQL certo? e fazer o processo da query na página onde seria exibido os dados certo? mas ai ficaria praticamente idêntico a linguagem procedural, a unica diferença é que o pdo traria mais segurança.

 

Observação: ele está retornando corretamente o return $selectSQL->fetchAll(PDO::FETCH_OBJ);

porém não sei como trabalhar com ele na página teste.php.

Compartilhar este post


Link para o post
Compartilhar em outros sites

acontece que sua função não faz nada de mais, parece que simplesmente criou mais uma etapa para o processo.

ao meu ver essa etapa não esta somando a nada.

 

você pode tentar procurar e trabalhar com os padrões orientando a objetos adequadamente que você fará algo mais dinâmico do jeito que quer.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que o correto é deixar a classe PDO estática e trabalhar com as consultas "manualmente"

 

no caso você iria fazer

 

 

 

 


DB::conn->query("SELECT O QUE QUISER DA TABELA DE QUISER"); //ou insere ou altera
DB:: sendo referencia ao objeto e conn o método que faz a chamada da query

 

sua classe seria apenas dados para conexão e não para consulta.

 

 

Classes são para serem instanciadas. Uma "classe estática", na maioria dos casos, expõe problemas de modelagem.

ninguém?

Qual o seu objetivo final. Desculpe, não ficou muito claro. O que você deseja, efetivamente, fazer?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Classes são para serem instanciadas. Uma "classe estática", na maioria dos casos, expõe problemas de modelagem.

 

Qual o seu objetivo final. Desculpe, não ficou muito claro. O que você deseja, efetivamente, fazer?

Bom, resumidamente:

Se em uma página, eu tiver que mostrar dados da tabela Chiclete e da tabela Bala eu não precisaria ficar escrevendo selects e whiles para mostrar. esses dados.

Queria como ali em cima, instanciar uma classe já passando os campos que quero que seleciona: a tabela, e outros parâmetros. e ao instanciar o objeto, poder trabalhar com os dados, exemplo:

 

  $buscar = new SSQL('chiclete_cod, chiclete_nome','chiclete','WHERE','AND','','age_cod:1##.age_local:Teste##.age_data:10/01/1993'); // aqui eu passo os campos que serão selecionados e outras coisas
  $buscar->BuscarDados();

 

e depois gostaria de trabalhar com o que a função está me retornando(return $selectSQL->fetchAll(PDO::FETCH_OBJ))

Ou seja, gostaria de exibir por exemplo: $selectSQL->chiclete_cod, e em outro lugar desejado. $selectSQL->chiclete_nome.

Entendeu? isso é possível? Obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim acredito que seria uma abordagem mais pratica.

 

class Mysql{
protected $conn;
public function __construct(PDO $conn){
 $this->conn = $conn;
}
public function getAll(){
$query = $this->conn->query( sprintf("Select * from %s",$this->tabela));
return $query->fetchAll();
}
}
 
class Pgsql{
public function __construct(PDO $conn){
 $this->conn = $conn;
}
public function getAll(){
 //implementa
}
}
try{$conn = new PDO("mysql:host=".$Host.";dbname=".$Banco,$Usuario,$Senha);$mysql = new Mysql($conn);var_dump($mysql->setTable('table')->getAll());}catch(PDOException $e){ print_r($e);}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Assim acredito que seria uma abordagem mais pratica.

 

class Mysql{
protected $conn;
public function __construct(PDO $conn){
 $this->conn = $conn;
}
public function getAll(){
$query = $this->conn->query( sprintf("Select * from %s",$this->tabela));
return $query->fetchAll();
}
}
 
class Pgsql{
public function __construct(PDO $conn){
 $this->conn = $conn;
}
public function getAll(){
 //implementa
}
}
try{$conn = new PDO("mysql:host=".$Host.";dbname=".$Banco,$Usuario,$Senha);$mysql = new Mysql($conn);var_dump($mysql->setTable('table')->getAll());}catch(PDOException $e){ print_r($e);}

 

Não é isso que procuro Luis Paullo, mas muito obrigado por colaborar. valeu mesmo, abraços.

 

Galera, em uma tentativa "desesperadora", tentei acessar a variavel "$selectSQL" da seguinte maneira na página teste.php

 

$teste = BuscarDados();
echo $selectSQL->age_cod;
Porém como esperado não funcionou, e retornou a seguinte mensagem:
Fatal error: Call to undefined function BuscarDados() in C:\Program Files (x86)\EasyPHP-12.0\www\Ceosnet\classes\teste.php on line 14

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá estudando ou precisa disso "pra ontem" pra entregar pra alguém??

 

Se tiver um tempinho disponível, sugiro que dê uma olhada em ORM's.

 

As duas melhores alternativas atuais são Propel e Doctrine, sendo que eu recomendo o segundo.

 

Recentemente, postei um exemplo de uso de Doctrine neste post.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tá estudando ou precisa disso "pra ontem" pra entregar pra alguém??

 

Se tiver um tempinho disponível, sugiro que dê uma olhada em ORM's.

 

As duas melhores alternativas atuais são Propel e Doctrine, sendo que eu recomendo o segundo.

 

Recentemente, postei um exemplo de uso de Doctrine neste post.

Na verdade tenho que terminar esse CMS até dia 4, que é a minha volta aos estudos, e ainda estou no select rsrs. to quase fazendo na linguagem procedural pelo curto tempo.

Vou ver se consigo dar uma olhada no Doctrine, mas se você puder me ajudar com isso, serei muito agradecido.

Não parece ser tão complicado, a única coisa que quero é acessar o return da função BuscarDados em outra página.

ou sejá, poder escrever $selectSQL->age_cod. ou outro campo qualquer do bd na página teste.php.

Muito obrigado.

 

 

Galera, to desesperado pra achar uma maneira de finalizar isso.

 

 

Ninguém pode me ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Estava pensando em usar a variavel $selectSQL como globals, só que isso não é muito "profissional".

Será que não tem nenhum programador com mais experiência que pode me ajudar a trabalhar com a variavel $selecSQL em outra página? ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, consegui resolver colocando a variavel $selectSQL como globals $selecSQL.

Vou deixar o tópico como não resolvido +1 dia, pois pelo que vi nos lugares, não é muito bacana resolver problemas com globals.

Caso apareça alguém com uma maneira melhor de resolver, por favor. até lá, continuarei usando globals.

abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ou sejá, poder escrever $selectSQL->age_cod. ou outro campo qualquer do bd na página teste.php.

Leu o link que postei?? lá tem uma forma de uso. Depois de definir as entidades, você usa de forma bem auto-descritiva.

$chiclete = $entityManager->find('chiclete', 1);
echo $chiclete->get_age();

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.