HOWTO · PHP

Como Passar Variáveis para a Próxima Página em PHP

Diferentes abordagens sobre como passar variáveis para a próxima página usando PHP, como usar GET e POST através do formulário HTML, e usar sessão e cookie.

Nesta página

Uma variável PHP comum existe apenas enquanto a requisição correspondente está sendo processada. Para usar um valor em outra página, envie-o com a requisição ou armazene-o para requisições futuras. Um formulário envia campos nomeados para a URL indicada em action; na página seguinte, o PHP lê cada campo enviado no array de requisição correspondente.

Diagrama de um formulário no navegador enviando um valor nomeado a nextPage.php por GET ou POST, e do PHP lendo esse mesmo nome de $_GET ou $_POST.

O nome do campo do formulário é a chave que o PHP usa para recuperar o valor. GET coloca o valor na URL; POST o envia no corpo da requisição.

Como o PHP passa dados entre requisições de páginas

Cada carregamento de página corresponde a uma requisição HTTP separada. Uma variável como $name, criada durante o processamento da primeira requisição, não fica automaticamente disponível quando o PHP processa a próxima. Escolha um método de envio ou persistência conforme o tempo pelo qual o valor será necessário e se ele deve passar pelo navegador.

Use GET ou POST quando a próxima página precisar dos dados enviados por um formulário. Use uma sessão para manter no servidor um estado que deve estar disponível em várias requisições. Um cookie armazena um valor pequeno no navegador e o envia de volta em requisições posteriores. Esses mecanismos transferem ou mantêm dados, mas não tornam segura uma entrada não confiável. Valide os dados para o uso pretendido e faça o escape adequado ao contexto em que serão exibidos.

Envie dados com um formulário GET ou POST

Defina action como a página que receberá os dados e atribua um name estável a cada campo. O method determina em qual array de requisição os campos serão recebidos. Este formulário envia um nome a nextPage.php usando POST:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

<form action="nextPage.php" method="post">
  <label>Name <input name="name" type="text"></label>
  <button type="submit">Continue</button>
</form>

Em nextPage.php, confira se a chave esperada existe antes de usá-la. Faça o escape do valor ao inseri-lo em HTML:

<?php
$name = $_POST['name'] ?? null;
if ($name !== null) {
    echo 'Hello, ' . htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

Este código receptor não foi executado no material fornecido; quando servido como uma página da web, exibe uma saudação somente se a requisição incluir name. O nome do campo name deve corresponder à chave $_POST['name']. O operador de coalescência nula permite que a página lide com uma requisição sem esse campo sem tentar ler uma chave inexistente no array.

Para uma requisição GET, use um link ou formulário cujo nome do campo de consulta corresponda à chave lida por nextPage.php. Este link envia o campo name com o valor Alice:

<a href="nextPage.php?name=Alice">Continue as Alice</a>

Leia esse campo de $_GET['name'] em nextPage.php e confira se ele existe antes de exibir o valor:

<?php
$name = $_GET['name'] ?? null;
if ($name !== null) {
    echo 'Hello, ' . htmlspecialchars($name, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

Este exemplo da página receptora não foi executado no material fornecido, pois depende de uma requisição web recebida. O parâmetro de consulta name do link corresponde à chave $_GET['name'] usada pelo receptor. Em um formulário GET, defina o método como get e atribua a cada campo um name correspondente. Codifique valores dinâmicos em vez de concatenar texto arbitrário em uma URL. Os dados GET aparecem na barra de endereço e podem permanecer no histórico do navegador, nos favoritos, nos registros do servidor ou nos dados de referência. Use GET para valores compartilháveis e não confidenciais, como um termo de pesquisa, e não para segredos.

POST coloca os campos enviados no corpo da requisição, evitando que apareçam na URL, mas não os criptografa. Use HTTPS para proteger os dados durante o transporte e não trate POST como substituto da autorização ou da validação de entrada. Evite $_REQUEST quando a origem do dado for importante: dependendo da configuração, ele pode combinar dados de GET, POST e cookies, dificultando identificar qual valor a aplicação está usando.

Uma sessão mantém valores no servidor e os associa a um navegador por meio de um identificador de sessão. Inicie a sessão antes de enviar qualquer conteúdo da página em todas as páginas que leem ou gravam dados de sessão. Use a mesma chave nas duas requisições. A primeira página armazena o valor:

O código e os rótulos ou saídas exibidos nesta seção permanecem em inglês.

<?php
session_start();
$_SESSION['animal'] = 'Dog';
?>

Na página receptora, inicie a sessão antes de enviar conteúdo e confira se a mesma chave existe antes de lê-la:

<?php
session_start();
if (isset($_SESSION['animal'])) {
    echo htmlspecialchars($_SESSION['animal'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

Sessões são adequadas para estados como um fluxo de várias páginas ou dados no servidor de uma pessoa conectada. Proteja os identificadores de sessão com HTTPS e configurações apropriadas de cookies, e continue verificando as permissões em cada página.

Para criar um cookie, chame setcookie() antes de enviar conteúdo. O navegador recebe o cookie e pode devolvê-lo em uma requisição posterior; o PHP disponibiliza esse valor recebido por meio de $_COOKIE:

<?php
setcookie('animal', 'Dog', [
    'expires' => time() + 3600,
    'path' => '/',
    'secure' => true,
    'httponly' => true,
    'samesite' => 'Lax',
]);
?>

Normalmente, o novo valor aparece em $_COOKIE na requisição seguinte, e não imediatamente na requisição atual. Não atribua um valor a $_COOKIE para definir um cookie no navegador; isso altera apenas o array PHP da requisição atual. Cookies são armazenados no cliente e podem ser apagados ou alterados pelos usuários, portanto não confie neles para definir permissões nem para guardar dados confidenciais. Armazene apenas o que o navegador precisa e valide os valores recebidos.

Na requisição posterior, confira e leia a chave correspondente do cookie:

<?php
if (isset($_COOKIE['animal'])) {
    echo htmlspecialchars($_COOKIE['animal'], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
}
?>

Escolha um método e trate os valores enviados com segurança

Use GET para dados que devem fazer parte de uma URL compartilhável; POST para enviar um formulário que altera ou processa dados; uma sessão para valores mantidos no servidor e necessários em requisições futuras; e um cookie quando um valor pequeno, armazenado no navegador, precisar ser enviado de volta. GET e POST não são seguros por si só: HTTPS protege os dados durante o transporte, enquanto a validação e a autorização protegem o comportamento da aplicação. As sessões mantêm o valor no servidor, mas o identificador de sessão ainda precisa ser protegido. Cookies ficam sob o controle do usuário.

Ao solucionar problemas, compare o method do formulário e o name de cada campo com a chave $_GET ou $_POST usada pela página receptora. Confirme que o formulário aponta para o action esperado e verifique se a chave existe antes de lê-la. Para sessões, confira se as duas páginas iniciam a sessão antes de enviar conteúdo e usam a mesma chave. Para cookies, defina-os antes de enviar conteúdo e verifique-os em uma requisição posterior. Mesmo depois de conferir o formato, faça o escape dos valores conforme o contexto de saída, por exemplo, com htmlspecialchars() para HTML.