Os for­mu­lá­rios HTML permitem que usuários insiram dados di­re­ta­mente em um site, que depois podem ser ar­ma­ze­na­dos em um banco de dados. Assim, eles formam a interface entre o site e a base de dados, para que entradas como nomes, endereços de e-mail ou co­men­tá­rios sejam re­gis­tra­das e ge­ren­ci­a­das de forma sis­te­má­tica. Neste guia, mostramos como usar PHP para salvar in­for­ma­ções de um for­mu­lá­rio HTML em um banco MySQL/MariaDB.

Re­qui­si­tos

Para salvar dados de um for­mu­lá­rio HTML de forma confiável em um banco MySQL ou MariaDB, você precisa de um ambiente que atenda aos seguintes re­qui­si­tos:

  • Servidor web com suporte a PHP: um servidor web Apache ou NGINX com PHP instalado e ativado, para que scripts do lado do servidor possam processar as in­for­ma­ções do for­mu­lá­rio
  • Co­nhe­ci­men­tos básicos de PHP e SQL: noções es­sen­ci­ais de PHP e SQL para es­ta­be­le­cer a conexão entre o for­mu­lá­rio e o banco de dados e inserir os dados cor­re­ta­mente
  • Acesso à con­fi­gu­ra­ção do servidor web: pos­si­bi­li­dade de acessar o servidor web para que você possa executar scripts PHP, criar tabelas no banco de dados e, se ne­ces­sá­rio, con­fi­gu­rar per­mis­sões
Nota

Apache, MySQL/MariaDB e PHP fazem parte de uma ins­ta­la­ção padrão e funcionam nela. Se o seu servidor foi criado com uma ins­ta­la­ção mínima, você precisará instalar e con­fi­gu­rar Apache, MySQL/MariaDB e PHP antes de poder continuar.

Como inserir in­for­ma­ções de um for­mu­lá­rio HTML no MySQL/MariaDB

Para este tutorial, vamos criar um site fictício para um res­tau­rante. O objetivo é oferecer às aos clientes a pos­si­bi­li­dade de enviar ava­li­a­ções di­re­ta­mente pelo site. Para isso, mostramos como o for­mu­lá­rio é pro­ces­sado com um script em PHP e como os dados inseridos são ar­ma­ze­na­dos em um banco de dados MySQL ou MariaDB, usando for­mu­lá­rios HTML.

Etapa 1: criar o banco de dados

Em um primeiro passo, criaremos um banco de dados para que você possa armazenar todas as in­for­ma­ções do for­mu­lá­rio nele. Para isso, primeiro faça login no cliente MySQL/MariaDB pela linha de comando:

mysql -u root -p
bash

Agora, crie um banco de dados para as ava­li­a­ções usando o comando SQL CREATE DATABASE:

CREATE DATABASE reviews;
bash

Em seguida, mude para esse banco de dados:

USE reviews;
bash

No nosso exemplo, para sim­pli­fi­car, criaremos apenas uma tabela. Essa tabela terá os três campos a seguir:

  • Um campo de ID: esse campo será definido como AUTO_INCREMENT. Esse parâmetro faz com que o campo aumente au­to­ma­ti­ca­mente em 1 a cada novo registro, ga­ran­tindo que cada entrada receba um valor único.
  • Nome da pessoa que fez a avaliação: aqui será usado um campo de texto com com­pri­mento de até 100 ca­rac­te­res.
  • Uma avaliação por estrelas: uma avaliação numérica de 1 a 5, tipo de dado TINYINT.
  • Verifique os detalhes: um campo de texto armazena detalhes ou co­men­tá­rios sobre as ava­li­a­ções e é di­men­si­o­nado com VARCHAR(4000) para comportar cerca de 500 palavras. Crie agora a tabela com CREATE TABLE:
CREATE TABLE user_review (
id MEDIUMINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
reviewer_name VARCHAR(100),
star_rating TINYINT,
details VARCHAR(4000)
);
bash
IONOS CLOUD Compute Engine
Cloud Compute Engine da IONOS

Empresas de médio e grande porte optam pela nuvem da Alemanha. Serviços IaaS e PaaS são para campeões.

  • Seguro
  • Confiável
  • Flexível

Etapa 2: criar usuário

Por motivos de segurança, é re­co­men­dá­vel criar um usuário exclusivo para cada banco de dados, es­pe­ci­al­mente quando esse banco de dados é acessado a partir de um site.

O seguinte comando do MariaDB cria um usuário chamado review_site com a senha JxSLRkdutW e concede a ele acesso ao banco de dados com as ava­li­a­ções:

GRANT ALL ON reviews.* TO review_site@localhost IDENTIFIED BY 'JxSLRkdutW';
bash

Se você usa MySQL, o comando GRANT ... IDENTIFIED BY ... não é mais re­co­men­dado nas versões atuais. Em vez disso, primeiro deve-se criar o usuário com CREATE USER e depois usar GRANT:

CREATE USER 'review_site'@'localhost' IDENTIFIED BY 'JxSLRkdutW';
GRANT ALL PRIVILEGES ON reviews.* TO 'review_site'@'localhost';
FLUSH PRIVILEGES;
bash

Etapa 3: criar for­mu­lá­rio HTML para o site

Na próxima etapa, vamos criar o for­mu­lá­rio HTML para as ava­li­a­ções dos clientes. Para isso, crie um arquivo chamado reviews.html no seu espaço na web e abra-o para edição. Para, por exemplo, criar o arquivo em /var/www/html com o editor de texto nano, o comando é:

sudo nano /var/www/html/reviews.html
bash

Agora, insira o seguinte conteúdo neste arquivo:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<title>Avaliação do restaurante</title>
</head>
<body>
<p>O que você achou da sua experiência conosco?</p>
<form action="addreview.php" method="POST">
Seu nome: <input type="text" name="reviewer_name"><br><br>
Quantas estrelas você nos daria?
<select name="star_rating">
<option value="1">1 estrela</option>
<option value="2">2 estrelas</option>
<option value="3">3 estrelas</option>
<option value="4">4 estrelas</option>
<option value="5">5 estrelas</option>
</select><br><br>
Sua avaliação: <br>
<textarea name="details" rows="10" cols="30"></textarea><br><br>
<input type="submit" value="Enviar" name="submit">
</form>
</body>
</html>
html

A seguir, alguns pontos que você deve observar sobre este for­mu­lá­rio básico:

  • Este for­mu­lá­rio usa o método POST para enviar dados ao script PHP addreview.php.
  • O nome de cada campo de entrada é usado na próxima etapa como nome de variável PHP. Em geral, faz sentido usar para esses valores o nome do campo da tabela do banco de dados.
  • Nunca confie em entradas de usuários. Neste exemplo, pre­ci­sa­mos de um número de 1 a 5 para a avaliação por estrelas. Se pe­dís­se­mos que as pessoas di­gi­tas­sem ma­nu­al­mente, poderiam inserir um valor inválido. Por isso, o ideal é solicitar que escolham valores pre­de­fi­ni­dos em um menu suspenso.

Etapa 4: criar o script PHP

Na última etapa, criamos o script PHP que insere os dados do for­mu­lá­rio no banco de dados. Para isso, es­ta­be­le­ce­mos uma conexão com MySQL ou MariaDB, cap­tu­ra­mos as entradas do for­mu­lá­rio e as salvamos na tabela criada an­te­ri­or­mente. Primeiro, crie um arquivo addreview.php no seu espaço de hos­pe­da­gem e abra-o para edição. É nele que o código PHP será inserido. Para criar o arquivo em /var/www/html usando o nano, o comando é:

sudo nano /var/www/html/addreview.php
bash

Todo script PHP deve começar com a tag de abertura do PHP:

<?php
php

Em seguida, adicione um bloco de conexão com MySQL/MariaDB com o endereço do servidor (localhost), o nome do banco de dados, além do nome de usuário e da senha do banco de dados.

$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db = "reviews";
php

O trecho de código a seguir permite es­ta­be­le­cer uma conexão com o banco de dados usando a função mysqli_connect. Além disso, o script exibe um erro caso essa conexão falhe:

$dbconnect = mysqli_connect($hostname, $username, $password, $db);
if (mysqli_connect_errno()) {
die("Database connection failed: " . mysqli_connect_error());
}
php

Na próxima etapa, vamos obter os dados inseridos pelo usuário no for­mu­lá­rio HTML e salvá-los em variáveis PHP, para que possamos usá-los em seguida no pro­ces­sa­mento e na inserção no banco de dados:

if (isset($_POST['submit'])) {
$reviewer_name = $_POST['reviewer_name'];
$star_rating = $_POST['star_rating'];
$details = $_POST['details'];
php

Em seguida, os dados inseridos pelo usuário precisam ser gravados no banco de dados. Para isso, criamos uma consulta SQL INSERT, que pega os valores das variáveis PHP e os insere nos campos cor­res­pon­den­tes da tabela user_review. Para evitar SQL-In­jec­ti­ons, usamos aqui Prepared Sta­te­ments:

$stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
$stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
$stmt->execute();
php

Adicione uma instrução if-else em PHP que exiba uma mensagem de erro caso o processo falhe. Se o processo for bem-sucedido, agradeça ao usuário pela avaliação:

if ($stmt->execute()) {
echo "Obrigado pela sua avaliação.";
} else {
die("Ocorreu um erro.");
}
$stmt->close();
}
php

Por fim, feche a instrução if de abertura e adicione uma tag de fe­cha­mento do PHP:

}
?>
php
Nota

Se você receber a mensagem de erro “Falha na conexão com o banco de dados: acesso negado para o usuário ‘review_site’@’localhost’ (com senha: SIM)”, você pode testar as cre­den­ci­ais fazendo login no MySQL/MariaDB pela linha de comando com o seguinte comando:

Etapa 5: testar o script

Para testar o script, acesse reviews.html em um navegador e, em seguida, envie uma avaliação de exemplo. Depois, faça login no banco de dados de reviews pelo cliente MySQL/MariaDB na linha de comando:

mysql -u root -p reviews
bash

Use SELECT * FROM user_review para exibir todo o conteúdo da tabela:

MariaDB [reviews]> SELECT * FROM user_review;
+----+---------------+-------------+---------------------------------------------------------+
| id | reviewer_name | star_rating | details                                                 |
+----+---------------+-------------+---------------------------------------------------------+
|  1 | Ben           |           5 | Calzone deliciosa!                                      |
|  2 | Leslie        |           1 | A calzone não é boa.                                    |
+----+---------------+-------------+---------------------------------------------------------+
2 rows in set (0.00 sec)
bash

O script PHP completo é:

<?php
// Dados de conexão com o banco de dados
$hostname = "localhost";
$username = "review_site";
$password = "JxSLRkdutW";
$db       = "reviews";
// Estabelecer conexão com o banco de dados
$dbconnect = new mysqli($hostname, $username, $password, $db);
// Verificar conexão
if ($dbconnect->connect_error) {
    die("Falha na conexão com o banco de dados: " . $dbconnect->connect_error);
}
// Executar somente quando o formulário for enviado
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['submit'])) {
    // Validar entradas (verificação mínima)
    $reviewer_name = trim($_POST['reviewer_name'] ?? '');
    $star_rating   = intval($_POST['star_rating'] ?? 0);
    $details       = trim($_POST['details'] ?? '');
    // Validação simples
    if ($reviewer_name === '' || $star_rating < 1 || $star_rating > 5 || $details === '') {
        die("Por favor, preencha todos os campos corretamente.");
    }
    // Criar Prepared Statement
    $stmt = $dbconnect->prepare("INSERT INTO user_review (reviewer_name, star_rating, details) VALUES (?, ?, ?)");
    
    if ($stmt === false) {
        die("Erro no banco de dados: " . $dbconnect->error);
    }
    $stmt->bind_param("sis", $reviewer_name, $star_rating, $details);
    // Executar statement
    if ($stmt->execute()) {
        echo "Obrigado pela sua avaliação.";
    } else {
        die("Ocorreu um erro: " . $stmt->error);
    }
    $stmt->close();
}
// Fechar conexão
$dbconnect->close();
?>
php
Ir para o menu principal