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 (0)