Ir para conteúdo

POWERED BY:

Arquivado

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

Leandro Vieira Pinho

DataObject além do "CRUD", alguém ?

Recommended Posts

Olá pessoal,

 

Criei uma dataobject para mim realizar as funções básicas, CRUD (Create, Replace, Update e Delete). Bom, tudo funcionando numa boa, 100%.

 

Estou quebrando a cabeça para desenvoler um resultset para "meu esquema", ou seja, ao invés de retornar apenas uma linha da tabela, preciso retornar todos e com isso poder fazer um loop e exibir todos os registros.

 

Vou postar a classe resumida, somente com o GET, uma vez que o Replace (Update), Insert e Delete não interesse neste caso.

 

<?php/** Base de estudos* @Tutorial: Simplify Business Logic with PHP DataObjects* @URL: http://www.onlamp.com/pub/a/php/2004/08/05/dataobjects.html?page=1*/class w3_dataObject {	private $w3_conn;	private $w3_tableName;	private $w3_pk; /* Primary Key da tabela */		function __construct($dbName, $tableName, $pk) {			$this->w3_conn = mysql_connect('localhost','root','');		mysql_select_db($dbName);		$this->w3_tableName = $tableName;		$this->w3_pk = $pk;		}	public function get($id) {				$sql = "SELECT * FROM " . $this->w3_tableName . " WHERE " . $this->w3_pk . " = '" . mysql_escape_string($id) . "'";						$rs = mysql_query($sql);		$row = mysql_fetch_array($rs);		while ( list($fieldName, $fieldValue) = each($row) ) {			$this->$fieldName = $fieldValue;		}		}	}?>

E estou utilizando ela da seguinte forma:

 

$user = new w3_dataObject('estudos','people','peopleid');		$user->get(3);		echo $user->firstName;		echo $user->lastName;		echo $user->email;

Bom, agora suponhamos que eu precisa ao invés de:

 

$user->get(3);

 

para retorna os dados de uma coluna específica, eu informa algo como:

 

$user->get('*');

 

para retornar todos os registros, tudo bem eu crio um if na função get e ok.

 

Mas como proceder com o loop nos seguintes echos?

 

echo $user->firstName;

echo $user->lastName;

echo $user->email;

 

?

 

Me basiei no seguinte tutorial http://www.onlamp.com/pub/a/php/2004/08/05...cts.html?page=1

 

e aqui http://www.onlamp.com/pub/a/php/2004/08/05...cts.html?page=3 ele implementa o resultset, mas não consegui adaptar aqui.

 

Alguém???

Compartilhar este post


Link para o post
Compartilhar em outros sites

Saquei, mas quando faço assim:

 

while($row = mysql_fetch_array($rs) {			while ( list($fieldName, $fieldValue) = each($row) ) {				$this->$fieldName = $fieldValue;			}		}

não funciona, somente assim:

 

 

while ( list($fieldName, $fieldValue) = each($row) ) {				$this->$fieldName = $fieldValue;			}

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eu entendi,como o print_r eu veria o que está sendo retornado e com isso trabalhar com a variável retornado. Mas não está retornando nada, quando adicion o while na função get.Se puder tentar aí também. Estou tentrando outras formas aqui tb

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leandro só uma dica, ja que você esta usando PHP5, você deveria usar Mysqli e com ele sua classe ficaria muito melhor, sem contar que o metodo que você esta usando esta obsoleto e super limitado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Valeu Fabyo pela dica,Sinceramente, é questão de costume e desconhecimento (no momento) do mysqli.Ainda não compreendo bem as diferenças entre eles, e preciso tirar um tempo para estudá-lo melhor.De momento, qual método está obsoleto? E alguma boa referência aí sobre mysqli além do Manual do PHP?Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Metodo obsoleto é mysql_select_db(), e o proprio mysql em geral esta obsoleto, porque nao é questao de gosto, se nao usar o mysqli você nao consegue trabalhar com as novas funções do mysql, e transações, commint, rollback, store procedure, view, etc...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Resolvido o problema do resultSet, surge uma nova questão.

 

Estou desenvolvendo o dataObject de forma que ele generico, trabalhando com a tabela deseja.

 

Mas, a questão é quanto o processo de inserção.

 

Seguindo a lógica deste dataObject, http://darryl.pattersons.net/resources/art...DataObject.phps, o cara faz o seguinte no método insert()

 

$class = new ReflectionClass($this->dop_className);

 

Mas, tal classe não existe, e com isso o php está me retornando o seguinte erro:

 

Fatal error: Uncaught exception 'ReflectionException' with message 'Class dop_teste does not exist' in ...

 

Com este recurso o autor deixou o método insert dinâmico e perfeito, como preciso.

 

Alguma dica?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Acho que trabalhando com php5 mas usando os mesmos metodos antigos a oop nao ajuda muito, esses tipos de classe que vejo por ai é mais uma função dentro de class{}, muita gente nao percebeu a vantagem de usar uma classe e acaba criando classe só por nome e nao por conceito

pra mim essa classe que você mostrou no link esta muito errada, o jeito que o cara fez e como ele ta trabalhando.

 

como ja falei acima, alem disso acho errado a pessoa criar metodo para inserir, outro pra editar, deletar, etc..., e falta um bom controle de erros

desculpe nao poder ajudar e só parecer que estou criticando, mas to sendo sincero

Compartilhar este post


Link para o post
Compartilhar em outros sites

Concordo tbm Fabyo, acho que esta metodologia de desenvolvimento não é tão viável quanto parece ser.Não tive oportunidade de ler todo o artigo que o Leandro Vieira Pinho postou, mas a principio, me parece que este molde só dificulta a programação.dê uma lida inicialmente sobre MVC, e posteriormente sobre DAO, como a arquitetura deve ser realmente criada. Se eu não me engano, tem uns 4 ou 5 artigos discutindo o assunto no site do imasters.A unica coisa que eu discordo Fabyo, é com relação a separação dos scripts DML, pra mim, é mais interessante ter um método para INSERT, UPDATE, DELETE, SELECT, do que ter um método universal que se encarregue de fazer todas as querys ....só uma opnião pessoal mesmo

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza Void, só comentei sobre isso porque na maioria das linguagens é assim

por exemplo nao existe mysql_insert(), mysql_update(), mysql_delete() correto?

existe mysql_query(), porque queira ou nao tudo passa pela mesma função

e nao importa o sql sempre vai ter que usar mysql_query, e vejo muita gente usando metodos para inserir, outro para deletar etc..., sendo que 1 metodo apenas basta no exemplo o DOT NET tem o metodo Command onde você passa o sql e ele é executado, e eu tbm trabalho assim meu metodo recebe o sql e executa é algo bem objetivo e funcional.

se separar os metodos é mesma coisa que pedir pra 4 pessoas trocar uma lampada, a principio parece que 4 pessoas irao ajudar mais por exemplo uma vai comprar a lampada outra vai pegar a escada e outra vai segurar a escada e outra ira subir e trocar a lampada, parece piada, mas muita gente faz classes assim cria tanto metodos que parecem que fica tudo certo mas nao é bem por ai, porque todo mundo sabe que basta 1 pessoa pra trocar a lampada.

 

mas como falei é só minha opniao, claro que qualquer outro jeito de programar, sendo bem feito e estruturado tbm é valido

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, aí é questão de opinião mesmo.Achei a metodologia MVC muito interessante e funcional. E o DAO também. Uma vez que para se trabalhar com as operações básicas - CRUD - é super simples dessa forma.E outra é a separação da lógica e da apresentação, acho que estou tão acostumado a separar XHTML, CSS e JavaScript não-obstrutivo e sentir na pele o bem que tal separação me faz, acho interessante se "aventurar" nessa nova separação afim de conhecer esse novo método.Aconselho a leitura completa do artigo que indiquei para um melhor entendimento do que estou dizendo.Agora, Fabyo concordo sem dúvida com a relação a não utilização do mysqi, mas o restante em certo ponto acho relevante.

Compartilhar este post


Link para o post
Compartilhar em outros sites

beleza Void, só comentei sobre isso porque na maioria das linguagens é assim

por exemplo nao existe mysql_insert(), mysql_update(), mysql_delete() correto?

existe mysql_query(), porque queira ou nao tudo passa pela mesma função

e nao importa o sql sempre vai ter que usar mysql_query, e vejo muita gente usando metodos para inserir, outro para deletar etc..., sendo que 1 metodo apenas basta no exemplo o DOT NET tem o metodo Command onde você passa o sql e ele é executado, e eu tbm trabalho assim meu metodo recebe o sql e executa é algo bem objetivo e funcional.

se separar os metodos é mesma coisa que pedir pra 4 pessoas trocar uma lampada, a principio parece que 4 pessoas irao ajudar mais por exemplo uma vai comprar a lampada outra vai pegar a escada e outra vai segurar a escada e outra ira subir e trocar a lampada, parece piada, mas muita gente faz classes assim cria tanto metodos que parecem que fica tudo certo mas nao é bem por ai, porque todo mundo sabe que basta 1 pessoa pra trocar a lampada.

 

mas como falei é só minha opniao, claro que qualquer outro jeito de programar, sendo bem feito e estruturado tbm é valido

Poderia postar um exemplo do seu método Fabyo?

 

Um abraço.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Leandro quem me conhece sabe como eu programo, eu nunca fico no mesmo script, hoje eu faço de um jeito amanha pinta um novo projeto eu sento pra estuda-lo ja faço de outro jeito e por ai vai, mas esse script é um que eu fiz esses dias:

 

<?php

class bd
{
public $bd;
static private $instance;
function __construct() 
{	
	if($this->Status() == false) {
		$this->bd = new mysqli(SERVIDOR, USUARIO, SENHA, BANCO);				
	}		
}	

static public function singleton()
{
	if (!isset(self::$instance)) {
		$c = __CLASS__;
		self::$instance = new $c;
	}
	return self::$instance;
}

function Executar($sql, $operacao = null, $param = null) 
{	
	if($this->Status()) {	
		if ( $re = $this->bd->query($sql) ) {
			if($operacao == "I" or $operacao == "D") {
				return  $re->affected_rows;
			} else {	
				$array["num_rows"]	 = $re->num_rows;
				$array["fetch_object"] = $re->fetch_object();
				$array["fetch_array"]  = $re->fetch_array();
				$array["objeto"]	   = $re;					
				return $array;
			}	
		} 			
	}	
}	

function __destruct() 
{
	if (mysqli_connect_errno() == 0 and $this->status())
	{		   
		$this->bd->close();
	}
}

function Status()
{
	if(mysqli_connect_errno() == 0 and isset(self::$instance)) {			
		return @$this->bd->ping() == 1 ? true : false; 						
	} else {
		return false;
	}		
}
}

//exemplo de uso

$bd = bd::singleton();
$re =  $bd->Executar("select * from tabela");
if($re["num_rows"] > 0) {
$dados = $re["fetch_object"];
echo $dados->campo;	
$re["objeto"]->close();	
}	

?>

 

sem contar claro no tratamento de erros que eu implemento no script, mas nao vem ao caso agora

 

Leandro se você pegar outros scripts famosos verá que a ideia é a mesma, veja por exemplo framework Zend , ADOdb , PRADO etc...

todos usam apenas 1 metodo para executar a query

 

ADOdb = $DB->Execute($sql)

Zend = $db->query($sql);

PRADO usa ADOdb

 

salvo funções a aparte claro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Fala galera!Rs, adoro esses tipos de discussões, acho bem interessante discutir sobre padrões de programação!Eu comecei a utilizar o frameworks da Zend a uns 3,4 meses atrás Fabão, e no começo ralei bastante, tanto é que te mandava várias MP's !! ... e pelo oque pude observar, alem de toda praticidade e funcionalidade que o frameworks oferece, é que realmente o ele possui um método query na classe, mas tambem possui um método para insert, update, delete e Select ... qual sera que seria o padrão a ser seguido, se é que ele realmente existe !?não existe nenhum pattern discutindo esse assunto (eu pelo menos nunca vi) ... seria legal uma convenção ...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entao Void, é interessante mesmo discultir esses assuntos, mas acredito que por convenção mesmo é usar um metodo para executar a query, nao sou conhecedor de todas as linguagens mas pelo menos nas que eu mecho como por exemplo visual basic, delphi, dot net, exite por padrao 1 metodo e geralmente com o nome Execute exemplo o visual basic:

 

depois que eu declaro uma variavel e estancio ela ela me da essas seguintes opções Abrir a conexao e executar a query

 

Conexao.OpenConnection SERVIDOR, USUARIO, SENHA, BANCO
Conexao.Execute(sql)

 

na maioria das linguagens desktop é assim, existe basicamente os metodos abrir, fechar, executar, status , etc

 

claro que cada um programa do jeito que achar melhor, e como no caso da Zend que você pode usar a $db->query para tudo, como tbm existe os metodos separados como você citou, mas se você reparar o metodo $db->insert da zend existe em 3 arquivos:

Table.php, Abstract.php e Db2.php, e esse metodo $db->insert usa dentro dele $this->query($sql)

 

O metodo $db->update mesma coisa existe nos 3 arquivos que citei acima e dentro deles usa $this->query($sql), como o metodo $db->delete tbm usa

 

se estudar o scripts a fundo vera que existe apenas 1 metodo para executar a query

Compartilhar este post


Link para o post
Compartilhar em outros sites

éée quente ... eu ja sabia disso ...

Mas a dúvida é, por qual motivo razão ou circunstancia então, eles criaram métodos distintos, que utilizam internamente o método query !?? Sera que por questão de organização e maior controle !?

hehehe, fica ae a dúvida !!!

 

Sobre a dúvida do nosso amigo Leandro Vieira Pinho, eu não posso dizer nada neah ... não trampo com o Fabão ... mas ele disse que sempre muda a metodologia de programação a cada projeto, então o nego é tipo uma caixinha de surpresas !!!!

ehehhe, zueira ... mas o Zend, segue o molde MVC ferinha ... eu uso MVC ...

esse outro Case Mapping ja ouvi falar, mas não tive a oportunidade de estudar sobre o mesmo ...

 

[]'s

 

Entao Void, é interessante mesmo discultir esses assuntos, mas acredito que por convenção mesmo é usar um metodo para executar a query, nao sou conhecedor de todas as linguagens mas pelo menos nas que eu mecho como por exemplo visual basic, delphi, dot net, exite por padrao 1 metodo e geralmente com o nome Execute exemplo o visual basic:

 

depois que eu declaro uma variavel e estancio ela ela me da essas seguintes opções Abrir a conexao e executar a query

 

Conexao.OpenConnection SERVIDOR, USUARIO, SENHA, BANCOConexao.Execute(sql)
na maioria das linguagens desktop é assim, existe basicamente os metodos abrir, fechar, executar, status , etc

 

claro que cada um programa do jeito que achar melhor, e como no caso da Zend que você pode usar a $db->query para tudo, como tbm existe os metodos separados como você citou, mas se você reparar o metodo $db->insert da zend existe em 3 arquivos:

Table.php, Abstract.php e Db2.php, e esse metodo $db->insert usa dentro dele $this->query($sql)

 

O metodo $db->update mesma coisa existe nos 3 arquivos que citei acima e dentro deles usa $this->query($sql), como o metodo $db->delete tbm usa

 

se estudar o scripts a fundo vera que existe apenas 1 metodo para executar a query

Compartilhar este post


Link para o post
Compartilhar em outros sites

Maravilha Foid,Sim, o Zend assim como o Cake, Sinfony, entre ouros utilizam o MVC.Você, Void, indica alguma referência com exemplos práticos, uma vez que teóricos já encontrei bastante, sobre MVC e php5?Um abraço.

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.