O desenvolvimento web moderno frequentemente exige a manipulação de dados de maneira dinâmica e eficiente e uma das práticas essenciais nesse contexto é a implementação de operações CRUD — Create (Criar), Read (Ler), Update (Atualizar) e Delete (Excluir), portanto, essas operações são fundamentais para gerenciar dados em aplicativos web, permitindo que os usuários interajam com o sistema de forma prática e intuitiva. Nesse tutorial, iremos aprender a criar um CRUD com PHP, MySQL & Bootstrap 5 (Create, Read, Update, Delete).
Ao longo deste tutorial, abordaremos cada uma das operações CRUD em detalhes, desde a configuração do ambiente de desenvolvimento até a implementação e estilização das funcionalidades. No final, você terá um aplicativo totalmente funcional, capaz de realizar todas as operações básicas de gerenciamento de dados com uma interface amigável e profissional.
Vamos agora explorar como implementar um sistema CRUD utilizando PHP, MySQL e Bootstrap 5.
Banco de dados MySQL
Criar banco de dados:
CREATE DATABASE canalti;
Usar a base dados recém-criada:
USE canalti;
Estrutura do Banco de dados:
-- MySQL dump 10.13 Distrib 8.0.16, for macos10.14 (x86_64)
--
-- Host: localhost Database: canalti
-- ------------------------------------------------------
-- Server version 8.0.12
/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
SET NAMES utf8 ;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
--
-- Table structure for table `usuarios`
--
DROP TABLE IF EXISTS `usuarios`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
SET character_set_client = utf8mb4 ;
CREATE TABLE `usuarios` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`nome` varchar(100) NOT NULL,
`email` varchar(100) NOT NULL,
`data_nascimento` date NOT NULL,
`senha` varchar(255) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
--
-- Dumping data for table `usuarios`
--
LOCK TABLES `usuarios` WRITE;
/*!40000 ALTER TABLE `usuarios` DISABLE KEYS */;
/*!40000 ALTER TABLE `usuarios` ENABLE KEYS */;
UNLOCK TABLES;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;
/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
-- Dump completed on 2024-04-22 13:50:30
conexao.php
<?php
define('HOST', '127.0.0.1');
define('USUARIO', 'root');
define('SENHA', 'root');
define('DB', 'canalti');
$conexao = mysqli_connect(HOST, USUARIO, SENHA, DB) or die ('Não foi possível conectar');
?>
index.php
<?php
session_start();
require 'conexao.php';
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Usuários</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/font/bootstrap-icons.min.css">
</head>
<body>
<?php include('navbar.php'); ?>
<div class="container mt-4">
<?php include('mensagem.php'); ?>
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h4> Lista de Usuários
<a href="usuario-create.php" class="btn btn-primary float-end">Adicionar usuário</a>
</h4>
</div>
<div class="card-body">
<table class="table table-bordered table-striped">
<thead>
<tr>
<th>ID</th>
<th>Nome</th>
<th>Email</th>
<th>Data Nascimento</th>
<th>Ações</th>
</tr>
</thead>
<tbody>
<?php
$sql = 'SELECT * FROM usuarios';
$usuarios = mysqli_query($conexao, $sql);
if (mysqli_num_rows($usuarios) > 0) {
foreach($usuarios as $usuario) {
?>
<tr>
<td><?=$usuario['id']?></td>
<td><?=$usuario['nome']?></td>
<td><?=$usuario['email']?></td>
<td><?=date('d/m/Y', strtotime($usuario['data_nascimento']))?></td>
<td>
<a href="usuario-view.php?id=<?=$usuario['id']?>" class="btn btn-secondary btn-sm"><span class="bi-eye-fill"></span> Visualizar</a>
<a href="usuario-edit.php?id=<?=$usuario['id']?>" class="btn btn-success btn-sm"><span class="bi-pencil-fill"></span> Editar</a>
<form action="acoes.php" method="POST" class="d-inline">
<button onclick="return confirm('Tem certeza que deseja excluir?')" type="submit" name="delete_usuario" value="<?=$usuario['id']?>" class="btn btn-danger btn-sm">
<span class="bi-trash3-fill"></span> Excluir
</button>
</form>
</td>
</tr>
<?php
}
} else {
echo '
<h5>Nenhum usuário encontrado</h5>
';
}
?>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>
navbar.php
<nav class="navbar navbar-dark bg-dark"> <div class="container-md"> <a class="navbar-brand" href="#">CRUD - Canal TI</a> </div> </nav>
mensagem.php
<?php if (isset($_SESSION['mensagem'])): ?> <div class="alert alert-warning alert-dismissible fade show" role="alert"> <?= $_SESSION['mensagem']; ?> <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button> </div> <?php unset($_SESSION['mensagem']); endif; ?>
acoes.php
<?php
session_start();
require 'conexao.php';
if (isset($_POST['create_usuario'])) {
$nome = mysqli_real_escape_string($conexao, trim($_POST['nome']));
$email = mysqli_real_escape_string($conexao, trim($_POST['email']));
$data_nascimento = mysqli_real_escape_string($conexao, trim($_POST['data_nascimento']));
$senha = isset($_POST['senha']) ? mysqli_real_escape_string($conexao, password_hash(trim($_POST['senha']), PASSWORD_DEFAULT)) : '';
$sql = "INSERT INTO usuarios (nome, email, data_nascimento, senha) VALUES ('$nome', '$email', '$data_nascimento', '$senha')";
mysqli_query($conexao, $sql);
if (mysqli_affected_rows($conexao) > 0) {
$_SESSION['mensagem'] = 'Usuário criado com sucesso';
header('Location: index.php');
exit;
} else {
$_SESSION['mensagem'] = 'Usuário não foi criado';
header('Location: index.php');
exit;
}
}
if (isset($_POST['update_usuario'])) {
$usuario_id = mysqli_real_escape_string($conexao, $_POST['usuario_id']);
$nome = mysqli_real_escape_string($conexao, trim($_POST['nome']));
$email = mysqli_real_escape_string($conexao, trim($_POST['email']));
$data_nascimento = mysqli_real_escape_string($conexao, trim($_POST['data_nascimento']));
$senha = mysqli_real_escape_string($conexao, trim($_POST['senha']));
$sql = "UPDATE usuarios SET nome = '$nome', email = '$email', data_nascimento = '$data_nascimento'";
if (!empty($senha)) {
$sql .= ", senha='" . password_hash($senha, PASSWORD_DEFAULT) . "'";
}
$sql .= " WHERE id = '$usuario_id'";
mysqli_query($conexao, $sql);
if (mysqli_affected_rows($conexao) > 0) {
$_SESSION['mensagem'] = 'Usuário atualizado com sucesso';
header('Location: index.php');
exit;
} else {
$_SESSION['mensagem'] = 'Usuário não foi atualizado';
header('Location: index.php');
exit;
}
}
if (isset($_POST['delete_usuario'])) {
$usuario_id = mysqli_real_escape_string($conexao, $_POST['delete_usuario']);
$sql = "DELETE FROM usuarios WHERE id = '$usuario_id'";
mysqli_query($conexao, $sql);
if (mysqli_affected_rows($conexao) > 0) {
$_SESSION['message'] = 'Usuário deletado com sucesso';
header('Location: index.php');
exit;
} else {
$_SESSION['message'] = 'Usuário não foi deletado';
header('Location: index.php');
exit;
}
}
?>
usuario-create.php
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Usuário - Criar</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<?php include('navbar.php'); ?>
<div class="container mt-5">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h4>Adicionar usuário
<a href="index.php" class="btn btn-danger float-end">Voltar</a>
</h4>
</div>
<div class="card-body">
<form action="acoes.php" method="POST">
<div class="mb-3">
<label>Nome</label>
<input type="text" name="nome" class="form-control">
</div>
<div class="mb-3">
<label>Email</label>
<input type="text" name="email" class="form-control">
</div>
<div class="mb-3">
<label>Data de Nascimento</label>
<input type="date" name="data_nascimento" class="form-control">
</div>
<div class="mb-3">
<label>Senha</label>
<input type="password" name="senha" class="form-control">
</div>
<div class="mb-3">
<button type="submit" name="create_usuario" class="btn btn-primary">Salvar</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>
usuario-edit.php
<?php
session_start();
require 'conexao.php';
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Usuário - Editar</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<?php include('navbar.php'); ?>
<div class="container mt-5">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h4>Editar usuário
<a href="index.php" class="btn btn-danger float-end">Voltar</a>
</h4>
</div>
<div class="card-body">
<?php
if (isset($_GET['id'])) {
$usuario_id = mysqli_real_escape_string($conexao, $_GET['id']);
$sql = "SELECT * FROM usuarios WHERE id='$usuario_id'";
$query = mysqli_query($conexao, $sql);
if (mysqli_num_rows($query) > 0) {
$usuario = mysqli_fetch_array($query);
?>
<form action="acoes.php" method="POST">
<input type="hidden" name="usuario_id" value="<?=$usuario['id']?>">
<div class="mb-3">
<label>Nome</label>
<input type="text" name="nome" value="<?=$usuario['nome']?>" class="form-control">
</div>
<div class="mb-3">
<label>Email</label>
<input type="text" name="email" value="<?=$usuario['email']?>" class="form-control">
</div>
<div class="mb-3">
<label>Data de Nascimento</label>
<input type="date" name="data_nascimento" value="<?=$usuario['data_nascimento']?>" class="form-control">
</div>
<div class="mb-3">
<label>Senha</label>
<input type="password" name="senha" class="form-control">
</div>
<div class="mb-3">
<button type="submit" name="update_usuario" class="btn btn-primary">Salvar</button>
</div>
</form>
<?php
} else {
echo "
<h5>Usuário não encontrado</h5>
";
}
}
?>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>
usuario-view.php
<?php
require 'conexao.php';
?>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Usuário - Visualizar</title>
<link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-QWTKZyjpPEjISv5WaRU9OFeRpok6YctnYmDr5pNlyT2bRjXh0JMhjY6hW+ALEwIH" crossorigin="anonymous">
</head>
<body>
<?php include('navbar.php'); ?>
<div class="container mt-5">
<div class="row">
<div class="col-md-12">
<div class="card">
<div class="card-header">
<h4>Visualizar usuário
<a href="index.php" class="btn btn-danger float-end">Voltar</a>
</h4>
</div>
<div class="card-body">
<?php
if (isset($_GET['id'])) {
$usuario_id = mysqli_real_escape_string($conexao, $_GET['id']);
$sql = "SELECT * FROM usuarios WHERE id='$usuario_id'";
$query = mysqli_query($conexao, $sql);
if (mysqli_num_rows($query) > 0) {
$usuario = mysqli_fetch_array($query);
?>
<div class="mb-3">
<label>Nome</label>
<p class="form-control">
<?=$usuario['nome'];?>
</div>
<div class="mb-3">
<label>Email</label>
<p class="form-control">
<?=$usuario['email'];?>
</div>
<div class="mb-3">
<label>Data Nascimento</label>
<p class="form-control">
<?=date('d/m/Y', strtotime($usuario['data_nascimento']));?>
</div>
<?php
} else {
echo "
<h5>Usuário não encontrado</h5>
";
}
}
?>
</div>
</div>
</div>
</div>
</div>
<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/bootstrap.bundle.min.js" integrity="sha384-YvpcrYf0tY3lHB60NNkmXc5s9fDVZLESaAA55NDzOxhy9GkcIdslK1eN7N6jIeHz" crossorigin="anonymous"></script>
</body>
</html>
Conclusão
Implementar um sistema CRUD com PHP, MySQL e Bootstrap 5 é, sem dúvida, uma excelente maneira de entender os fundamentos do desenvolvimento web e a interação entre o front-end e o back-end. Ao longo deste tutorial, portanto, exploramos como essas três tecnologias se combinam para criar uma aplicação web funcional e moderna.
Através das operações de Create, Read, Update e Delete, você aprendeu a realizar as tarefas essenciais de gerenciamento de dados, permitindo a criação, visualização, atualização e exclusão de registros de forma dinâmica. Esse conhecimento é, portanto, fundamental para o desenvolvimento de aplicações web mais complexas e robustas no futuro.
Espero que este tutorial tenha fornecido uma base sólida para você continuar explorando e aprimorando suas habilidades em desenvolvimento web. Além disso, a prática contínua e a busca por novos desafios são essenciais para se tornar um desenvolvedor mais competente e versátil. Portanto, continue experimentando, aprendendo e desenvolvendo projetos cada vez mais sofisticados.
