SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
14.02.2025

Manipulação de Formulários em PHP

Introdução à Manipulação de Formulários em PHP

A manipulação de formulários em PHP é uma das tarefas principais enfrentadas por desenvolvedores web. Um formulário permite que os usuários insiram dados que podem ser processados pelo servidor. Neste artigo, exploraremos os aspectos essenciais de trabalhar com formulários em PHP, desde a criação de formulários HTML até a validação e segurança dos dados. Também analisaremos exemplos mais complexos e discutiremos as melhores práticas para garantir a segurança e a confiabilidade dos seus formulários.

Criando um Formulário HTML

Para começar, precisamos criar um formulário HTML que enviará dados para o servidor. Aqui está um exemplo de um formulário simples para entrada de nome e e-mail:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Formulário de Exemplo</title>
</head>
<body>
    <form action="processar_formulario.php" method="post">
        <label for="nome">Nome:</label>
        <input type="text" id="nome" name="nome" required>
        <br>
        <label for="email">E-mail:</label>
        <input type="email" id="email" name="email" required>
        <br>
        <input type="submit" value="Enviar">
    </form>
</body>
</html>

Neste exemplo, o formulário envia dados para o script do lado do servidor processar_formulario.php usando o método POST. Os campos do formulário possuem o atributo required, que torna a sua conclusão obrigatória. Um formulário HTML é a base da interação do usuário com o servidor, e é crucial garantir que ele esteja corretamente configurado para transmitir dados.

Atributos Adicionais e Estilo para o Formulário

Para melhorar a experiência do usuário, você pode adicionar atributos e estilo adicionais. Por exemplo, usar o atributo placeholder para fornecer dicas dentro dos campos de entrada e CSS para estilizar o formulário:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Formulário de Exemplo</title>
    <style>
        form {
            max-width: 400px;
            margin: auto;
            padding: 1em;
            border: 1px solid #ccc;
            border-radius: 1em;
        }
        label {
            margin-top: 1em;
            display: block;
        }
        input {
            width: 100%;
            padding: 0.5em;
            margin-top: 0.5em;
        }
        input[type="submit"] {
            background-color: #4CAF50;
            color: white;
            border: none;
            padding: 1em;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <form action="processar_formulario.php" method="post">
        <label for="nome">Nome:</label>
        <input type="text" id="nome" name="nome" placeholder="Digite seu nome" required>
        <br>
        <label for="email">E-mail:</label>
        <input type="email" id="email" name="email" placeholder="Digite seu e-mail" required>
        <br>
        <input type="submit" value="Enviar">
    </form>
</body>
</html>

Processando Dados de Formulário em PHP

Quando um usuário envia o formulário, os dados são enviados ao servidor e podem ser processados usando PHP. Aqui está um script simples para processar os dados do formulário:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nome = htmlspecialchars($_POST['nome']);
    $email = htmlspecialchars($_POST['email']);

    echo "Nome: " . $nome . "<br>";
    echo "E-mail: " . $email;
}
?>

Esse script verifica se a solicitação foi enviada pelo método POST e extrai os dados do array $_POST. A função htmlspecialchars é utilizada para prevenir ataques XSS ao converter caracteres especiais em entidades HTML. Este é um exemplo básico que pode ser expandido para processar dados mais complexos.

Processamento Avançado de Dados

Para formulários mais complexos, você pode usar funções adicionais do PHP para manipular os dados. Por exemplo, você pode usar funções para trabalhar com datas, números e outros tipos de dados:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nome = htmlspecialchars($_POST['nome']);
    $email = htmlspecialchars($_POST['email']);
    $idade = intval($_POST['idade']);
    $data_nascimento = date('Y-m-d', strtotime($_POST['data_nascimento']));

    echo "Nome: " . $nome . "<br>";
    echo "E-mail: " . $email . "<br>";
    echo "Idade: " . $idade . "<br>";
    echo "Data de Nascimento: " . $data_nascimento;
}
?>

Validação de Dados e Segurança

A validação de dados é uma etapa crucial na manipulação de formulários. Ela garante que os dados estejam no formato esperado e não contenham código malicioso. Aqui está um exemplo de validação de dados:

<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nome = trim($_POST['nome']);
    $email = trim($_POST['email']);

    if (empty($nome)) {
        echo "O nome é obrigatório.<br>";
    } elseif (!preg_match("/^[a-zA-Z-' ]*$/", $nome)) {
        echo "O nome pode conter apenas letras e espaços.<br>";
    }

    if (empty($email)) {
        echo "O e-mail é obrigatório.<br>";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo "Formato de e-mail inválido.<br>";
    }

    if (!empty($nome) && filter_var($email, FILTER_VALIDATE_EMAIL)) {
        echo "Nome: " . htmlspecialchars($nome) . "<br>";
        echo "E-mail: " . htmlspecialchars($email);
    }
}
?>

Neste exemplo, verificamos se os campos não estão vazios, se o nome contém apenas caracteres permitidos e se o e-mail está no formato correto. Se os dados forem válidos, eles são exibidos na tela. A validação de dados ajuda a prevenir erros e aumenta a segurança da sua aplicação.

Medidas de Segurança Adicionais

Para proteger os dados, você pode implementar medidas adicionais, como proteção contra injeção de SQL e ataques XSS. Por exemplo, ao trabalhar com um banco de dados, você pode usar declarações preparadas:

<?php
$servername = "localhost";
$username = "usuario";
$password = "senha";
$dbname = "banco_de_dados";

$conn = new mysqli($servername, $username, $password, $dbname);

if ($conn->connect_error) {
    die("Falha na conexão: " . $conn->connect_error);
}

if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nome = trim($_POST['nome']);
    $email = trim($_POST['email']);

    $stmt = $conn->prepare("INSERT INTO usuarios (nome, email) VALUES (?, ?)");
    $stmt->bind_param("ss", $nome, $email);

    if ($stmt->execute()) {
        echo "Novo usuário adicionado com sucesso.";
    } else {
        echo "Erro: " . $stmt->error;
    }

    $stmt->close();
    $conn->close();
}
?>

Exemplos e Dicas Práticas

Exemplo 1: Manipulando um Formulário com Vários Campos

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Formulário Estendido</title>
</head>
<body>
    <form action="processar_formulario.php" method="post">
        <label for="nome">Nome:</label>
        <input type="text" id="nome" name="nome" required>
        <br>
        <label for="email">E-mail:</label>
        <input type="email" id="email" name="email" required>
        <br>
        <label for="idade">Idade:</label>
        <input type="number" id="idade" name="idade" required>
        <br>
        <input type="submit" value="Enviar">
    </form>
</body>
</html>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $nome = trim($_POST['nome']);
    $email = trim($_POST['email']);
    $idade = intval($_POST['idade']);

    $erros = [];

    if (empty($nome)) {
        $erros[] = "O nome é obrigatório.";
    } elseif (!preg_match("/^[a-zA-Z-' ]*$/", $nome)) {
        $erros[] = "O nome pode conter apenas letras e espaços.";
    }

    if (empty($email)) {
        $erros[] = "O e-mail é obrigatório.";
    } elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $erros[] = "Formato de e-mail inválido.";
    }

    if ($idade <= 0) {
        $erros[] = "A idade deve ser um número positivo.";
    }

    if (empty($erros)) {
        echo "Nome: " . htmlspecialchars($nome) . "<br>";
        echo "E-mail: " . htmlspecialchars($email) . "<br>";
        echo "Idade: " . htmlspecialchars($idade);
    } else {
        foreach ($erros as $erro) {
            echo $erro . "<br>";
        }
    }
}
?>

Exemplo 2: Proteção Contra Ataques CSRF

Para prevenir ataques CSRF, você pode usar tokens. Aqui está um exemplo de implementação:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Formulário com Proteção CSRF</title>
</head>
<body>
    <?php
    session_start();
    $token = bin2hex(random_bytes(32));
    $_SESSION['token'] = $token;
    ?>
    <form action="processar_formulario.php" method="post">
        <input type="hidden" name="token" value="<?php echo $token; ?>">
        <label for="nome">Nome:</label>
        <input type="text" id="nome" name="nome" required>
        <br>
        <input type="submit" value="Enviar">
    </form>
</body>
</html>
<?php
session_start();
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    if (!isset($_POST['token']) || $_POST['token'] !== $_SESSION['token']) {
        die("Token CSRF inválido.");
    }

    $nome = htmlspecialchars($_POST['nome']);
    echo "Nome: " . $nome;
}
?>

Neste exemplo, criamos um token CSRF ao carregar o formulário e verificamos isso ao processar os dados. Isso ajuda a prevenir ataques onde um invasor pode forjar pedidos em nome de um usuário.

Exemplo 3: Manipulação de Upload de Arquivos

Às vezes, os formulários podem incluir upload de arquivos. Aqui está um exemplo de como lidar com um formulário de upload de arquivos:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Formulário de Upload de Arquivo</title>
</head>
<body>
    <form action="upload.php" method="post" enctype="multipart/form-data">
        <label for="arquivo">Selecione o arquivo:</label>
        <input type="file" id="arquivo" name="arquivo" required>
        <br>
        <input type="submit" value="Upload">
    </form>
</body>
</html>
<?php
if ($_SERVER["REQUEST_METHOD"] == "POST") {
    $diretorio_destino = "uploads/";
    $arquivo_destino = $diretorio_destino . basename($_FILES["arquivo"]["name"]);
    $uploadOk = 1;
    $tipoArquivo = strtolower(pathinfo($arquivo_destino, PATHINFO_EXTENSION));

    // Verifica se o arquivo já existe
    if (file_exists($arquivo_destino)) {
        echo "O arquivo já existe.";
        $uploadOk = 0;
    }

    // Limita os tipos de arquivo
    if($tipoArquivo != "jpg" && $tipoArquivo != "png" && $tipoArquivo != "jpeg" && $tipoArquivo != "gif" ) {
        echo "Apenas arquivos JPG, JPEG, PNG e GIF são permitidos.";
        $uploadOk = 0;
    }

    // Verifica por erros
    if ($uploadOk == 0) {
        echo "O arquivo não foi enviado.";
    } else {
        if (move_uploaded_file($_FILES["arquivo"]["tmp_name"], $arquivo_destino)) {
            echo "O arquivo " . htmlspecialchars(basename($_FILES["arquivo"]["name"])) . " foi enviado.";
        } else {
            echo "Houve um erro ao enviar seu arquivo.";
        }
    }
}
?>

Neste exemplo, criamos um formulário para upload de arquivo e o processamos no servidor. Garantimos que o arquivo não exista e limitamos os tipos de arquivos que podem ser enviados.

Conclusão

Manipular formulários em PHP envolve criar formulários HTML, processar e validar dados, além de garantir a segurança. Ao seguir os exemplos e recomendações fornecidas, você pode criar formulários confiáveis e seguros para sua aplicação web. É essencial lembrar da segurança e da validação de dados em cada etapa para prevenir possíveis ataques e erros. Esperamos que este artigo tenha ajudado você a entender melhor o processo de manipulação de formulários em PHP e fornecido dicas úteis para aprimorar suas habilidades em desenvolvimento web.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!