PHP

Dominando Formulários HTML e Manipulação de Dados com PHP em Projetos Reais

9 min de leitura

Dominando Formulários HTML e Manipulação de Dados com PHP em Projetos Reais

Fundamentos de Formulários HTML Um formulário HTML é a porta de entrada para qualquer comunicação entre o cliente e o servidor. A estrutura básica utiliza a tag com atributos essenciais: (GET ou POST) e (URL de destino). Para projetos reais, sempre use POST ao enviar dados sensíveis, pois é mais seguro que GET, que expõe dados na URL. A validação no lado do cliente com , e padrões semelhantes melhora a experiência, mas nunca confie nela. Toda validação crítica deve ocorrer no servidor PHP. Use atributos semanticamente corretos ( , , ) para garantir acessibilidade e facilitar a manipulação posterior dos dados. Recebimento e Validação de Dados com PHP Quando um formulário é enviado via POST, os dados chegam ao servidor na superglobal . Antes de qualquer processamento, você deve validar e sanitizar essas informações para evitar SQL injection, XSS e outros ataques. Use ou para sanitizar. Para banco de dados, prepared statements são obrigatórios: Upload de Arquivos e Dados

<h2>Fundamentos de Formulários HTML</h2>

<p>Um formulário HTML é a porta de entrada para qualquer comunicação entre o cliente e o servidor. A estrutura básica utiliza a tag <code>&lt;form&gt;</code> com atributos essenciais: <code>method</code> (GET ou POST) e <code>action</code> (URL de destino). Para projetos reais, sempre use POST ao enviar dados sensíveis, pois é mais seguro que GET, que expõe dados na URL.</p>

<pre><code class="language-html">&lt;form method=&quot;POST&quot; action=&quot;processar.php&quot;&gt;

&lt;label for=&quot;email&quot;&gt;Email:&lt;/label&gt;

&lt;input type=&quot;email&quot; id=&quot;email&quot; name=&quot;email&quot; required&gt;

&lt;label for=&quot;mensagem&quot;&gt;Mensagem:&lt;/label&gt;

&lt;textarea name=&quot;mensagem&quot; id=&quot;mensagem&quot; rows=&quot;5&quot;&gt;&lt;/textarea&gt;

&lt;select name=&quot;categoria&quot;&gt;

&lt;option value=&quot;&quot;&gt;Selecione uma categoria&lt;/option&gt;

&lt;option value=&quot;duvida&quot;&gt;Dúvida&lt;/option&gt;

&lt;option value=&quot;reclamacao&quot;&gt;Reclamação&lt;/option&gt;

&lt;/select&gt;

&lt;button type=&quot;submit&quot;&gt;Enviar&lt;/button&gt;

&lt;/form&gt;</code></pre>

<p>A validação no lado do cliente com <code>required</code>, <code>type=&quot;email&quot;</code> e padrões semelhantes melhora a experiência, mas <strong>nunca confie nela</strong>. Toda validação crítica deve ocorrer no servidor PHP. Use atributos semanticamente corretos (<code>type</code>, <code>name</code>, <code>id</code>) para garantir acessibilidade e facilitar a manipulação posterior dos dados.</p>

<h2>Recebimento e Validação de Dados com PHP</h2>

<p>Quando um formulário é enviado via POST, os dados chegam ao servidor na superglobal <code>$_POST</code>. Antes de qualquer processamento, você deve validar e sanitizar essas informações para evitar SQL injection, XSS e outros ataques.</p>

<pre><code class="language-php">&lt;?php

// processar.php

// Verificar se o formulário foi enviado

if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) {

// Validar email

$email = isset($_POST[&#039;email&#039;]) ? trim($_POST[&#039;email&#039;]) : &#039;&#039;;

if (empty($email)) {

$erros[] = &quot;Email é obrigatório&quot;;

} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {

$erros[] = &quot;Email inválido&quot;;

}

// Validar mensagem

$mensagem = isset($_POST[&#039;mensagem&#039;]) ? trim($_POST[&#039;mensagem&#039;]) : &#039;&#039;;

if (empty($mensagem)) {

$erros[] = &quot;Mensagem é obrigatória&quot;;

} elseif (strlen($mensagem) &lt; 10) {

$erros[] = &quot;Mensagem deve ter no mínimo 10 caracteres&quot;;

}

// Se não houver erros, processar dados

if (empty($erros)) {

// Sanitizar para banco de dados

$email_seguro = htmlspecialchars($email, ENT_QUOTES, &#039;UTF-8&#039;);

$mensagem_segura = htmlspecialchars($mensagem, ENT_QUOTES, &#039;UTF-8&#039;);

// Aqui você salvaria no banco ou enviaria email

$sucesso = true;

}

}

?&gt;</code></pre>

<p>Use <code>htmlspecialchars()</code> ou <code>filter_var()</code> para sanitizar. Para banco de dados, prepared statements são obrigatórios:</p>

<pre><code class="language-php">// Exemplo com PDO

$pdo = new PDO(&#039;mysql:host=localhost;dbname=meu_banco&#039;, &#039;user&#039;, &#039;password&#039;);

$stmt = $pdo-&gt;prepare(&quot;INSERT INTO contatos (email, mensagem) VALUES (?, ?)&quot;);

$stmt-&gt;execute([$email, $mensagem]);</code></pre>

<h2>Upload de Arquivos e Dados Complexos</h2>

<p>Formulários frequentemente precisam lidar com uploads de arquivos. A tag <code>&lt;input type=&quot;file&quot;&gt;</code> requer <code>enctype=&quot;multipart/form-data&quot;</code> no formulário. Os arquivos chegam em <code>$_FILES</code>.</p>

<pre><code class="language-html">&lt;form method=&quot;POST&quot; action=&quot;upload.php&quot; enctype=&quot;multipart/form-data&quot;&gt;

&lt;input type=&quot;file&quot; name=&quot;documento&quot; accept=&quot;.pdf,.doc,.docx&quot; required&gt;

&lt;input type=&quot;file&quot; name=&quot;imagem&quot; accept=&quot;image/*&quot;&gt;

&lt;button type=&quot;submit&quot;&gt;Enviar&lt;/button&gt;

&lt;/form&gt;</code></pre>

<p>No servidor, validar tipo, tamanho e renomear o arquivo:</p>

<pre><code class="language-php">&lt;?php

// upload.php

if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039; &amp;&amp; isset($_FILES[&#039;documento&#039;])) {

$arquivo = $_FILES[&#039;documento&#039;];

$tamanho_max = 5 1024 1024; // 5MB

// Validações

if ($arquivo[&#039;error&#039;] !== UPLOAD_ERR_OK) {

die(&quot;Erro no upload: &quot; . $arquivo[&#039;error&#039;]);

}

if ($arquivo[&#039;size&#039;] &gt; $tamanho_max) {

die(&quot;Arquivo muito grande&quot;);

}

// Verificar tipo MIME real (não apenas extensão)

$finfo = finfo_open(FILEINFO_MIME_TYPE);

$mime_type = finfo_file($finfo, $arquivo[&#039;tmp_name&#039;]);

finfo_close($finfo);

$tipos_permitidos = [&#039;application/pdf&#039;, &#039;application/msword&#039;];

if (!in_array($mime_type, $tipos_permitidos)) {

die(&quot;Tipo de arquivo não permitido&quot;);

}

// Renomear e mover

$nome_seguro = uniqid() . &#039;_&#039; . basename($arquivo[&#039;name&#039;]);

$destino = &#039;uploads/&#039; . $nome_seguro;

if (move_uploaded_file($arquivo[&#039;tmp_name&#039;], $destino)) {

echo &quot;Arquivo enviado com sucesso!&quot;;

}

}

?&gt;</code></pre>

<h2>Exibição de Erros e Feedback</h2>

<p>A experiência do usuário melhora significativamente quando erros são exibidos próximo aos campos relevantes. Reutilize o mesmo arquivo PHP para formulário e processamento:</p>

<pre><code class="language-php">&lt;?php

// formulario.php - integrado com processamento

$erros = [];

$dados = [

&#039;email&#039; =&gt; &#039;&#039;,

&#039;nome&#039; =&gt; &#039;&#039;,

&#039;categoria&#039; =&gt; &#039;&#039;

];

if ($_SERVER[&#039;REQUEST_METHOD&#039;] === &#039;POST&#039;) {

// Validações (conforme exemplos anteriores)

// Se válido: processar dados

// Se inválido: manter dados para re-exibição

$dados[&#039;email&#039;] = $_POST[&#039;email&#039;] ?? &#039;&#039;;

$dados[&#039;nome&#039;] = $_POST[&#039;nome&#039;] ?? &#039;&#039;;

}

?&gt;

&lt;!DOCTYPE html&gt;

&lt;html&gt;

&lt;head&gt;

&lt;title&gt;Formulário&lt;/title&gt;

&lt;style&gt;

.erro { color: red; font-size: 0.9em; }

.campo-erro input { border: 1px solid red; }

&lt;/style&gt;

&lt;/head&gt;

&lt;body&gt;

&lt;?php if (!empty($erros)): ?&gt;

&lt;div style=&quot;background: #fee; padding: 10px; margin-bottom: 20px;&quot;&gt;

&lt;?php foreach ($erros as $erro): ?&gt;

&lt;p&gt;&lt;?php echo $erro; ?&gt;&lt;/p&gt;

&lt;?php endforeach; ?&gt;

&lt;/div&gt;

&lt;?php endif; ?&gt;

&lt;form method=&quot;POST&quot;&gt;

&lt;div class=&quot;&lt;?php echo isset($erros[0]) ? &#039;campo-erro&#039; : &#039;&#039;; ?&gt;&quot;&gt;

&lt;label&gt;Email:&lt;/label&gt;

&lt;input type=&quot;email&quot; name=&quot;email&quot; value=&quot;&lt;?php echo htmlspecialchars($dados[&#039;email&#039;]); ?&gt;&quot;&gt;

&lt;/div&gt;

&lt;button type=&quot;submit&quot;&gt;Enviar&lt;/button&gt;

&lt;/form&gt;

&lt;/body&gt;

&lt;/html&gt;</code></pre>

<h2>Conclusão</h2>

<p>Dominando formulários HTML e PHP, você aprendeu: (1) <strong>Estrutura e segurança</strong>: sempre valide e sanitize no servidor, nunca confie no cliente; (2) <strong>Tratamento robusto</strong>: use prepared statements, verify file types via MIME, e implemente feedback claro de erros; (3) <strong>Boas práticas</strong>: reutilize arquivos quando possível, exiba erros contextualizados e proteja contra injeção de código com <code>htmlspecialchars()</code> e filtros.</p>

<p>Esses conceitos formam a base para qualquer aplicação web moderna. Pratique implementando validações complexas e testando casos extremos.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://www.php.net/manual/pt_BR/tutorial.forms.php" target="_blank" rel="noopener noreferrer">Documentação oficial PHP - Formulários</a></li>

<li><a href="https://owasp.org/www-project-top-ten/" target="_blank" rel="noopener noreferrer">OWASP - Top 10 Web Application Security Risks</a></li>

<li><a href="https://developer.mozilla.org/pt-BR/docs/Learn/Forms" target="_blank" rel="noopener noreferrer">MDN Web Docs - Formulários HTML</a></li>

<li><a href="https://phptherightway.com/#security" target="_blank" rel="noopener noreferrer">PHP: The Right Way - Security</a></li>

<li><a href="https://www.php.net/manual/pt_BR/pdo.prepared-statements.php" target="_blank" rel="noopener noreferrer">Documentação PDO - Prepared Statements</a></li>

</ul>

Comentários

Mais em PHP

Guia Completo de PHPUnit na Prática: Testes Unitários em PHP
Guia Completo de PHPUnit na Prática: Testes Unitários em PHP

O que é PHPUnit e Por Que Usar PHPUnit é o framework de testes unitários mais...

Como Usar Manipulação de Arquivos e Diretórios em PHP em Produção
Como Usar Manipulação de Arquivos e Diretórios em PHP em Produção

Entendendo o Sistema de Arquivos em PHP A manipulação de arquivos e diretório...

Dominando Cache em PHP: Redis, Memcached e Cache de Opcode com OPcache em Projetos Reais
Dominando Cache em PHP: Redis, Memcached e Cache de Opcode com OPcache em Projetos Reais

Cache em PHP: Redis, Memcached e OPcache O cache é um dos pilares da otimizaç...