Formulário PHP

Resumo : neste tutorial, você aprenderá como funcionam os formulários HTML e como processar dados de formulários em PHP.

Introdução ao processamento de formulários PHP

Para criar um formulário, você usa o <form>elemento da seguinte forma:

<form action="form.php" method="post">
</form>Linguagem de código:  HTML, XML  ( xml )

O <form>elemento tem dois atributos importantes:

  • action: especifica a URL que processa o envio do formulário. Neste exemplo, o form.phpirá processar o formulário.
  • method: especifica o método HTTP para enviar o formulário. Os métodos de formulário mais comumente usados ​​são POSTe GET. Neste exemplo, o método de formulário é post.

O método de formulário não diferencia maiúsculas de minúsculas. Isso significa que você pode usar postou POST. Se você não especificar o atributo method, o elemento form usará o getmétodo por padrão.

Normalmente, um formulário possui um ou mais elementos de entrada, incluindo texto, senha, caixa de seleção , botão de opção , seleção , upload de arquivo , etc. Os elementos de entrada costumam ser chamados de campos de formulário.

Um elemento de entrada possui os seguintes atributos importantes name,, typee value. O nameatributo será utilizado para acessar o valueem PHP.

Método HTTP POST

Se um formulário usar o POSTmétodo, o navegador incluirá os dados do formulário no corpo da solicitação HTTP. Após enviar o formulário, você pode acessar os dados do formulário através do array associativo $_POST em PHP.

Por exemplo, se um formulário tiver um elemento de entrada com o nome email, você poderá acessar o valor email em PHP por meio do arquivo $_POST['email']. Se o formulário não tiver entrada de email, $_POSTnão terá nenhum elemento com a chave 'email'.

Para verificar se os dados do formulário contêm o e-mail, use o isset()seguinte:

<?php

if(isset($_POST['email']) {
    // process email
}Linguagem de código:  HTML, XML  ( xml )

O seguinte mostra um formulário com um elemento de entrada:

<form action="form.php" method="post">
    <div>
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" />
    </div>
    <button type="submit">Submit</button>
</form>Linguagem de código:  HTML, XML  ( xml )

No form.phparquivo, você pode acessar o valor do email da seguinte forma:

<?php

if (isset($_POST['email'])) {
	var_dump($_POST['email']);
}Linguagem de código:  HTML, XML  ( xml )

Método HTTP GET

Ao enviar um formulário usando o GETmétodo, você pode acessar os dados do formulário em PHP por meio do array associativo $_GET.

Ao contrário do POSTmétodo, o GETmétodo anexa os dados do formulário na URL que processa o formulário. Suponha que a URL que processa o formulário seja http://localhost/form.php. Ao inserir o e-mail como [email protected]e enviar um formulário, você verá que o valor do e-mail é anexado ao URL assim:

http://localhost/form.php?email=hello%40tutorials.acervolima.comLinguagem de código:  texto simples  ( texto simples )

Observe que @ está codificado como% 40 no URL.

Em PHP, você pode usar o isset()para verificar se os dados do formulário contêm o email:

<?php

if(isset($_GET['email']) {
    // process email
}Linguagem de código:  HTML, XML  ( xml )

Se o formulário tiver vários elementos de entrada, o navegador anexará as entradas do formulário ao URL no seguinte formato:

http://localhost/form.php?name1=value1&name2=value2&name3=value3Linguagem de código:  texto simples  ( texto simples )

O seguinte mostra o mesmo formulário que possui uma entrada de e-mail. No entanto, o formulário usa o método GET:

<form action="form.php" method="get">
    <div>
        <label for="email">Email:</label>
        <input type="email" id="email" name="email" />
    </div>
    <button type="submit">Submit</button>
</form>Linguagem de código:  HTML, XML  ( xml )

E o seguinte mostra o form.phparquivo:

<?php

if (isset($_GET['email'])) {
	var_dump($_GET['email']);
}Linguagem de código:  HTML, XML  ( xml )

Observe que ambos os arrays $_POSTe $_GETsão variáveis ​​superglobais. Isso significa que você pode acessá-los em qualquer lugar do script.

HTTP GET ou POST

Em geral, você deve usar o GETmétodo quando o formulário recupera apenas dados do servidor. Por exemplo, um formulário de pesquisa que permite aos usuários pesquisar informações deve usar o GETmétodo.

Quando você tem um formulário que causa uma alteração no servidor, você deve usar o POSTmétodo. Por exemplo, um formulário que permite aos usuários assinar um boletim informativo deve usar o POSTmétodo.

Exemplo de formulário PHP

O seguinte index.phpcontém um formulário que permite aos usuários assinar um boletim informativo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <link rel="stylesheet" href="css/style.css">
    <title>PHP Form Demo</title>
</head>
<body>
    <main>
        <form action="subscribe.php" method="post">
            <div>
                <label for="name">Name:</label>
                <input type="text" name="name" required="required" placeholder="Enter your name" />
            </div>

            <div>
                <label for="name">Email:</label>
                <input type="email" name="email" required="required" placeholder="Enter your email" />
            </div>

            <button type="submit">Subscribe</button>
        </form>
    </main>
</body>
</html>Linguagem de código:  HTML, XML  ( xml )

O formulário usa o POSTmétodo e envia os dados para a subscribe.phppágina. Possui dois elementos de entrada com type texte email.

Antes de enviar o formulário ao servidor, o navegador verifica se todos os campos obrigatórios estão preenchidos, no formato correto. Isso é conhecido como validação de formulário do lado do cliente.

Para validar dados no lado do cliente, você pode usar a validação de formulário HTML5 ou a validação JavaScript. No entanto, você nunca deve confiar na validação do lado do cliente como medida de segurança.

O objetivo da validação do lado do cliente é ajudar os usuários legítimos a inserir dados no formato correto. No entanto, isso não impede que usuários mal-intencionados insiram dados incorretos que possam prejudicar o aplicativo. Portanto, é obrigatório implementar a validação do lado do servidor.

A seguir mostra o código do subscribe.phparquivo:

<?php

//---------------------------------------------
// WARNING: this doesn't include sanitization
// and validation
//---------------------------------------------
if (isset($_POST['name'], $_POST['email'])) {
	$name = $_POST['name'];
	$email = $_POST['email'];

	// show the $name and $email
	echo "Thanks $name for your subscription.<br>";
	echo "Please confirm it in your inbox of the email $email.";
} else {
	echo 'You need to provide your name and email address.';
}
Linguagem de código:  PHP  ( php )

Como funciona.

  • Primeiro, verifique se o nome e o email estão no $_POSTarray usando a isset()função.
  • Em segundo lugar, mostre uma mensagem de agradecimento.

Se você inserir o nome como Johne o e-mail como [email protected], verá a seguinte mensagem na subscribe.phppágina:

Thanks John for your subscription. 
Please confirm it in your inbox of the email [email protected]Linguagem de código:  texto simples  ( texto simples )

Escapando da saída

A subscribe.phppágina exibe diretamente os dados do formulário. Se hackers mal-intencionados inserirem intencionalmente dados incorretos, a página não funcionará corretamente.

Por exemplo, se o seguinte código JavaScript for inserido no namecampo e o formulário for enviado.

<script>alert('Hello');</script>Linguagem de código:  HTML, XML  ( xml )

…você verá que a página exibe um alerta .

Imagine que o script não mostre apenas um alerta, mas carregue o código malicioso de outro servidor para o navegador do usuário, o risco é maior. Esse tipo de ataque é chamado de ataque de cross-site scripting (XSS) .

Portanto, antes de exibir a entrada do usuário em uma página da web, você deve sempre escapar dos dados. Para fazer isso, você usa a htmlspecialchars()função:

<?php

//---------------------------------------------
// WARNING: this doesn't include sanitization
// and validation
//---------------------------------------------
if (isset($_POST['name'], $_POST['email'])) {
	$name = htmlspecialchars($_POST['name']);
	$email = htmlspecialchars($_POST['email']);

	// show the $name and $email
	echo "Thanks $name for your subscription.<br>";
	echo "Please confirm it in your inbox of the email $email.";
} else {
	echo 'You need to provide your name and email address.';
}
Linguagem de código:  PHP  ( php )

Observe que também mostraremos como higienizar e validar os dados do formulário no próximo tutorial .

Formulário de autoprocessamento PHP

Às vezes, você deseja incluir o formulário e a lógica para lidar com o envio de formulários em um único arquivo PHP. Este formulário é frequentemente referido como formulário de autoprocessamento.

Para criar um formulário de autoprocessamento, você pode usar o $_SERVER['REQUEST_METHOD']que retorna o método de solicitação, por exemplo, GETou POST.

Se $_SERVER['REQUEST_METHOD']  for GET, você mostra o formulário. E se $_SERVER['REQUEST_METHOD']  for POST, você o processa. Por exemplo:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css">
    <title>PHP Form</title>
</head>
<body>
    <main>
        <?php if ($_SERVER['REQUEST_METHOD'] === 'GET') : ?>
            <form action="<?php htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post">
                <div>
                    <label for="name">Name:</label>
                    <input type="text" name="name" required="required" placeholder="Enter your name" />
                </div>

                <div>
                    <label for="name">Email:</label>
                    <input type="email" name="email" required="required" placeholder="Enter your email" />
                </div>

                <button type="submit">Subscribe</button>

            </form>
        <?php else : ?>

            <?php
            //---------------------------------------------
            // WARNING: this doesn't include sanitization
            // and validation
            //---------------------------------------------
            if (isset($_POST['name'], $_POST['email'])) {
                $name = htmlspecialchars($_POST['name']);
                $email = htmlspecialchars($_POST['email']);

                // show the $name and $email
                echo "Thanks $name for your subscription.<br>";
                echo "Please confirm it in your inbox of the email $email.";
            } else {
                echo 'You need to provide your name and email address.';
            }

            ?>

        <?php endif ?>
    </main>
</body>

</html>Linguagem de código:  PHP  ( php )

No entanto, misturar PHP e HTML nem sempre é uma boa prática.

Para tornar o código mais organizado, você pode criar a seguinte estrutura de arquivos e diretórios:

.
├── css
│   └── style.css
├── inc
│   ├── header.php
│   ├── footer.php
│   ├── get.php
│   ├── post.php
│   └── .htaccess      
└── index.phpLinguagem de código:  texto simples  ( texto simples )

O index.phparquivo no diretório raiz incluirá os header.phpe footer.php.

Se o método de solicitação for GET, o index.phparquivo carrega o formulário no get.phparquivo. Caso contrário, carrega o código do post.phparquivo para processar a POSTsolicitação.

index.php

O seguinte mostra o index.phparquivo:

<?php

require __DIR__ . '/inc/header.php';

$request_method = strtoupper($_SERVER['REQUEST_METHOD']);

if ($request_method === 'GET') {
	require __DIR__ . '/inc/get.php';
} elseif ($request_method === 'POST') {
	require __DIR__ .  '/inc/post.php';
}

require __DIR__ .  '/inc/footer.php';
Linguagem de código:  HTML, XML  ( xml )

cabeçalho.php

Eles header.phpcontêm a primeira parte da página:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" href="css/style.css">
    <title>PHP Form</title>
</head>
<body>
    <main>Linguagem de código:  HTML, XML  ( xml )

rodapé.php

O footer.phparquivo contém as tags anexas da página:

</main>
</body>

</html>Linguagem de código:  HTML, XML  ( xml )

obter.php

O get.phparquivo contém o formulário. O $_SERVER['PHP_SELF']retorna o nome do arquivo do script atualmente em execução.

Por exemplo, se o script em execução for https://tutorials.acervolima.com/app/form/index.php, o $_SERVER['PHP_SELF']retorno será /app/form/index.php.

No entanto, $_SERVER['PHP_SELF']não é confiável e é vulnerável a ataques XSS. Portanto, você deve sempre escapar usando a htmlspecialchars()função.

O seguinte mostra o get.phparquivo:

<form action="<?php htmlspecialchars($_SERVER['PHP_SELF']) ?>" method="post">
    <div>
        <label for="name">Name:</label>
        <input type="text" name="name" placeholder="Enter your name" />
    </div>

    <div>
        <label for="name">Email:</label>
        <input type="email" name="email" placeholder="Enter your email" />
    </div>

    <div>
        <button type="submit">Subscribe</button>
    </div>
</form>Linguagem de código:  HTML, XML  ( xml )

post.php

O seguinte mostra o post.phparquivo que trata do envio do formulário:

<?php

//-----------------------------------------------------
// WARNING: this doesn't include sanitization
// and validation
//-----------------------------------------------------

if (isset($_POST['name'], $_POST['email')) {
	$name = htmlspecialchars($_POST['name']);
	$email = htmlspecialchars($_POST['email']);

	// show the $name and $email
	echo "Thanks $name for your subscription.<br>";
	echo "Please confirm it in your inbox of the email $email.";
} else {
	echo 'You need to provide your name and email address.';
}Linguagem de código:  PHP  ( php )

.htaccess

O arquivo .htaccess impede o acesso direto aos arquivos do incdiretório. É relevante apenas para o servidor web Apache.

Deny from allLinguagem de código:  JavaScript  ( javascript )

Ao usar o arquivo .htaccess, você não pode navegar no arquivo diretamente da pasta inc. Por exemplo:https://tutorials.acervolima.com/app/form/inc/get.php

Aqui está a versão final do formulário .

Resumo

  • Use a <form>tag para criar um formulário HTML.
  • Especifique a URL que processa o envio do formulário no actionatributo.
  • Use o método GETou POSTpara o methodatributo do formulário para envio.
  • Utilize o $_GETou $_POSTpara acessar os dados do formulário.
  • Use a htmlspecialchars()função para escapar da entrada do usuário antes de mostrá-la em uma página da web.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *