Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
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](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???
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; }
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
Valeu pessoal,
consegui resolver meu problema pesquisando neste site: http://www.phppatterns.com/
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.
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.
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...
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?
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
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
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
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.
>
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.
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() $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() 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
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 ...
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
Fabyo,Você utiliza alguma metodologia de desenvolvimento? Tipo MVC, Case Mapping, ou alguma outra?
éé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
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.
Void acredito que eles criam metodos separados para poder montar um select melhor e com mais segurança ou mais controle, voce tbm pode montar metodos separados para fazer tudo, mas crie um metodo para executar a query e chama ele passando o sql, e a ideia de usar o mesmo metodo query é pra nao haver metodos repetidos que fazem a mesma coisa ou que cada metodo faça sua propria chamada na query, tendo 1 metodo apenas para executar a query você tem mais controle de erros e validações, senao você precisaria criar todos os metodos repetidas vezes em cada metodo
Opa !!!Beleza de tópico, deu pra esclarecer muitas duvidas e ajudar a galera do forum !! Valeu fabão pela resposta.Então Leandrão, artigos sobre MVC, realmente você acha muita coisa, marioria teórica mesmo. Agora artigo bom de MVC com o PHP5, uhnmm .. realmente eu vou ficar te devendo, não conheço nenhum, o conceito de MVC eu aprendi com JAVA na facul (Mas você encontra bastante coisa na net tb, bastante coisa prática MVC + JAVA) .... e agora uso no PHP5 !! valeuuss!!
Eu havia tentando, mas nun funfa não. O loop precisa ser por aqui mesmo:
echo $user->firstName;echo $user->lastName;echo $user->email;