Como criar um CRUD (Create, Read, Update, Delete) em PHP com MySQL.
Esse exemplo usa a extensão MySQLi para realizar as operações no banco de dados.
Passo 1: Criação do Banco de Dados e Tabela
Execute o seguinte script SQL para criar o banco de dados e uma tabela chamada users
:
CREATE DATABASE crud_example;
USE crud_example;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE
);
Passo 2: Conexão com o Banco de Dados
Crie um arquivo config.php
para gerenciar a conexão com o banco de dados:
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "crud_example";
// Conexão com o banco
$conn = new mysqli($servername, $username, $password, $dbname);
// Verifica conexão
if ($conn->connect_error) {
die("Falha na conexão: " . $conn->connect_error);
}
?>
Passo 3: Página Principal
Crie um arquivo index.php
para listar os usuários e adicionar funcionalidades de criação, edição e exclusão:
<?php
include 'config.php';
// Leitura dos dados
$sql = "SELECT * FROM users";
$result = $conn->query($sql);
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CRUD em PHP</title>
</head>
<body>
<h1>Lista de Usuários</h1>
<a href="create.php">Adicionar Novo Usuário</a>
<table border="1">
<tr>
<th>ID</th>
<th>Nome</th>
<th>Email</th>
<th>Ações</th>
</tr>
<?php while ($row = $result->fetch_assoc()) { ?>
<tr>
<td><?= $row['id'] ?></td>
<td><?= $row['name'] ?></td>
<td><?= $row['email'] ?></td>
<td>
<a href="edit.php?id=<?= $row['id'] ?>">Editar</a>
<a href="delete.php?id=<?= $row['id'] ?>" onclick="return confirm('Tem certeza que deseja excluir?')">Excluir</a>
</td>
</tr>
<?php } ?>
</table>
</body>
</html>
Passo 4: Criar Usuário
Crie um arquivo create.php
para adicionar um novo usuário:
<?php
include 'config.php';
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$name = $_POST['name'];
$email = $_POST['email'];
$sql = "INSERT INTO users (name, email) VALUES ('$name', '$email')";
if ($conn->query($sql) === TRUE) {
header("Location: index.php");
exit;
} else {
echo "Erro: " . $conn->error;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Criar Usuário</title>
</head>
<body>
<h1>Adicionar Novo Usuário</h1>
<form method="POST">
<label for="name">Nome:</label>
<input type="text" id="name" name="name" required>
<br>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<br>
<button type="submit">Salvar</button>
</form>
</body>
</html>
Passo 5: Editar Usuário
Crie um arquivo edit.php
para editar um usuário existente:
<?php
include 'config.php';
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
$result = $conn->query($sql);
$user = $result->fetch_assoc();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$name = $_POST['name'];
$email = $_POST['email'];
$sql = "UPDATE users SET name='$name', email='$email' WHERE id=$id";
if ($conn->query($sql) === TRUE) {
header("Location: index.php");
exit;
} else {
echo "Erro: " . $conn->error;
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Editar Usuário</title>
</head>
<body>
<h1>Editar Usuário</h1>
<form method="POST">
<label for="name">Nome:</label>
<input type="text" id="name" name="name" value="<?= $user['name'] ?>" required>
<br>
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="<?= $user['email'] ?>" required>
<br>
<button type="submit">Salvar</button>
</form>
</body>
</html>
Passo 6: Excluir Usuário
Crie um arquivo delete.php
para excluir um usuário:
<?php
include 'config.php';
$id = $_GET['id'];
$sql = "DELETE FROM users WHERE id=$id";
if ($conn->query($sql) === TRUE) {
header("Location: index.php");
exit;
} else {
echo "Erro: " . $conn->error;
}
?>
Como Rodar o Projeto
- Configure o servidor local (como XAMPP ou LAMP).
- Coloque todos os arquivos em uma pasta dentro do diretório público (
htdocs
ou equivalente). - Acesse
http://localhost/sua_pasta/index.php
no navegador.
Esse é um CRUD básico e pode ser melhorado com validações, segurança (como SQL Injection), e estruturação MVC.
CRUD usando PHP e MySQL, estruturado de forma orientada a objetos (OOP)
A abordagem inclui uma classe para gerenciar as operações do banco de dados e separação lógica.
Passo 1: Configuração da Conexão com o Banco
Crie um arquivo Database.php
para encapsular a conexão com o banco:
<?php
class Database {
private $host = "localhost";
private $user = "root";
private $pass = "";
private $dbname = "crud_example";
public $conn;
public function __construct() {
$this->conn = new mysqli($this->host, $this->user, $this->pass, $this->dbname);
if ($this->conn->connect_error) {
die("Erro na conexão: " . $this->conn->connect_error);
}
}
}
?>
Passo 2: Classe para Operações no Banco
Crie um arquivo User.php
para gerenciar as operações CRUD:
<?php
include 'Database.php';
class User {
private $db;
public function __construct() {
$this->db = (new Database())->conn;
}
// Create
public function create($name, $email) {
$stmt = $this->db->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $name, $email);
return $stmt->execute();
}
// Read
public function getAll() {
$result = $this->db->query("SELECT * FROM users");
return $result->fetch_all(MYSQLI_ASSOC);
}
public function getById($id) {
$stmt = $this->db->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
return $stmt->get_result()->fetch_assoc();
}
// Update
public function update($id, $name, $email) {
$stmt = $this->db->prepare("UPDATE users SET name = ?, email = ? WHERE id = ?");
$stmt->bind_param("ssi", $name, $email, $id);
return $stmt->execute();
}
// Delete
public function delete($id) {
$stmt = $this->db->prepare("DELETE FROM users WHERE id = ?");
$stmt->bind_param("i", $id);
return $stmt->execute();
}
}
?>
Passo 3: Página Principal
Crie um arquivo index.php
para exibir a lista de usuários e gerenciar a navegação:
<?php
include 'User.php';
$user = new User();
$users = $user->getAll();
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>CRUD OOP PHP</title>
</head>
<body>
<h1>Lista de Usuários</h1>
<a href="create.php">Adicionar Novo Usuário</a>
<table border="1">
<tr>
<th>ID</th>
<th>Nome</th>
<th>Email</th>
<th>Ações</th>
</tr>
<?php foreach ($users as $u) { ?>
<tr>
<td><?= $u['id'] ?></td>
<td><?= $u['name'] ?></td>
<td><?= $u['email'] ?></td>
<td>
<a href="edit.php?id=<?= $u['id'] ?>">Editar</a>
<a href="delete.php?id=<?= $u['id'] ?>" onclick="return confirm('Deseja excluir este usuário?')">Excluir</a>
</td>
</tr>
<?php } ?>
</table>
</body>
</html>
Passo 4: Criar Usuário
Crie um arquivo create.php
para adicionar novos usuários:
<?php
include 'User.php';
$user = new User();
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$name = $_POST['name'];
$email = $_POST['email'];
if ($user->create($name, $email)) {
header("Location: index.php");
exit;
} else {
echo "Erro ao criar usuário.";
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Criar Usuário</title>
</head>
<body>
<h1>Adicionar Novo Usuário</h1>
<form method="POST">
<label for="name">Nome:</label>
<input type="text" id="name" name="name" required>
<br>
<label for="email">Email:</label>
<input type="email" id="email" name="email" required>
<br>
<button type="submit">Salvar</button>
</form>
</body>
</html>
Passo 5: Editar Usuário
Crie um arquivo edit.php
para atualizar os dados do usuário:
<?php
include 'User.php';
$user = new User();
$id = $_GET['id'];
$data = $user->getById($id);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
$name = $_POST['name'];
$email = $_POST['email'];
if ($user->update($id, $name, $email)) {
header("Location: index.php");
exit;
} else {
echo "Erro ao atualizar usuário.";
}
}
?>
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Editar Usuário</title>
</head>
<body>
<h1>Editar Usuário</h1>
<form method="POST">
<label for="name">Nome:</label>
<input type="text" id="name" name="name" value="<?= $data['name'] ?>" required>
<br>
<label for="email">Email:</label>
<input type="email" id="email" name="email" value="<?= $data['email'] ?>" required>
<br>
<button type="submit">Salvar</button>
</form>
</body>
</html>
Passo 6: Excluir Usuário
Crie um arquivo delete.php
para deletar um usuário:
<?php
include 'User.php';
$user = new User();
$id = $_GET['id'];
if ($user->delete($id)) {
header("Location: index.php");
exit;
} else {
echo "Erro ao excluir usuário.";
}
?>
Como Rodar o Projeto
- Configure o servidor local (como XAMPP ou LAMP).
- Crie o banco de dados usando o SQL no início.
- Coloque todos os arquivos em uma pasta no diretório público.
- Acesse
http://localhost/sua_pasta/index.php
no navegador.
Esse exemplo é uma base para um CRUD orientado a objetos e pode ser aprimorado com boas práticas, como validação de entrada, tratamento de erros mais robusto e uso de namespaces.
Aqui está um exemplo de como criar duas APIs em PHP: uma API de backend para ser consumida e outra como cliente para consumir a primeira API.
Criando a API para ser consumida (Backend)
Passo 1: Estrutura do Banco de Dados
Crie uma tabela users
no banco de dados:
CREATE DATABASE api_example;
USE api_example;
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
email VARCHAR(100) NOT NULL UNIQUE
);
Passo 2: API Backend
Crie um arquivo chamado api.php
para disponibilizar os endpoints.
<?php
header("Content-Type: application/json");
include 'Database.php';
class UserAPI {
private $db;
public function __construct() {
$this->db = (new Database())->conn;
}
public function handleRequest() {
$method = $_SERVER['REQUEST_METHOD'];
$endpoint = $_GET['endpoint'] ?? '';
switch ($endpoint) {
case 'users':
if ($method === 'GET') {
$this->getUsers();
} elseif ($method === 'POST') {
$this->createUser();
} else {
$this->response(405, "Method Not Allowed");
}
break;
default:
$this->response(404, "Endpoint Not Found");
}
}
private function getUsers() {
$result = $this->db->query("SELECT * FROM users");
$users = $result->fetch_all(MYSQLI_ASSOC);
$this->response(200, $users);
}
private function createUser() {
$input = json_decode(file_get_contents("php://input"), true);
if (empty($input['name']) || empty($input['email'])) {
$this->response(400, "Missing required fields: name or email");
return;
}
$stmt = $this->db->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->bind_param("ss", $input['name'], $input['email']);
if ($stmt->execute()) {
$this->response(201, "User created successfully");
} else {
$this->response(500, "Internal Server Error");
}
}
private function response($status, $data) {
http_response_code($status);
echo json_encode(["status" => $status, "data" => $data]);
}
}
$api = new UserAPI();
$api->handleRequest();
?>
2. Criando a API Cliente para Consumir
API Cliente
Crie um arquivo chamado client.php
para consumir a API do backend.
<?php
class ApiClient {
private $apiUrl;
public function __construct($url) {
$this->apiUrl = rtrim($url, '/');
}
// GET: Buscar usuários
public function getUsers() {
$response = $this->makeRequest('GET', '/users');
return $response;
}
// POST: Criar usuário
public function createUser($name, $email) {
$data = ['name' => $name, 'email' => $email];
$response = $this->makeRequest('POST', '/users', $data);
return $response;
}
// Método genérico para fazer requisições
private function makeRequest($method, $endpoint, $data = null) {
$url = $this->apiUrl . $endpoint;
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
if ($data) {
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Content-Type: application/json',
'Content-Length: ' . strlen(json_encode($data))
]);
}
$response = curl_exec($ch);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
return [
'status' => $httpCode,
'response' => json_decode($response, true)
];
}
}
// Exemplo de uso
$api = new ApiClient("http://localhost/api.php?endpoint");
// Buscar todos os usuários
$response = $api->getUsers();
echo "GET Users: ";
print_r($response);
// Criar novo usuário
$newUser = $api->createUser("John Doe", "john.doe@example.com");
echo "POST Create User: ";
print_r($newUser);
?>
3. Testando a API
Passo 1: Configure o ambiente local
- Configure seu servidor local (XAMPP, LAMP ou similar).
- Coloque os arquivos
api.php
eclient.php
na mesma pasta pública.
Passo 2: Testar
-
API Backend: Acesse
http://localhost/api.php?endpoint=users
para verificar o endpoint da API. -
Cliente: Execute o arquivo
client.php
no terminal ou pelo navegador para testar o consumo.
Esse exemplo é uma base funcional. Para produção, recomenda-se:
- Usar tokens de autenticação (como JWT).
- Adicionar validação e sanitização de dados.
- Melhorar o gerenciamento de erros e respostas HTTP.
Se você está se preparando para uma entrevista técnica para desenvolvedor júnior com PHP e MySQL, aqui estão os principais tópicos que geralmente são abordados, além de algumas dicas:
Fundamentos de PHP
- Sintaxe básica: Conhecimento sobre variáveis, arrays, strings, loops, funções e estruturas de controle.
-
Funções embutidas: Manipulação de strings (e.g.,
explode
,implode
,trim
), arrays (array_merge
,array_filter
) e números (round
,rand
). - Orientação a Objetos (OOP): Classes, objetos, herança, encapsulamento, polimorfismo e interfaces.
-
Trabalho com arquivos:
fopen
,fwrite
,file_get_contents
. -
Manejo de erros e exceções:
try-catch
e como lidar com erros no PHP. -
Superglobais:
$_POST
,$_GET
,$_SESSION
,$_COOKIE
, e como usá-las.
2. MySQL e Integração com PHP
-
Consultas básicas:
SELECT
,INSERT
,UPDATE
,DELETE
, com e sem cláusulas comoWHERE
,ORDER BY
eLIMIT
. -
Joins: Saber usar
INNER JOIN
,LEFT JOIN
,RIGHT JOIN
. - Relacionamentos: Trabalhar com tabelas relacionadas (1:1, 1:N, N:N).
- CRUD com PDO ou MySQLi: Conhecimento em executar queries e proteger contra SQL Injection usando consultas preparadas.
- Índices: O que são e como ajudam na performance.
-
Transações: Conceito e uso em MySQL (
START TRANSACTION
,COMMIT
,ROLLBACK
).
3. Estrutura de Dados e Lógica
- Algoritmos básicos: Ordenação (Bubble Sort, Quick Sort), busca (binária, linear).
- Estruturas de dados: Arrays, pilhas, filas, listas.
- Resolução de problemas: Experiência em resolver pequenos problemas de lógica, como os encontrados em desafios técnicos (e.g., HackerRank, Codewars).
4. Boas Práticas e Padrões
- Clean Code: Uso de nomes de variáveis e funções descritivos, código bem indentado.
- DRY (Don't Repeat Yourself) e KISS (Keep It Simple, Stupid).
- Segurança básica: Prevenção contra SQL Injection, XSS e CSRF.
5. Desenvolvimento Web
- HTML/CSS/JavaScript básico: Conhecimento suficiente para trabalhar com backends que interagem com frontends.
- Forms: Processamento de formulários, validação do lado servidor.
-
APIs RESTful: Como criar e consumir APIs, métodos HTTP (
GET
,POST
,PUT
,DELETE
). -
Sessões e autenticação: Uso de
$_SESSION
e gerenciamento básico de login/logout.
6. Ferramentas e Ambiente
- Versionamento com Git: Commit, branch, merge e como criar pull requests.
- PHP Composer: Entender como usar dependências externas.
- Ambiente local: Experiência com WAMP, XAMPP ou Docker.
-
Debugging: Uso do
var_dump
,print_r
, ou ferramentas como Xdebug.
7. Conceitos Básicos de Engenharia de Software
- Modelos de arquitetura: MVC (Model-View-Controller).
- Banco de dados relacional: Normalização de tabelas, chaves primárias e estrangeiras.
- Controle de versionamento: Trabalhar com repositórios Git e entender fluxo de trabalho em equipe (e.g., Git Flow).
8. Perguntas Comportamentais
Empresas júnior também avaliam soft skills. Prepare-se para perguntas como:
- Por que você escolheu PHP?
- Como você resolve problemas sob pressão?
- Fale sobre um projeto que você já desenvolveu.
- Como você lida com erros?
Dicas para se Destacar
- Projete algo prático antes da entrevista: Exemplo, um CRUD simples, uma API RESTful ou um sistema básico de login. Isso mostra sua proatividade.
- Conheça a empresa: Entenda o que ela faz, suas tecnologias e veja se você consegue alinhar suas respostas com suas necessidades.
- Seja honesto: É normal não saber tudo. Demonstre vontade de aprender e como você resolve lacunas no conhecimento.
Top comments (1)
Your method is correct, but using the form multiple times means you are creating multiple pages for creating, editing, updating, and deleting. This method is good for beginners but not ideal for professional developers.