CRUD genérico com PHP e OOP - Aula 5

  • Publicado em: 24/02/2012
  • Revisado em: 25/10/2012
  • Categoria(s)PHP
  • Autor: Ricardo Bernardi
  • Newsletter: Inscreva-se

Para finalizar nossa série de aulas sobre a criação de um CRUD genérico com PHP orientado a objetos iremos aprender a fazer as consultas e retornar os dados do banco. Para que tudo atenda as necessidades mínimas de uma consulta, iremos ajustar nossa função de execução de SQL no banco para alimentar um dataset com os dados da consulta.

Iremos criar também a função responsável por devolver este dataset em forma de objeto ou array conforme nossa necessidade. Em seguida criaremos as funções de seleção propriamente ditas e testaremos as mesmas para ver sua funcionalidade.

Depois de assistir, deixe um comentário com sua opinião sobre a aula, aguardamos sua participação.

Mais posts desta série

Este post faz parte de uma série, confira tudo que já foi publicado sobre o mesmo assunto.

Compartilhe esse post:

Sobre o autor

Ricardo Bernardi

Sou técnico em hardware e desenvolvedor web, e sobre estes dois assuntos comecei a compartilhar aulas e artigos, tornando-me blogueiro em 2008. Em 2010 esse hobby virou profissão, e desde então tenho buscado melhorar e profissionalizar cada vez mais os projetos que mantenho na web.

Comentários

Atualmente temos 64 comentários para este post. Participe você também, clique aqui e comente sobre o assunto.

  • Emerson Vieira comentou em

    Boa tarde,
    Muito bom estas aulas sobre crud genérico, mas ainda tenho uma dúvida, se eu precisar fazer um inner join para consultar dados de mais de uma tabela, como posso fazer?

    Responder
  • Olá, bom dia. Primeiramente gostaria de parabenizar pelo excelente material. Excelente didática, simplicidade e objetividade no assunto.
    Tenho uma pequena dúvida com relação a tratamento das informações. Como você faria, nessa estrutura explicada, para tratar alguma informação. Por exemplo, como você faria para no caso de um campo como data de nascimento, seja tratado para identificar que é uma data válida? Não quero aqui me apegar ao tratamento em si, mas como as informações seriam manipuladas antes de serem incluídas no objeto. O tratamento ficaria no arquivo base ou cliente? Pergunto, pois em outras literaturas vejo a repetição do SET e GET no arquivo correspondente ao objeto justamente para fazer esse tratamento, mas no seu exemplo você fez isso em um só arquivo, evitando a redundância de código. Imagino que seria no arquivo cliente mas não consegui criar uma forma tão simples como o restante do código feito por você.

    Desde já agradeço pelo material e pela resposta.

    Responder
    • Você poderia criar uma classe dedicada somente a fazer validações (assim como temos a classe BANCO teria uma para VALIDAR), dessa forma, tudo que precisa ser validado é enviado para essa classe antes de ser adicionado ao objeto.

      Responder
  • Natanael comentou em

    Oi amigo como pode ser utilizado o INNER JOIN para ver os dados de duas tabelas com o método selecionaCampos ? E possível ou tenho que criar outro método para esta consulta no bd ?

    Responder
    • Aconselho que crie uma classe dedicada somente a consultas e implemente nela todos os métodos necessários. Esse curso visa dar uma norte sobre o assunto e cabe a cada um adicionar mais recursos conforme necessidades específicas.

      Responder
  • Olá Ricardo, gostei muito da aula, obrigado desde já.
    O meu código gera o seguinte erro só ao final dessa aula
    Erro:
    Notice: Undefined property: stdClass::$id in C:\xampp\htdocs\PROJETO\teste.php on line 20
    Ele lista o nome e sobre nome mas gera esse erro
    Minha linha 20 no teste.php -> echo $res->id.' / '. $res->nome. ' / '.$res->sobrenome.'';

    Até o momento onde você faz a função selecionaTudo não tive nenhum erro não esperado, mas na função selecionaCampos gera esse erro, não devia mesmo mostrar o id, mas deveria apresentar esse erro?? revisei todos códigos todos arquivos mas ainda está com esse erro.
    Pode dar uma força?

    Responder
  • bernardi comentou em

    Bom dia.
    Meu nome é Reinaldo Bernardi, eu já trabalhava com programação off web à bastante tempo, e agora resolvi fazer um site, mas não tinha nem noção de por onde começar.
    Então há poucos dias encontrei suas aulas no youtube. Elas são muito boas mesmo. Elas já me deram o Sul e o Norte que eu buscava, parabéns pelo seu trabalho.
    Um grande abraço;

    Responder
  • Bom dia Ricardo,
    Primeiro quero parabenizar pelas aulas.
    Estou com uma dúvida sobre consulta no banco com o CRUD.
    Exemplo:
    Como que eu faço para consultar duas tabelas no banco de dados
    Tabela CLIENTES e tabela PEDIDOS.
    Na Tabela CLIENTES tenho os campos (id, nome, sobrenome)
    1|marcos|pereira
    2|Sandra|maria
    3|Daniel|oliveira
    4|jose|carlos

    Na Tabela PEDIDOS tenho os campos (id, id_clientes, produto)
    1|1|bolsa
    2|1|saia
    3|2|saia
    4|4|meia

    SELECT C.id, C.nome, C.sobrenome, P.produto FROM CLIENTES C, PEDIDOS P
    WHERE C.id = P.id_clientes;

    Com o resultado assim
    ID | NOME | SOBRENOME | PRODUTO
    1|marcos|pereira|bolsa
    1|marcos|pereira|saia
    2|Sandra|maria|saia
    4|jose|carlos|meia

    Desde já agradeço muito.

    Responder
    • Fabio, esta série de aulas apresenta apenas exemplos simples para ajudar na lógica de quem nunca trabalhou com OO, exemplos mais completos e complexos, como uma classe exclusiva para consultas por exemplo, ficam a cargo de cada um implementar e adaptar conforme a necessidade.

      Responder
  • wagnerspg comentou em

    Ricardo, primeiramente bom dia, boa tarde ou boa noite .
    Bom estou com o seguinte ERRO : Parse error: syntax error, unexpected T_PUBLIC in crud\modules\class\banco.class.php on line 133

    Mais verifico minha linha 133 e ela esta correta,
    linha 133 - > public function trataerro($arquivo=NULL,$rotina=NULL,$numerro=NULL,$msgerro=NULL,$geraexcept=FALSE){

    Não sei oque fazer, com relaxação as estrutura de if e else e seus fechamentos ';' ou ':' esta tudo correto, sempre quando vou fazer alguma condição faço toda a estrutura e depois escrevo o bloco de código .

    Responder
  • Junior comentou em

    Boa tarde Ricardo, parabéns pelo conteúdo do site. Dificil encontrar alguém que tenha paciência de ensinar em detalhes como desenvolver sites hoje.

    Estou com um pequeno erro que já tentei de todas maneiras encontrar, inclusive já vi as aulas uma dezena de vezes, inclui echo nas variaveis e refiz o código 3 vezes, mas não consigo sair dessa após clicar no botão de logar.

    O erro que recebo é:

    Warning: require_once(/usuarios.class.php): failed to open stream: No such file or directory in /Applications/AMPPS/www/aula/classes/autoload.php on line 6

    Fatal error: require_once(): Failed opening required '/usuarios.class.php' (include_path='.:') in /Applications/AMPPS/www/aula/classes/autoload.php on line 6

    Poderia me ajudar?

    Grato,
    Junior

    Responder
  • Anderson Antonio comentou em

    Ricardo, quero agradece-lo verdadeiramente, pois soube com maestria transmitir não somente as sintaxes do BD, mas uma nova visão de como projetar.
    Tinha visto outros cursos, bem mais longos, porém não conseguia compreender o sentido das coisas e com você não só os consegui como os
    ampliei.
    Gosto da forma que se expressa e também das políticas que estipulou, creio que assim pode qualificar seu público com seriedade.
    Dificilmente compartilho, salvo quando é de extrema qualidade, e os seus cursos faço questão de divulgar.
    Pretendo no futuro conseguir ser um programador e não um digitador de códigos.
    Parabéns, sucesso e até breve.

    Responder
  • Marcelino Martins comentou em

    Ricardo, muito obrigado por este projeto maravilhoso que é doar um pouco do seu conhecimento, suas aulas foram primordiais para meu projeto, valeu.

    Responder
  • junior.oliveira comentou em

    Olá, li com atenção a política de comentários e entendo que vocês não tem qualquer obrigação de solucionar problemas de terceiros, ainda mais de alguém como eu que ainda não sou um usuário que utiliza os recursos pagos do blog, porém, peço gentilmente, se puderem é claro, me ajudar a entender melhor sobre PHP e orientação de objetos, acabei de concluir a visualização de todos os vídeos desta sequencia (CRUD genérico com PHP e OOP), gostei muito das aulas e do modo em que se é explicado o assunto abordado. Acompanhei as explicações e a escrita dos códigos que funcionaram perfeitamente em meus testes.
    Estou com dificuldades em exibir dados de outra tabela do banco de dados em uma mesma página, por exemplo:

    - Tenho uma tabela chamada "ocorrências", e outra chamada "locais";

    - Na tabela "ocorrências" existem duas colunas, 'nome' e 'local'
    - Na Tabela "Locais" existem duas colunas, 'loc_id' e 'nome_do_local';

    - Em 'nome' se armazena o nome de um funcionário e em 'local' o número referente ao nome da empresa que ele trabalha que na tabela "locais" esse número seria 'loc_id';

    Minha dúvida é, como exibo os dados da tabela "ocorrências" porém, em lugar do local não exibir o número referente ao local e sim o nome do local que equivale a aquele numero (loc_id) na tabela "locais"?

    Sei que é simples, se trata de um projeto somente para aprendizado, desde já agradeço a atenção.

    ATT.
    Júnior Oliveira

    Responder
  • Cleverton comentou em

    Aprendi muito OOP com esse CRUD mas que tal adicionar uma sexto vídeo explicando como usar o FOR, WHILE, IF...
    Assim fica mais fácil entender como funciona eles com as classes.

    exemplo:
    listar com o FOR e WHILE ou foreach..
    formas de usar where ou algumas situações no sql.

    estou postando por estar tendo dificuldade em usar o FOR para listar a tabela menu e dentro desse FOR listar o submenu.

    Responder
  • Leonardo comentou em

    Ola Ricardo, poderia explicar melhor o:
    while($res = $cliente->retornaDados())

    Não entendi muito bem.

    Responder
  • Joel comentou em

    Ola, Eu gostaria de tirar uma duvida fui apresentado a OO atravéz de suas aulas. Mas ao pesquisar em outras fontes encontrei muitos falando do PDO. Que pelo que pude entender é uma extenção do php. Pelo que falaram ele é uma evolução ou uma forma melhor de trabalhar com SGBD que o puro OO. Gostaria de saber se você esta familirazado com o PDO, caso esteja, se você realmente acha ele melhor, você desvantagens nele, por que pelo que entendi nele é necessario que um drive do php esteja habilitado e se o servidor em que eu vá hospedar o site não me permita configurar o php.ini . Bem, enfim caso ele seja melhor mesmo, vc ja abordou ou pretende abordar esse assunto?
    Desde, ja agradeço.

    Responder
    • PDO nada mais é que uma classe para trabalhar com o BD, se você criar rotinas e funções bem planejadas o resultado final será o mesmo e você não corre o risco de não poder hospedar o projeto em algum servidor.

      Responder
  • Cara, muito bom. Essas aulas e conteúdo estão entre as melhores que eu vi.
    Pude tirar inúmeras duvidas que eu tinha com o php OO.
    Meus parabéns pelo trabalho.
    Vou utilizar o aprendido aqui na tentativa de criação de um sistema. Grande abraço.

    Responder
  • Paulo Sérgio comentou em

    E ai, Ricardo.
    Sou programador Delphi, asp, asp.net, c#, winform, wpf, e algumas coisitas mais. E agora, estou interessando-me por PHP, graças a vocês com suas vídeo aulas. Quero agradecer pela sua dedicação, e dizer que vou prosseguir vendo se aprendo alguma coisa. Já estou até mudando meu site, usando codeigniter (que vi nas suas video aulas). Você é muito bom, cara! Que Deus te abençoe muito.

    Responder
  • Isaias comentou em

    Olá Ricardo...

    Já olhei a quinta aula umas 3 vezes e refiz os códigos, mas continua me dando erro.. não sei o que fazer...

    /* Mtodo para retorna dados */
    		public function retornaDados($tipo = NULL){
    			switch(strtolower($tipo)):
    				case "array":
    					return mysql_fetch_array($this->dataset);
    					break;
    				case "assoc":
    					return mysql_fetch_assoc($this->dataset);
    					break;
    				case "object":
    					return mysql_fetch_object($this->dataset);
    					break;
    				default:
    					return mysql_fetch_object($this->dataset);
    					break;
    			endswitch;
    		}

    o erro que ele retorna está na parte do default.. mas refiz as aulas e está igual ao seu codigo... mas continua dando erro..

    o erro que ele retorna e o seguinte:

    Warning: mysql_fetch_object(): supplied argument is not a valid MySQL

    o que acha que pode ser??

    Responder
    • O fato de estar acontecendo erro nesta função, não quer dizer que é esta função que está errada. Confira o restante do seu código, provavelmente há erro na hora de alimentar a propriedade DATASET da classe.

      Responder
  • Vagner comentou em

    Gostaria de saber como faço a seleção em outra tabela.
    Tenho uma tabela de posts e esses posts tem uma ou mais categorias que devem ser buscadas em outra tabela.

    Ex.:
    faço a consulta na tabela de posts.
    titulo do post é php
    a categoria do post é 1,2

    tenho que fazer uma consulta na tabela categorias e pesquisar qual é o titulo da categoria 1 e o título da categoria 2

    Não sei se coseguiu entender a minha dúvida?

    Responder
      • Vagner comentou em

        Mas se vou usar outra tabela do banco de dados teria que ter outra classe, mas não posso ter duas classes extendidas da classe base na mesma página. Então como ficaria?

        Responder
        • Basta você criar um objeto do tipo Categoria dentro do loop de repetição dos posts e pegar os dados que você precisar.
          Ou então crie uma classe de consulta que comporte suas necessidades.

          Responder
  • Tiago comentou em

    Ricardo Bernardi blz, velho por favor me ajuda...

    estou tentando fazer o crud mais esta dando erro somente na hora do selecionaCampos,
    da o mesmo erro que ocorreu com você no video, mais mesmo eu colocando o " ." ainda continua ... e o erro só esta dando nessa funçao ... já fiz de tudo para resulver e nada ... o que esta de errado.
    código fonte excluído pois não foi postado conforme regras

    Responder
  • Claudimir comentou em

    Boa tarde Ricardo.
    Louvável sua iniciativa de compartilhar seus conhecimentos conosco.
    Consegui acompanhar as vídeo aulas e funcionar quase tudo.
    Estou com um problema na função selecionaCampos. Esta retornando um erro de sql, ou seja, não está pegando os campos pelo laço. Fiz vários testes e comparei os códigos com os seus e tudo bate, porém, mesmo assim não está pegando os campos para preencher a consulta.
    Veja:
    código fonte excluído pois não foi postado conforme as regras

    Os [echos] coloquei para testar a sql.
    O engraçado da história é que nas outras funções retorna OK.
    Poderia me ajudar?
    Desde já agradeço a atenção.

    Responder
    • Tiago comentou em

      Oi tudo bem, você teve retorno do seu erro??? estou com o mesmo problema!
      se você conseguiu resolver me da moral ... me fala como se faz, porque já fiz de tudo mesmo assim nada.

      Responder
  • Jonnhy Matos comentou em

    Fala Ricardo, tranquilo!
    Olha só. Eu vim assistir o curso do CRUD para poder pegar os arquivos para usar no Painel ADM.
    Fiz tudo exatamente como está na aula, só mudei o nome do banco. Está tudo funcionando corretamente, mas estou recebendo essa mensagem:
    "Warning: mysql_affected_rows(): supplied argument is not a valid MySQL-Link resource in /home/u681251518/public_html/classes/banco.class.php on line 114", pode dar uma força?
    Abraços e obrigado pelo seu compartilhamento.

    Responder
  • Sidney Jr. Miranda comentou em

    Fim do curso, gostaria de te agradece mais essa oportunidade de compartilha conhecimento com a galera.

    Responder
  • Ricardo, estou tendo problemas com a função selecionaTudo,
    quando vou fazer o teste de seleção e utilizo

    Código fonte excluído por não ter sido postado de acordo com as regras

    a função é feita, mas não me mostra os dados contidos em minha tabela.. pode me iluminar?

    Responder
  • Adilio Gobira Neves Reis comentou em

    Olá Ricardo.
    Eu estou com um problema aqui no meu código, eu incluo ele no meu site, ele altera o CSS dele, justamente no header da página, o que será que está acontecendo?
    como faço para corrigir o erro?

    Responder
      • Adilio Gobira Neves Reis comentou em

        Quando eu dou o include na classe que tah com o require_once na class base, dá o erro do CSS,

        não consegui até agora resolver este problema.

        <?php
        require_once 'banco.class.php';
        abstract class base extends banco
        {
        	 public $tabela = '';
        	 public $campos_valores = array();
        	 public $campopk = NULL;
        	 public $valorpk = NULL;
        	 public $select =  '';
        	 public function addCampo($campo=NULL,$valor=NULL)
        	 {
        	 	if($campo != NULL)
        		{
        			$this->campos_valores[$campo] = $valor;
        		}
        	 }
        	 public function delCampo($campo=NULL)
        	 {
        	 	if(array_key_exists($campo, $this->campos_valores))
        		{
        			unset($this->campos_valores[$campo]);
        		}
        	 }
        	 public function setCampo($campo=null,$valor=NULL)
        	 {
        	 	if($campo != NULL && $valor != NULL)
        		{
        			$this->campos_valores[$campo] = $valor;
        		}
        	 }
        	 public function getValor($campo=NULL)
        	 {
        	 	if($campo != NULL && array_key_exists($campo, $this->campos_valores))
        		{
        			return $this->campos_valores[$campo];
        		}
        		else
        		{
        			return FALSE;
        		}
        	 }
        }

        não vi nenhum erro até agora no código mas tah erro no css da página.

        Responder
  • Rafael comentou em

    Ricardo, já finalizando os estudos do código que vc passou, já próximo do final do vídeo que vc coloca o exemplo retirando o id (usando o método selecionaCampos) e depois o nome (usando delCampo) aparece uma notificação para mim, Notice:Undefined property: stdClass::$id in C:\Program Files\EasyPHP-5.3.9\www\crudgenerico\teste.php on line 16, eu não vi você definindo essas propriedades, vou voltar a rever os vídeos se for o caso, qualquer coisa dei-me uma luz se caso até lá eu não encontrar o meu erro. Valeu.

    Responder
  • Rafael comentou em

    Boa tarde Ricardo, a parte visual com um formulário administrativo eu crio ele fazendo comunicação com o arquivo teste.php?

    Responder
    • O arquivo de teste é só um exemplo de utilização, você deve criar a interface e criar a comunicação com as classes a fim de executar as ações necessárias. Mais detalhes serão vistos no curso de criação de um painel administrativo que inicia em junho.

      Responder
  • Rafael comentou em

    Fala Ricardo, muito interessante o seu empenho em doar o seu tempo, você sem dúvida está de parabéns.

    Responder
  • Josemir Costa comentou em

    Boa tarde!
    Gostei muito da sua aula está de parabéns, mas percebi que vc não usa os if e else com os {} e sim com : depois das condições, essa é amaneira mais correta ou é só uma questão de preferência?

    Responder
    • Esta é a maneira de mais fácil entendimento quando temos páginas com muita codificação, pois imagine uma página com 500 linhas de código e lá pelas tantas você vê uma } (fecha chaves). Você simplesmente não vai saber se é o fechamento de um while, if, for ou outro comando, e utilizando esta sintaxe fica mais simples saber do que se trata.
      Eu considero a maneira mais prática para se trabalhar.

      Responder

Deixe seu comentário