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