DEV Community

Cover image for CRUD PHP e MySQL e API e Fundamentos importantes
Brayan Monteiro
Brayan Monteiro

Posted on

CRUD PHP e MySQL e API e Fundamentos importantes

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
);
Enter fullscreen mode Exit fullscreen mode

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);
}
?>
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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;
}
?>
Enter fullscreen mode Exit fullscreen mode

Como Rodar o Projeto

  1. Configure o servidor local (como XAMPP ou LAMP).
  2. Coloque todos os arquivos em uma pasta dentro do diretório público (htdocs ou equivalente).
  3. 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);
        }
    }
}
?>
Enter fullscreen mode Exit fullscreen mode

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();
    }
}
?>
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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>
Enter fullscreen mode Exit fullscreen mode

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.";
}
?>
Enter fullscreen mode Exit fullscreen mode

Como Rodar o Projeto

  1. Configure o servidor local (como XAMPP ou LAMP).
  2. Crie o banco de dados usando o SQL no início.
  3. Coloque todos os arquivos em uma pasta no diretório público.
  4. 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
);
Enter fullscreen mode Exit fullscreen mode

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();
?>
Enter fullscreen mode Exit fullscreen mode

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);
?>
Enter fullscreen mode Exit fullscreen mode

3. Testando a API

Passo 1: Configure o ambiente local

  1. Configure seu servidor local (XAMPP, LAMP ou similar).
  2. Coloque os arquivos api.php e client.php na mesma pasta pública.

Passo 2: Testar

  1. API Backend: Acesse http://localhost/api.php?endpoint=users para verificar o endpoint da API.
  2. 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 como WHERE, ORDER BY e LIMIT.
  • 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

  1. 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.
  2. Conheça a empresa: Entenda o que ela faz, suas tecnologias e veja se você consegue alinhar suas respostas com suas necessidades.
  3. Seja honesto: É normal não saber tudo. Demonstre vontade de aprender e como você resolve lacunas no conhecimento.

Top comments (1)

Collapse
 
ratanlal1996 profile image
ratanlal1996

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.