sexta-feira, 27 de maio de 2011

CRUD COMPETO EM PHP E MYSQL

CRUD COMPETO COM PHP E MYSQL



Em 1º lugar vamos a uma breve descrição de o que é CRUD:

CRUD é o acrônimo ("sigla") da expressão em língua Inglesa Create, Retrieve, Update e Delete, usada para definir quatro operações básicas usadas em bancos de dados.

A abreviação CRUD mapeada para o padrão ISO/SQL:
Create INSERT
Retrieve (Read) SELECT
Update UPDATE
Destroy (Delete) DELETE


As operações CRUD também são relevantes em interfaces para usuários de vários níveis. Por exemplo, em um programa de Catálogo de Endereços, uma entrada de um contato individual pode ser considerada a unidade básica de persistência. As operações mínimas para este tipo de programa são:

Create Criar ou adicionar novas entradas
Retrieve (Read) Ler, recuperar ou ver entradas existentes
Update Atualizar ou editar entradas existentes
Destroy (Delete) Remover entradas existentes

Bom, agora que todos já sabem o conceito de CRUD, vamos colocá-lo em prática.

Em nosso tutorial, vamos usar como exemplo um cadastro de produtos.

Sem mais blá-blá-blá e mãos a obra...


CRIANDO O BANCO DE DADOS


Um script simples para criação do banco 'Crud' com a tabela 'produto' que tem apenas 2 campos: nome e descrição.



CREATE DATABASE IF NOT EXISTS crud;
USE crud;

DROP TABLE IF EXISTS `produto`;
CREATE TABLE `produto` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `nome` varchar(45) NOT NULL,
  `descricao` varchar(45) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=latin1;







ESTABELECENDO CONEXÃO COM O BANCO DE DADOS

Crie uma pasta chamada 'config' dentro de seu projeto , nessa pasta iram os arquivos de configuração do nosso projeto.Nessa mesma pasta criaremos o 'conexao.class.php' para a conexão com o banco de dados.


conexao.class.php:
<?php

class conexao
{

    /*
        Altere as variaveis a seguir caso necessario
    */

    private $db_host = 'localhost'; // servidor
    private $db_user = 'root'; // usuario do banco
    private $db_pass = ''; // senha do usuario do banco
    private $db_name = 'crud'; // nome do banco

    private $con = false;

 
    public function connect() // estabelece conexao
    {
        if(!$this->con)
        {
            $myconn = @mysql_connect($this->db_host,$this->db_user,$this->db_pass);
            if($myconn)
            {
                $seldb = @mysql_select_db($this->db_name,$myconn);
                if($seldb)
                {
                    $this->con = true;
                    return true;
                }
                else
                {
                    return false;
                }
            }
            else
            {
                return false;
            }
        }
        else
        {
            return true;
        }
    }

 
    public function disconnect() // fecha conexao
    {
    if($this->con)
    {
        if(@mysql_close())
        {
                        $this->con = false;
            return true;
        }
        else
        {
            return false;
        }
    }
    }
    
}

?>


Com essa simples classe podemos efetuar conexão com o banco de dados, agora podemos partir para o próximo passo.


PREPARANDO AS OPERAÇÕES BÁSICAS DE ACESSO AO BANCO DE DADOS


Vamos criar mais uma classe que servira para algumas operações de nosso sistema CRUD , o crud.class.php.


crud.class.php:
<?php

/** Classe CRUD - Create, Recovery, Update and Delete
  * @author - Rodolfo Leonardo Medeiros
  * @date - 25/09/2009
  * Arquivo - codigo.class.php
  * @package crud
  */
 
  class crud
  {
    private $sql_ins="";
    private $tabela="";
    private $sql_sel="";

    // Caso pretendamos que esta classe seja herdada por outras, então alguns atrubutos podem ser protected

    /** Método construtor
      * @method __construct
      * @param string $tabela
      * @return $this->tabela
      */            
      public function __construct($tabela) // construtor, nome da tabela como parametro
      {
          $this->tabela = $tabela;
        return $this->tabela;
    }
        
    /** Método inserir
      * @method inserir
      * @param string $campos
      * @param string $valores
      * @example: $campos = "codigo, nome, email" e $valores = "1, 'João Brito', 'joao@joao.net'"
      * @return void
      */        
    public function inserir($campos, $valores) // funçao de inserçao, campos e seus respectivos valores como parametros
    {
        $this->sql_ins = "INSERT INTO " . $this->tabela . " ($campos) VALUES ($valores)";
        if(!$this->ins = mysql_query($this->sql_ins))
        {
            die ("<center>Erro na inclusão " . '<br>Linha: ' . __LINE__ . "<br>" . mysql_error() . "<br>
                <a href='index.php'>Voltar ao Menu</a></center>");
        }else{
            print "<script>location='index.php';</script>";
        }
    }

    public function atualizar($camposvalores, $where = NULL) // funçao de ediçao, campos com seus respectivos valores e o campo id que define a linha a ser editada como parametros
    {
        if ($where)
        {
            $this->sql_upd = "UPDATE  " . $this->tabela . " SET $camposvalores WHERE $where";          
        }else{
            $this->sql_upd = "UPDATE  " . $this->tabela . " SET $camposvalores";
          }
        
        if(!$this->upd = mysql_query($this->sql_upd))
        {
            die ("<center>Erro na atualização " . "<br>Linha: " . __LINE__ . "<br>" .mysql_error() . "<br>
                <a href='index.php'>Voltar ao Menu</a></center>");
        }else{
            print "<center>Registro Atualizado com Sucesso!<br><a href='index.php'>Voltar ao Menu</a></center>";
        }
    }    

    /** Método excluir
      * @method excluir
      * @param string $where
      * @example: $where = " codigo=2 AND nome='João' "
      * @return void
      */        
    public function excluir($where = NULL) // funçao de exclusao, campo que define a linha a ser editada como parametro
    {
        if ($where)
        {
            $this->sql_sel = "SELECT * FROM " . $this->tabela . " WHERE $where";
            $this->sql_del = "DELETE FROM " . $this->tabela . " WHERE $where";
        }else{
            $this->sql_sel = "SELECT * FROM " . $this->tabela;
            $this->sql_del = "DELETE FROM " . $this->tabela;
          }
          $sel=mysql_query($this->sql_sel);
        $regs=mysql_num_rows($sel);
      
      if ($regs > 0){
        if(!$this->del = mysql_query($this->sql_del))
        {
            die ("<center>Erro na exclusão " . '<br>Linha: ' . __LINE__ . "<br>" .mysql_error() ."<br>
                <a href='index.php'>Voltar ao Menu</a></center>" );
        }else{
            print "<center>Registro Excluído com Sucesso!<br><a href='index.php'>Voltar ao Menu</a></center>";
        }
      }else{
            print "<center>Registro Não encontrado!<br><a href='index.php'>Voltar ao Menu</a></center>";
      }
    }    
      
 }        
    
?>




LISTANDO ITENS DA TABELA


Agora vamos listar os cadastros da tabela de maneira simples.


index.php:
<?php
    require_once 'config/conexao.class.php';
    require_once 'config/crud.class.php';

    $con = new conexao(); // instancia classe de conxao
    $con->connect(); // abre conexao com o banco
?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <?php
            //apenas testando a conexao
            if($con->connect() == true){
                echo 'Conectou';
            }else{
                echo 'Não conectou';
            }
        ?>
        <a href="formulario.php">
            Novo
        </a>
        <table style="border: 1px solid red;">
            <thead>
                <tr>
                    <th>
                        Nome
                    </th>
                    <th>
                        Descri&ccedil;&atilde;o
                    </th>
                </tr>
            </thead>
            <tbody>
                <?php
                    $consulta = mysql_query("SELECT * FROM produto"); // query que busca todos os dados da tabela PRODUTO
                    while($campo = mysql_fetch_array($consulta)){ // laço de repetiçao que vai trazer todos os resultados da consulta
                ?>
                    <tr>
                        <td>
                            <?php echo $campo['nome']; // mostrando o campo NOME da tabela ?>
                        </td>
                        <td>
                            <?php echo $campo['descricao']; // mostrando o campo DESCRICAO da tabela ?>
                        </td>
                        <td>
                            <a href="formulario.php?id=<?php echo $campo['id']; //pega o campo ID para a ediçao ?>">
                                Editar
                            </a>
                        </td>
                        <td>
                            <a href="excluir.php?id=<?php echo $campo['id'];  //pega o campo ID para a exclusao ?>">
                                Excluir
                            </a>
                        </td>
                    </tr>
                <?php } ?>
            </tbody>
        </table>
    </body>
</html>
<?php $con->disconnect(); // fecha conexao com o banco ?>




FORMULÁRIO PARA CADASTRO E EDIÇÃO


Podemos usar o mesmo formulário para cadastro e edição, apenas com algum código a mais, vale a pena dependendo do caso.


formulario.php:
<?php
    require_once 'config/conexao.class.php';
    require_once 'config/crud.class.php';

    $con = new conexao(); // instancia classe de conxao
    $con->connect(); // abre conexao com o banco
    @$getId = $_GET['id'];  //pega id para ediçao caso exista
    if(@$getId){ //se existir recupera os dados e tras os campos preenchidos
        $consulta = mysql_query("SELECT * FROM produto WHERE id = + $getId");
        $campo = mysql_fetch_array($consulta);
    }
   
    if(isset ($_POST['cadastrar'])){  // caso nao seja passado o id via GET cadastra
        $nome = $_POST['nome'];  //pega o elemento com o pelo NAME
        $descricao = $_POST['descricao']; //pega o elemento com o pelo NAME
        $crud = new crud('produto');  // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
        $crud->inserir("nome,descricao", "'$nome','$descricao'"); // utiliza a funçao INSERIR da classe crud
        header("Location: index.php"); // redireciona para a listagem
    }

    if(isset ($_POST['editar'])){ // caso  seja passado o id via GET edita
        $nome = $_POST['nome']; //pega o elemento com o pelo NAME
        $descricao = $_POST['descricao']; //pega o elemento com o pelo NAME
        $crud = new crud('produto'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
        $crud->atualizar("nome='$nome',descricao='$descricao'", "id='$getId'"); // utiliza a funçao ATUALIZAR da classe crud
        header("Location: index.php"); // redireciona para a listagem
    }

?>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title></title>
    </head>
    <body>
        <form action="" method="post"><!--   formulario carrega a si mesmo com o action vazio  -->
           
            <label>Nome:</label>
            <input type="text" name="nome" value="<?php echo @$campo['nome']; // trazendo campo preenchido caso esteja no modo de ediçao ?>" />
            <br />
            <br />
            <label>Descri&ccedil;&atilde;o:</label>
            <input type="text" name="descricao" value="<?php echo @$campo['descricao']; // trazendo campo preenchido caso esteja no modo de ediçao ?>" />
            <br />
            <br />
            <?php
                if(@!$campo['id']){ // se nao passar o id via GET nao está editando, mostra o botao de cadastro
            ?>
                <input type="submit" name="cadastrar" value="Cadastrar" />
            <?php }else{ // se  passar o id via GET  está editando, mostra o botao de ediçao ?>
                <input type="submit" name="editar" value="Editar" />   
            <?php } ?>
        </form>
    </body>
</html>
<?php $con->disconnect(); // fecha conexao com o banco ?
>


EXCLUINDO REGISTRO DA TABELA


Na listagem existe um link para excluir cada registro, esse link leva para o 'excluir.php' que deleta o registro selecionado da tabela


excluir.php:
<?php
    require_once 'config/conexao.class.php';
    require_once 'config/crud.class.php';

    $con = new conexao();  // instancia classe de conxao
    $con->connect(); // abre conexao com o banco

    $crud = new crud('produto'); // instancia classe com as operaçoes crud, passando o nome da tabela como parametro
    $id = $_GET['id']; //pega id para exclusao caso exista
    $crud->excluir("id = $id"); // exclui o registro com o id que foi passado

    $con->disconnect(); // fecha a conexao

    header("Location: index.php"); // redireciona para a listagem
?
>

Baixar arquivos do projeto

Assim finalizamos nosso tutorial CRUD com PHP e MYSQL.Aqui utilizamos orientação a objetos de uma maneira simples e útil.É isso ai galera, em breve volto com mais tutoriais, valeu e até a próxima.

38 comentários:

Anônimo disse...

Muito bom, funciona perfeitamente. Fácil de entender para quem está começando.

Nickoly Marques disse...

Perfeito... Muito bom tutorial, funciona perfeitamente.

Vlw ;)

Alex Alonso disse...

Parabens, pode crer que usarei seu tutorial como base pra tudo daqui em diante :)

Bom, tenho só 1 ano de experiencia com POO, mas foi o tutorial mais bem estruturado e ao mesmo tempo simples, digo, de facil entendimento pra qm ja tem uma base, é claro, que vi em todo esse tempo.

Londerson disse...

Rodiki, a suas classes ficaram muito boas, ficaram bem claras, diretas e ultiliza bem as ferramentas oo. Parabéns, e estamos a espera de mais tutoriais!

Anônimo disse...

O meu esta dando um erro :


Erro na inclus�o
Linha_LINE_
Column count doesn't match value count at row 1

Saberia me dizer o porque ?

Eric disse...

Como trazer uma combo preenchida no editar?

Anônimo disse...

muito bom este tutorial, grato pela colaboração

Heitor Holanda disse...

Tuto muito show, parabens...

Anônimo disse...

Pessoal, tem o Crudin, um framwework em PHP e MySQL que gera automaticamente o CRUD para todas as tabelas da base sem precisar programar nada...so precisa mudar as configurações de conexão com a base de dados

http://crudin.smarc.com.br

jocelio disse...

Essa passagem de id via GET é uma falha de segurança; mas fora isso ta show, POO e tudo :)

Fabão disse...

Olá,
Gostei muito do tutorial e vou usa-lo como base para os meus sistemas, mas eu tenho uma dúvida: Em alguns códigos tem o @ na frente do nome da variável ou funcao, como por exemplo no arquivo conexao_class.php que tem a funcao @mysql_connect() o que significa? Poderia me explicar?

wsm disse...

muito bom, só gostaria de saber como fazer edição com um filtro de nome um select from where nome=? como declaro

Ayres disse...

ola, tenho a mesma duvida do Fabao, para que serve o @ ?

obrigado.

Muito bom

Thadeu Esteves Jr - Blog para Estudos disse...

Parabens brother, crud perfeito , bem legivel para qualquer desenvolvedor, por ter certeza que vai ajudar muita gente no mundo dos devs juniors.

grande abraco, mais um leitor de seu blog =D

Anônimo disse...

Muito Legal...

Parabéns pela iniciativa e pela dedicação.

Anônimo disse...

Preciso aprender php em 3 meses... por onde começo? Gostaria de dicas.

Agradeço!

jheina_hta@hotmail.com

Anônimo disse...

click for source

Here is my blog ... bankruptcy file
My website > jacksonville foreclosure defense

Unknown disse...

show de bola.. obrigado!

Tiago Barbosa disse...

E o CRUD pra dar select? Tá devendo! rs Mas esses 3 já estão SHOW! Encontrei um outro que faz select também, mas é muito mais complicado. Abs!

CodigosnaWeb disse...

Muito útil.
http://www.codigosnaweb.com/forum/

Anônimo disse...

Great beat ! I wish to apρгentiсe while you amenԁ your
web sіte, how could i subsсгibe for a blog
site? The аcсount aіded me a aсceptable
deal. I haԁ been a little bit аcquaіnted оf this youг broadcast prοvіԁed bгight cleаr іdea

Alsο visіt mу homеρage - payday loans

ADOCICADOCE disse...

parabéns muito bom !! aprendi o mesmo conceito só que em JAVA na facul, praticamente mesma coisa, muda só os Codigos.

Leonardo disse...

Muito obrigado, funcionou perfeitamente

pk disse...

Como inserir fotos no banco de dados (tipo BLOB) usando essa abordagem?

MSC Informatica disse...

Eu criei uma nova base de testes, consigo fazer o Delete e Exclud, mas
estou com dificuldades para fazer o update, alguém poderia me dar uma força?

Frederico Brigatte disse...

É genérico esse crud?

Frederico Brigatte disse...

É genérico esse crud?

Unknown disse...

No meu está dando este erro:

Warning: mysql_fetch_array() expects parameter 1 to be resource.

Alguem poderia judar por favor?

Obrigado.

Unknown disse...

No meu está dando este erro:

Warning: mysql_fetch_array() expects parameter 1 to be resource.

Alguem poderia judar por favor?

Obrigado.

Ale disse...

Bom dia, quando coloco para editar ele apresenta a mensagem de erro "Linha: 54
Duplicate entry '7' for key 'PRIMARY'"
Isso ocorre quando tem mais de 1 registro no BD.
Estou tentando corrigir e nao estou conseguindo.

Alguem pode me ajudar?

Marcelo Barbosa de Freitas disse...

Muito Obrigado...\0/

Tecnologia da Informação disse...

Olá o @ elimina erros nativo doPHP

Tecnologia da Informação disse...

Olá o @ elimina erros nativo doPHP

Anônimo disse...

Este crud ajudou a esclarecer! vlw

Ricardo Borão disse...

Estava exatamente com essa dificuldade em fazer CRUD. Obrigado por compartilhar!

Anônimo disse...

Cara simplicidade em php é tudo mano faço algo mais simples isso já é para uma pessoa que entende muito de php e vai levar alguns minutos para entender essas 4 funcionalidades.

Marcos Paulo disse...

Muito Bom! salvou minha pelo, com um projeto da faculdade Valeu!....

Anônimo disse...

Não mexi em nada e deu esse erro no index.php ... Parse error: syntax error, unexpected T_INCLUDE in C:\Users\Acer\Desktop\orientado\teste\index.php on line 2...
o que poderia ser?

Postar um comentário

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cna certification