CRUD genérico com PHP e OOP - Aula 3

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

É chegada a hora de fazer nossa primeira operação do CRUD, a inserção de dados. Agora já temos nossa classe base construida e podemos implementar o método INSERIR da classe banco, que será construido dinamicamente baseado no objeto passado como argumento para a função.

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 40 comentários para este post. Participe você também, clique aqui e comente sobre o assunto.

  • Rubens comentou em

    Alguém pode me ajudar estou tendo o seguinte erro ao clicar no sair Painel, aula 5

    Fatal error: Uncaught Error: Cannot call constructor in /var/www/html/sgvo/classes/usuarios.class.php:14 Stack trace: #0 /var/www/html/sgvo/funcoes.php(26): usuarios->__construct() #1 /var/www/html/sgvo/funcoes.php(3): Inicialize() #2 /var/www/html/sgvo/painel.php(2): require_once('/var/www/html/s...') #3 {main} thrown in /var/www/html/sgvo/classes/usuarios.class.php on line 14

    Responder
  • Fernando comentou em

    Olá Ricardo, no caso do "seleciona tudo", gostaria de saber como posso mostrar o resultado de somente uma id específica da tabela no BD.

    Responder
  • Rubens Pereira comentou em

    Olá Ricardo Bernardi,
    Gostaria de uma opinião se possível sobre os métodos do CRUD, pensando em relação à performance e enxutamento de classes, dessa forma abordada, para cada objeto instanciado da classe clientes, por exemplo, eu teria um insert, update, e por ai vai (CRUD), o que faria que se eu tivesse 4 objetos criados eu teria 4 vezes os métodos do CRUD, então pensando em melhorar isso, criei uma classe CRUD estendida da classe banco, onde estão esses métodos, e quando há a necessidade de alguma operação no banco, instancio ela e chamo o método necessário.
    Como não tenho bons conhecimentos em php não sei considerar se isso é uma boa prática, o que me diz?

    Responder
  • Italo Izaac comentou em

    Olá Ricardo, voltando a ideia de fazer múltiplas inserção no banco de dados, eu pensei mais um pouco e consegui resolver dessa forma:

    com essa estrutura de arrays:

    $array_camposValores = array(
    	"campos" = array("cliente", "cpf"),
    	"valores" = array(
    		array("CLIENTE1", "CPF1"),
    		array("CLIENTE2", "CPF2"),
    		array("CLIENTE3", "CPF3")
    	)
    );

    e com essa função para tratar as informações

    public function inserir($obj=array()){
    		/// MODELO:     INSERT INTO {TABELA} (CAMPO1, CAMPO2) VALUES ('VALOR1','VALOR2'), ('VALOR3', 'VALOR4')
    		$campos=implode(", ", array_values($obj->list['campos']));
    		foreach($obj->list['valores'] as $valor):
    			$valores.="(";
    			//$valores.=implode(", ", array_values($valor));
    			for($i=0;$i<count($valor);++$i):
    				$virgula=($itabela . " ({$campos}) VALUES {$valores}";
    		echo $SQL;
    		$this->excSQL($SQL);
    	} /// fim inserir();

    veja o que você acha da função e da ideia.

    Responder
  • Italo Izaac comentou em

    --------- ÚLTIMA CORREÇÃO DO COMENTÁRIO --------

    Olá Ricardo, eu de novo! Desculpa fazer tantas perguntas!
    Por exemplo, se por ventura eu precisar inserir vários registros na mesma tabela com valores diferentes, exemplo:

    P.S: Isso seria só uma lógica, sei que o código não funciona!

    <?php
    for( $i=1; $i inserir();
    }
    ?>

    Mas como eu faria isto? caso fosse necessário!

    Responder
    • Você deve ter em seu sistema uma função para inserir uma linha e outra para inserção em lote (meu ponto de vista), uma vez que para inserção em lotes não é necessário fazer um INSERT para cada registro. Mais detalhes vide documentação em http://dev.mysql.com/doc/refman/5.6/en/insert.html
      Veja a parte que demonstra uma inserção de vários registros:

      INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);
      Responder
      • Italo Izaac comentou em

        Não sei se a minha ideia está correta, mas por exemplo, se eu colocasse:

        setValor('cliente',array("VALOR1", "VALOR2", "...", "VALOR_N")); ?>

        Talvez esteja correto, mas como eu faria para caso o valor dele fosse um ARRAY, para tratar esse array e botar no formato do comando SQL [ VALUES(1,2,3),(4,5,6),(7,8,9) ] ... tentei de varias maneiras, mas já não consigo mais pensar! rsrsrs, me ajuda por favor...

        Responder
        • Quando você não consegue mais pensar, é porque algo está errado. É hora de largar o código fonte, pegar um pedaço de papel e caneta e botar a lógica no papel antes de continuar programando.

          Responder
  • Italo Izaac comentou em

    Olá Ricardo, estou adorando as aulas de OOP e antes de ver estas tuas aulas eu fiz um método simplificado para inserir, não sei se está correto, mas funcionou, poderia me dar opiniões sobre este meu código? Obrigado...

    public function inserir($table, $valkey)
    	{
    		$campos="";
    		$valores="";
    		foreach($valkey as $keys => $vals):
    			$campos  .= $keys.',';
    			$valores .= '\''.$vals.'\',';
    		endforeach;
    		$campos = substr($campos, 0, strlen($campos)-1);
    		$valores= substr($valores, 0, strlen($valores)-1);
    		
    		$query = mysql_query("INSERT INTO $this->prefix_table{$table} ({$campos}) values ({$valores})");
    		return $query;
    	}
    Responder
  • Rubens comentou em

    Olá Ricardo, agradeço desde já pelos cursos e aulas e pelo Site, uma Belezura que só tudo de bom mesmo. Mas vamos a minha dúvida: em minhas horas vagas no serviço é onde eu procuro aprender PHP e Java, mas por motivos de segurança não é permitido baixar programas na rede, como posso ter um programa para rodar minhas aulas e ver se estou realmente aprendendo e tirar minhas duvidas pois codifico toda a aula revejo os métodos e no final não tenho como ver os resultados. Voce pode me ajudar, existe algum programa que rode um Browser sem precisar estar conectado na Internet?
    Obrigado
    Rubens.

    Responder
  • Jairo comentou em

    Olá, gostaria de saber como faço para inserir um registro e ele me retornar o ID inserido, onde devo modificar na classe para funcionar essa função? Obrigado

    Responder
    • Altere a função de inserção ou então a de execução das queries no banco para retornar o valor necessário. Ou melhor ainda, armazene o ID do último registro inserido em uma propriedade da classe para fácil acesso.

      Responder
  • ProtesT comentou em

    Olá ricador fiz tudo certinho mais na hora de grava os dados na database n vai eu fico dando f5 e nada acontece

    Responder
  • Juliano comentou em

    Olá Ricardo blezura? O meu sistema ta funcionando redondo, mas to com uma dúvida na qual não estou conseguindo resolver, eu tenho duas tabelas no meu BD, clientes e cadastro. Conforme os arquivos que estao no link abaixo:
    http://pastebin.com/7qrgBVuC
    Eu criei a classe cadastro e também a classe clientes, o que eu quero fazer é um relacionamento n/n entre o id da tabela cadastro com a tabela clientes, conforme está no código disponibilizado no link acima, o único erro na hora de inserir dinamicamente na tabel que o valorpk fica 0. Já tentei diversas formas e nada, continua na mesma, será que alguém poderia me dar um help?
    Desde já agradeço

    Responder
    • Eu apenas criei exemplos simples de uso do CRUD, cabe a cada usuário implementar e adicionar novas funcionalidades, tais como relacionamentos ou então tratamento de mais de uma tabela na mesma classe. Com um pouco de lógica tudo é possível.

      Responder
  • Bom dia pessoal, tudo tranquilo, então, to começando a programar php orientado a objetos, mas to com um probleminha na hora de gravar os dados do usuário no banco.

    Tenho um arquivo onde executo esta função, neste arquivo eu estou criando uma classe usuário e extendendo ela da classe principal que é onde esta a função de conexão com o banco, até ai tudo OK, dentro desta classe usuário eu precisaria que ele gravasse em 2 tabelas, na usuarios e na permissões, se eu colocar pra gravar em só uma tabela, grava certinho, mas como eu coloco pra gravar as permissões, vou por o código do arquivo ae

    LINK PARA O CÓDIGO
    http://pastebin.com/rrz1mcbY

    Bom, era isso, espero que alguém gaste 5 minutinhos pra tentar me ajudar

    Abraço a todos e bom fim de semana

    Responder
      • Legal, eu pensei nisso, mas tipo, não teria algum geito de fazer dentro dessa class Usuarios? Tipo, utilizando 2 functions dentro da class Usuarios, uma para cadastrar o usuario e outra para cadastrar as permissões

        A propósito, esta exelente seus videos, parabéns

        Responder
  • hsnunes comentou em

    Ola Ricardo, parabens pelo Blog e conteudo, são excelentes. Tenho uma duvida quanto a aula: Na hora de inserir os metodos para Inserção, Update, etc. Estes métodos poderiam ficar na classe BASE.class.php? Pois assim a classe BANCO.class.php ficaria apenas as informações relacionadas ao Banco e Conexão, e a classe BASE.class.php, como ja tem os metodos para manipular de certa forma os dados das tabelas, também se encarregaria de fazer o CRUD, só para deixar tudo mais certinho (se é que eu esteja certo?).
    Gostaia de ouvir sua opinião, se isto é possivel.
    Valeu.

    Responder
  • Marcio comentou em

    Olá, Ricardo vc poderia me informar como eu faria a inserção com upload de images usando essa mesma logica?
    obrigado e parabéns pelas ótimas aulas.

    Responder
  • Natan Alves comentou em

    Olá ricardo,

    eu estou com um problema olhei a aula e fiz o código olha:

    public function inserir($objeto){
    			# INSERT INTO tabela (campo1, campo2...) VALUES (valor1,valor2...)
    			$sql = "INSERT INTO ".$objeto->tabela." (";
    			for ($i=0; $i<count($objeto->campos_valores); $i++):
    				$sql.= key($objeto->campos_valores);
    				if($i < (count($objeto->campos_valores) -1)):
    					$sql.= ", ";
    				else:
    					$sql.= ") ";
    				endif;	
    			endfor;
    			next($objeto->campos_valores);
    			reset($objeto->campos_valores);
    			$sql.= "VALUES (";
    			for ($i=0; $i<count($objeto->campos_valores); $i++):
    				$sql.= is_numeric($objeto->campos_valores[key($objeto->campos_valores)]) ? $objeto->campos_valores[key($objeto->campos_valores)] : "'".$objeto->campos_valores[key($objeto->campos_valores)]."'";
    				if($i < (count($objeto->campos_valores)-1)):
    					$sql.= ", ";
    				else:
    					$sql.= ") ";
    				endif;	
    			endfor;
    			
    				echo $sql;
    
    		} # End inserir

    Mas aparece:

    INSERT INTO clientes (Nome, Nome, Nome, Nome, Nome) VALUES ('', '', '', '', '')
    
    clientes Object
    (
        [tabela] => clientes
        [campos_valores] => Array
            (
                [Nome] => 
                [Sobrenome] => 
                [nome] => Natan
                [sobrenome] => Alves
                [bairro] => centro
            )
    
        [campopk] => ID
        [valorpk] => 
        [extras_select] => 
        [server] => localhost
        [user] => root
        [pass] => vertrigo
        [db] => php
        [conexao] => 
        [dataset] => 
        [linhasafetadas] => -1
        [connect] => Resource id #6
    )

    Sem o Nome, sobrenome e o bairro.

    Poderia me ajudar?

    Responder
      • Sidney Jr. Miranda comentou em

        nessa mesma dúvida...

        quando meu codigo aparece no print ele fica todo em linha assim:

        INSERT INTO clientes (nome, sobrenome) VALUES ('Ricardo', 'Bernardi') clientes Object ( [tabela] => clientes [campos_valores] => Array ( [nome] => Ricardo [sobrenome] => Bernardi ) [campopk] => id [valorpk] => [extras_select] => [servidor] => localhost [usuario] => root [senha] => [nomebanco] => aulas [conexao] => Resource id #6 [dataset] => [linhasafetadas] => 1 )

        ao inves de fica como na tela dois dessa duvida!!

        Responder
    • klebinho.pk comentou em

      Olá natan estou com os 'mesmos problemas' você conseguiu resolver o seu?

      se sim me add no skype = meu nick.

      Responder
  • romulos.p Batera comentou em

    Cara eu fico tao feliz quando eu vejo uma coisa nova e difícil e aprendo eu conseguir fazer a parte de atualização usando a lógica que você usou nessa aula :D
    Vlw por contribuir com agente

    :D

    Ate mais Abraços

    Responder
    • Parabéns Romulos, vejo que você realmente está interessado em aprender, pois está empregando os conhecimentos ao invés de esperar tudo pronto. Na próxima aula você poderá conferir se pensamos da mesma maneira, pois na aula 4 será passada a parte de UPDATE.

      Responder

Deixe seu comentário