Vejo como os iniciantes no desenvolvimento, ainda tem dificuldade para realizar as operações básicas em um registro do banco de dados, as chamadas CRUDs.
Neste tutorial de hoje, vamos discutir como fazer um CRUD com PHP, e banco de dados MySQL, de forma simples e fácil. Vamos aprender a inserir, alterar e excluir um registro da base.
Na verdade, vou dividir este tutorial em duas partes. A primeira, será esta que estamos trabalhando, onde veremos apenas como realizar a tarefa de inserção, alteração e exclusão do banco, e uma segunda, onde iremos melhorar este cadastro, falando mais sobre segurança, validação e etc.
Este tutorial, é de nível baixo, voltado para os amigos que estão começando. Então, mãos às obras! Bom. Antes de mais nada, para que possamos continuar nosso tutorial, vamos criar uma base de dados no MySQL. No meu caso, estou utilizando o WampServer como servidor.
Ah, mas por que, né? Simples. Menos dor de cabeça (rsrsrs), já vem tudo pronto, oh beleza.
Abra sua ferramenta de banco de dados (particularmente agrado muito do Heidisql), e execute o comando a seguir para criação da base (TutoCrudPhp), e sequencialmente, a criação de uma tabela Cliente.
Script de criação do banco MySQL
1 |
CREATE DATABASE TutoCrudPhp; |
Script de criação da tabela
1 2 3 4 5 6 7 8 |
CREATE TABLE Cliente ( Id INT PRIMARY KEY AUTO_INCREMENT, Nome VARCHAR(60) NOT NULL, Email VARCHAR(150) NOT NULL, Cidade VARCHAR(100), UF VARCHAR(2) ) |
Com a base criada, e a tabela também, vamos começar o desenvolvimento do código. Vamos iniciar, com a montagem do formulário HTML, que fará a captação dos dados inseridos pelo usuário no site.
Os campos existentes no formulário, serão basicamente os mesmos existentes na base, como exceção do campo de identificação, onde o mesmo será gerado automaticamente pela função AUTO_INCREMENT, informada por nós, na criação da tabela Cliente.
Abra seu editor de códigos preferido, seu queridinho, e vamos aos códigos. Crie um novo documento, chamado cadastro.php.
No arquivo em questão, vamos criar um formulário HTML (como dito), e também, vamos criar uma tabela que irá mostrar todos os registros cadastrados na base de dados.
Já com o documento criado, vamos adicionar o seguinte código HTML dentro do corpo do documento, ou seja, entre as tags , como mostrado a seguir:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<!DOCTYPE html> <html lang="en"> <head> <title>CRUD com PHP, de forma simples e fácil</title> </head> <body> <form> Nome:<br/> <input type="text" name="nome" placeholder="Qual seu nome?"><br/><br/> E-mail:<br/> <input type="email" name="email" placeholder="Qual seu e-mail?"><br/><br/> Cidade:<br/> <input type="text" name="cidade" placeholder="Qual sua cidade?"><br/><br/> UF:<br/> <input type="text" name="uf" size="2" placeholder="UF"> <br/><br/> <input type="hidden" value="-1" name="id" > <button type="submit">Cadastrar</button> </form> </body> </html> |
Observe a simplicidade do nosso formulário. Feio, simples, e nada atrativo. Mas, como nosso intuito não é ganhar um concurso de estilos, vamos continuar com essa beleza interior.
Observe, que colocamos os campos editáveis, Nome, Email, Cidade e UF. Já o campo de identificação (Id), como dito, será gerado automaticamente quando houver um novo insert no banco.
Vamos trabalhar neste exemplo, em uma mesma página, realizando todas as ações, de acordo com o os dados recebidos, assim, será mais fácil a aplicação e o entendimento.
Bora fazer o negócio funcionar.
Vamos adicionar dois atributos à declaração do formulário, o action e o method. A action, especifica a url para onde os dados captados pelo form serão enviados, enquanto que o method, informa como os dados serão enviados. Em nosso caso, vamos focar no método POST.
Observe como fica a TAG de abertura do formulário.
Antes
1 |
<form> |
Depois
1 |
<form action="<?=$_SERVER["PHP_SELF"]?>" method="POST"> |
Setamos a action como $_SERVER[“PHP_SELF”]. $_SERVER é um array contendo informação como cabeçalhos, paths, e localizações do script, enquanto que o índice PHP_SELF, é o nome do arquivo do script que está executando, relativa à raiz do documento (Fonte: http://php.net/manual/pt_BR/reserved.variables.server.php), assim, resumindo, quando os dados inseridos no formulário submetido, os mesmo serão enviados à mesma página que realizou a requisição, neste caso, a página cadastro.php.
Sendo assim, vamos realizar a validação dos dados recebidos logo no início do nosso arquivo. Antes do início do HTML, vamos adicionar um bloco PHP, responsável por realizar a validação.
1 2 3 4 5 6 7 |
<? //Validando a existência dos dados if(isset($_POST["nome"]) && isset($_POST["email"]) && isset($_POST["cidade"]) && isset($_POST["uf"])) { } ?> |
O bloco inicia-se com uma condição (if), juntamente com uma função nativa do PHP, o isset, que não faz nada a mais que verificar a existência de uma informação, neste caso, os dados enviados via POST, retornando true, para existência, ou false para ausência, por isso, cada campo enviado, sua existência será validada.
Dentro desta condição (if) vamos adicionar outras validações, para que nosso exemplo, fique ao menos prático.
Vamos adicionar por exemplo, a validação para verificar se nossos dados estão preenchidos, utilizando a função empty() do PHP, que parte do mesmo conceito da isset, true para vazio, e false para preenchido.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
//Validando a existência dos dados if(isset($_POST["nome"]) && isset($_POST["email"]) && isset($_POST["cidade"]) && isset($_POST["uf"])) { if(empty($_POST["nome"])) $erro = "Campo nome obrigatório"; else if(empty($_POST["email"])) $erro = "Campo e-mail obrigatório"; else { //Vamos realizar o cadastro ou alteração dos dados enviados. } } ?> |
Após a realização da validação, vamos realizar a inserção dos dados enviados no banco de dados. Vamos utilizar neste exemplo, vamos utilizar a biblioteca MySQLi, explicada no post Conectar no MySQL com PHP e mysqli_connect, onde foi exposto uma conexão com o banco de dados.
Voltando ao código em questão, vamos continuar alterando nosso bloco, agora, adicionando o comando que realiza a inserção no banco. Antes, vamos incluir no início do arquivo, antes ainda deste bloco, o script de conexão, mostrado no post Conectar no MySQL com PHP e mysqli_connect. Veja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<? $obj_mysqli = new mysqli("127.0.0.1", "seu_usuario", "sua_senha", "tutocrudphp"); if ($obj_mysqli->connect_errno) { echo "Ocorreu um erro na conexão com o banco de dados."; exit; } mysqli_set_charset($obj_mysqli, 'utf8'); //Validando a existência dos dados if(isset($_POST["nome"]) && isset($_POST["email"]) && isset($_POST["cidade"]) && isset($_POST["uf"])) { if(empty($_POST["nome"])) $erro = "Campo nome obrigatório"; else if(empty($_POST["email"])) $erro = "Campo e-mail obrigatório"; else { //Vamos realizar o cadastro ou alteração dos dados enviados. } } ?> |
Agora sim, após incluir nossa conexão, vamos ao código de inserção dos dados.
Observe que além da conexão, foi inserido uma chamada à função mysqli_set_charset(), responsável por informar à conexão atual, que os dados serão trabalhados no forma UTF-8. Veja a seguir, o script completo até o momento:
Primeira operação: Inserção dos dados.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
<? $obj_mysqli = new mysqli("127.0.0.1", "root", "", "tutocrudphp"); if ($obj_mysqli->connect_errno) { echo "Ocorreu um erro na conexão com o banco de dados."; exit; } mysqli_set_charset($obj_mysqli, 'utf8'); //Validando a existência dos dados if(isset($_POST["nome"]) && isset($_POST["email"]) && isset($_POST["cidade"]) && isset($_POST["uf"])) { if(empty($_POST["nome"])) $erro = "Campo nome obrigatório"; else if(empty($_POST["email"])) $erro = "Campo e-mail obrigatório"; else { //Vamos realizar o cadastro ou alteração dos dados enviados. $nome = $_POST["nome"]; $email = $_POST["email"]; $cidade = $_POST["cidade"]; $uf = $_POST["uf"]; $stmt = $obj_mysqli->prepare("INSERT INTO `cliente` (`nome`,`email`,`cidade`,`uf`) VALUES (?,?,?,?)"); $stmt->bind_param('ssss', $nome, $email, $cidade, $uf); if(!$stmt->execute()) { $erro = $stmt->error; } else { $sucesso = "Dados cadastrados com sucesso!"; } } } ?> |
No script acima, agora temos, algumas variáveis que recebem os dados POST enviados, um Prepared Statements, que será responsável por trabalhar os dados enviados, de forma a garantir a perfeita inserção dos mesmos, mediante passagem de parâmetros (os ??? são onde os parâmetros serão incluídos), que serão informados no bind_param(), que você pode conhecer mais neste link.
Após isso, apenas mandamos executar a instrução, efetivando a inserção dos dados na tabela cliente.
Para teste, preencha os campos no formulário, e clique em cadastrar. Veja que os dados serão corretamente inseridos no banco.
Veja que criamos duas variáveis extras, $erro e $sucesso. Adicione o código a seguir, logo após a tab de abertura da body do documento, para podermos informar os erros e sucessos obtidos em nosso script.
1 2 3 4 5 6 7 8 |
<? if(isset($erro)) echo '<div style="color:#F00">'.$erro.'</div><br/><br/>'; else if(isset($sucesso)) echo '<div style="color:#00f">'.$sucesso.'</div><br/><br/>'; ?> |
Neste ponto, como já percebeu, já estamos realizando a inserção dos dados no banco, agora, vamos criar o script para alteração.
Vamos criar uma pequena lista de registros, para podermos ver os registros existentes no banco. Abaixo do formulário que criamos, vamos adicionar o código a seguir.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
<br> <br> <table width="400px" border="0" cellspacing="0"> <tr> <td><strong>#</strong></td> <td><strong>Nome</strong></td> <td><strong>Email</strong></td> <td><strong>Cidade</strong></td> <td><strong>UF</strong></td> <td><strong>#</strong></td> </tr> <? $result = $obj_mysqli->query("SELECT * FROM `cliente`"); while ($aux_query = $result->fetch_assoc()) { echo '<tr>'; echo ' <td>'.$aux_query["Id"].'</td>'; echo ' <td>'.$aux_query["Nome"].'</td>'; echo ' <td>'.$aux_query["Email"].'</td>'; echo ' <td>'.$aux_query["Cidade"].'</td>'; echo ' <td>'.$aux_query["UF"].'</td>'; echo ' <td><a href="'.$_SERVER["PHP_SELF"].'?id='.$aux_query["Id"].'">Editar</a></td>'; echo '</tr>'; } ?> </table> |
Pode colocar logo após a tag de fechamento do form, . Agora, com esse código que colocamos, vamos editar um registro. Para tal, vamos utilizar uma passagem de parametro do tipo GET, onde vamos passaro código do nosso registro a ser editado.
Quando recebermos esse código, vamos consultar o registro no banco, e mostrar os dados no formulário. A partir daí, ao clicar no botão, os dados serão alterados.
Vamos alterar o código que já fizemos até o momento, incluindo algumas variáveis, alterando outras, de forma que possamos utilizar o mesmo formulário html, tanto para inserir, quanto para alterar. Veja a seguir. Observe com cuidado as inclusões/alterações que fizemos.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 |
<? $obj_mysqli = new mysqli("127.0.0.1", "root", "", "tutocrudphp"); if ($obj_mysqli->connect_errno) { echo "Ocorreu um erro na conexão com o banco de dados."; exit; } mysqli_set_charset($obj_mysqli, 'utf8'); //Incluímos um código aqui... $id = -1; $nome = ""; $email = ""; $cidade = ""; $uf = ""; //Validando a existência dos dados if(isset($_POST["nome"]) && isset($_POST["email"]) && isset($_POST["cidade"]) && isset($_POST["uf"])) { if(empty($_POST["nome"])) $erro = "Campo nome obrigatório"; else if(empty($_POST["email"])) $erro = "Campo e-mail obrigatório"; else { //Alteramos aqui também. //Agora, o $id, pode vir com o valor -1, que nos indica novo registro, //ou, vir com um valor diferente de -1, ou seja, //o código do registro no banco, que nos indica alteração dos dados. $id = $_POST["id"]; $nome = $_POST["nome"]; $email = $_POST["email"]; $cidade = $_POST["cidade"]; $uf = $_POST["uf"]; //Se o id for -1, vamos realizar o cadastro ou alteração dos dados enviados. if($id == -1) { $stmt = $obj_mysqli->prepare("INSERT INTO `cliente` (`nome`,`email`,`cidade`,`uf`) VALUES (?,?,?,?)"); $stmt->bind_param('ssss', $nome, $email, $cidade, $uf); if(!$stmt->execute()) { $erro = $stmt->error; } else { header("Location:cadastro.php"); exit; } } //se não, vamos realizar a alteraçao dos dados, //porém, vamos nos certificar que o valor passado no $id, seja válido para nosso caso. else if(is_numeric($id) && $id >= 1) { $stmt = $obj_mysqli->prepare("UPDATE `cliente` SET `nome`=?, `email`=?, `cidade`=?, `uf`=? WHERE id = ? "); $stmt->bind_param('ssssi', $nome, $email, $cidade, $uf, $id); if(!$stmt->execute()) { $erro = $stmt->error; } else { header("Location:cadastro.php"); exit; } } //retorna um erro. else { $erro = "Número inválido"; } } } else //Incluimos este bloco, onde vamos verificar a existência do id passado... if(isset($_GET["id"]) && is_numeric($_GET["id"])) { //..,pegamos aqui o id passado... $id = (int)$_GET["id"]; //...montamos a consulta que será realizada.... $stmt = $obj_mysqli->prepare("SELECT * FROM `cliente` WHERE id = ?"); // //passamos o id como parâmetro, do tipo i = int, inteiro... $stmt->bind_param('i', $id); //...mandamos executar a consulta... $stmt->execute(); //...retornamos o resultado, e atribuímos à variável $result... $result = $stmt->get_result(); //...atribuímos o retorno, como um array de valores, //por meio do método fetch_assoc, que realiza um associação dos valores em forma de array... $aux_query = $result->fetch_assoc(); //...onde aqui, nós atribuímos às variáveis. $nome = $aux_query["Nome"]; $email = $aux_query["Email"]; $cidade = $aux_query["Cidade"]; $uf = $aux_query["UF"]; $stmt->close(); } ?> <!DOCTYPE html> <html lang="en"> <head> <title>CRUD com PHP, de forma simples e fácil</title> </head> <body> <? if(isset($erro)) echo '<div style="color:#F00">'.$erro.'</div><br/><br/>'; else if(isset($sucesso)) echo '<div style="color:#00f">'.$sucesso.'</div><br/><br/>'; ?> <form action="<?=$_SERVER["PHP_SELF"]?>" method="POST"> Nome:<br/> <input type="text" name="nome" placeholder="Qual seu nome?" value="<?=$nome?>"><br/><br/> E-mail:<br/> <input type="email" name="email" placeholder="Qual seu e-mail?" value="<?=$email?>"><br/><br/> Cidade:<br/> <input type="text" name="cidade" placeholder="Qual sua cidade?" value="<?=$cidade?>"><br/><br/> UF:<br/> <input type="text" name="uf" size="2" placeholder="UF" value="<?=$uf?>"> <br/><br/> <input type="hidden" value="<?=$id?>" name="id" > <!--Alteramos aqui também, para poder mostrar o texto Cadastrar, ou Salvar, de acordo com o momento. :)--> <button type="submit"><?=($id==-1)?"Cadastrar":"Salvar"?></button> </form> <br> <br> <table width="400px" border="0" cellspacing="0"> <tr> <td><strong>#</strong></td> <td><strong>Nome</strong></td> <td><strong>Email</strong></td> <td><strong>Cidade</strong></td> <td><strong>UF</strong></td> <td><strong>#</strong></td> </tr> <? $result = $obj_mysqli->query("SELECT * FROM `cliente`"); while ($aux_query = $result->fetch_assoc()) { echo '<tr>'; echo ' <td>'.$aux_query["Id"].'</td>'; echo ' <td>'.$aux_query["Nome"].'</td>'; echo ' <td>'.$aux_query["Email"].'</td>'; echo ' <td>'.$aux_query["Cidade"].'</td>'; echo ' <td>'.$aux_query["UF"].'</td>'; echo ' <td><a href="'.$_SERVER["PHP_SELF"].'?id='.$aux_query["Id"].'">Editar</a></td>'; echo '</tr>'; } ?> </table> </body> </html> |
Neste ponto, já nos é possível, incluir dados (quando não estamos passando id nenhum) ou alterá-los (quando for passado id de registro). Agora, o mais simples das ações, o excluir (simples em nosso exemplo. Há casos complexos dependendo do tipo de relação).
Vamos alterar a parte do link Editar, e incluir um simples para excluir do registro. Não vamos entrar muito em detalhes de validação, e etc. Deixarei isso para outro tutorial. Como já temos um blog, realizando a validação do id, caso o mesmo exista, vamos alterá-lo para podermos utilizar na exclusão do registro.
Vamos fazer o seguinte, vamos adicionar uma condição interna, verificando a existência do parâmetro del =true, caso exista, fará a exclusão. Veja.
Altere este bloco…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
if(isset($_GET["id"]) && is_numeric($_GET["id"])) //Incluimos aqui... { $id = (int)$_GET["id"]; $stmt = $obj_mysqli->prepare("SELECT * FROM `cliente` WHERE id = ?"); $stmt->bind_param('i', $id); $stmt->execute(); $result = $stmt->get_result(); $aux_query = $result->fetch_assoc(); $nome = $aux_query["Nome"]; $email = $aux_query["Email"]; $cidade = $aux_query["Cidade"]; $uf = $aux_query["UF"]; $stmt->close(); } |
Por este…
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
if(isset($_GET["id"]) && is_numeric($_GET["id"])) //Incluimos aqui... { $id = (int)$_GET["id"]; if(isset($_GET["del"])) { $stmt = $obj_mysqli->prepare("DELETE FROM `cliente` WHERE id = ?"); $stmt->bind_param('i', $id); $stmt->execute(); header("Location:cadastro.php"); exit; } else { $stmt = $obj_mysqli->prepare("SELECT * FROM `cliente` WHERE id = ?"); $stmt->bind_param('i', $id); $stmt->execute(); $result = $stmt->get_result(); $aux_query = $result->fetch_assoc(); $nome = $aux_query["Nome"]; $email = $aux_query["Email"]; $cidade = $aux_query["Cidade"]; $uf = $aux_query["UF"]; $stmt->close(); } } |
Agora, lá no final do arquivo, onde colocamos um link Editar, vamos adicionar outro ao lado, com o texto Excluir, passando mais um parâmetro, o parâmetro del.
1 2 3 4 5 6 7 8 9 10 11 12 |
while ($aux_query = $result->fetch_assoc()) { echo '<tr>'; echo ' <td>'.$aux_query["Id"].'</td>'; echo ' <td>'.$aux_query["Nome"].'</td>'; echo ' <td>'.$aux_query["Email"].'</td>'; echo ' <td>'.$aux_query["Cidade"].'</td>'; echo ' <td>'.$aux_query["UF"].'</td>'; echo ' <td><a href="'.$_SERVER["PHP_SELF"].'?id='.$aux_query["Id"].'">Editar</a></td>'; echo ' <td><a href="'.$_SERVER["PHP_SELF"].'?id='.$aux_query["Id"].'&del=true">Excluir</a></td>'; echo '</tr>'; } |
Ufa. Até que enfim.
Aqui, já temos uma noção de como criar um CRUD básico em PHP, utilizando a biblioteca MySQLi. Veja que não entramos em questões de boas práticas, detalhes de validação e outros.
A intenção é realmente apresentar um conceito básico de como criar um CRUD com PHP. Espero que tenha ajudado.
Grande abraço. Até o próximo.
Parabéns, essa explicação está maravilhosa.
Muito obrigado.
Obrigado.
Olá Claudeci,
Excelente tutorial, funcionou direitinho em apenas uma página. Parabéns.
Ficou faltando apenas uma confirmação de EXCLUSÃO de registros, por favor se tiver alguma dica ficarei muito agradecido.
Obrigado.
Obrigado. Estarei desenvolvendo novos tutoriais.
só deu erro
Sinto muito. Qual erro?
Bom dia Claudeci, parabéns pelo seu artigo.
Peguei um projeto nos mesmos moldes do seu, e ao acrescentar dois campos como o data-entrada(DATE) e da-saida(DATE), comecei a perder muito tempo, pois não salvava o registro no banco de dados e eu não entendia o porque.
Depois de bastante tempo na busca pela internet, revirando daqui e dali e não achava a resposta.
Foi então que fiz um teste direto com o arquivo de conexão, adicionando a linha do sql de insert.
Consegui descobrir que usando o campo data sem preencher, o registro não salva. Mesmo usando o Default como NULL.
Já tentei de tudo e não consigo resultado positivo.
Também já utilizei o datestamp mas ficou na mesma.
Será possível vc me dar uma solução para isto.
Me manda um email que conversamos.
Boa tarde, vi sua resposta agora.
Aqui vai: [email protected]
Muito top, utilizo o php em grande parte das minhas aplicações, ótimo php for life haha
Bom dia Claudeci, tudo bem?
Cara me ajuda, o trecho do Insert e do Update faz o cadastro.php não funcionar, nem abre, ai comento esse trecho e o cadastro.php abre normalmente. Por favor, será a versão do PHP, to usando a 5.4.16.
Conteúdo interessante. Recentemente publiquei um artigo sobre o tema em: https://devcontratado.com/blog/php/crud-php-mysql . Acredito que possa complementar os estudos se alguém possuir alguma duvida ou pelo menos agregar com mais uma perspectiva.