Pular para o conteúdo
murad.guide

PHP

Capítulo 9

Pedidos GET e escolhas na URL

5 min de leitura 988 palavras 1 gravura

Neste capítulo você vai ler uma escolha da URL e usá-la sem gravar dados.

Seu ponto de partida

Estude depois do capítulo 08. O exemplo deste capítulo é 09-get-consultas, no pacote que acompanha o volume. Copie a pasta inicio para um diretório de prática e preserve o original. A raiz do exemplo é a referência concluída desta etapa. Sua cópia permite experimentar sem perder a referência.

Execute o PHP na raiz da sua cópia com php -S 127.0.0.1:8000 -t public. Abra http://127.0.0.1:8000/. Não abra PHP por duplo clique nem use o servidor de Python. Encerre com Ctrl+C antes de trocar de etapa.

Como praticar

Leia a explicação e digite ou confira o código indicado. Mude uma coisa. Antes de conferir, anote sua previsão. Salve, recarregue e compare. Se não acontecer o esperado, investigue o erro antes de avançar. Cada experiência parte dos valores da referência. Depois de conferir, desfaça somente a mudança desse experimento antes de começar a próxima lição. Você pode parar depois de uma lição e retomar mais tarde.

Observe a consulta no endereço

HTTP é a forma de o navegador pedir uma resposta ao servidor. Ao abrir esta página, o pedido usa o método GET. Uma consulta pode acrescentar parâmetros ao endereço depois de um ponto de interrogação.

Neste exemplo, ?tema=html envia a chave tema com o valor html. O PHP expõe consultas em $_GET, um array preenchido a partir do pedido. Ele existe mesmo quando não há parâmetros.

GET serve aqui para escolher o assunto mostrado. Ele não grava uma visita. Não coloque informações pessoais na URL: ela pode ficar no histórico do navegador.

Faça no seu exemplo

Abra os três links da seção Escolha um assunto. Confira seus destinos no editor.

<a href="index.php?tema=html">HTML</a>
<a href="index.php?tema=css">CSS</a>
<a href="index.php?tema=php">PHP</a>

Mude uma coisa e preveja

Troque apenas tema=html por tema=css na barra do navegador.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

Confirme o assunto mostrado e o endereço. O texto deve acompanhar a escolha, sem criar arquivos no disco.

Se não acontecer

Se aparecer um erro 404, confira index.php antes do ponto de interrogação. Se nada mudar, confira a chave tema e um dos três valores previstos.

Escolha entre valores conhecidos

A URL pode conter texto inesperado. Em vez de mostrar qualquer texto recebido, esta página aceita apenas chaves que existem em um array de temas. O valor exibido vem desse array fixo.

Is_string confere se o parâmetro é texto. A verificação evita tratar um array como se fosse uma frase. O operador ?? fornece uma alternativa quando a chave não existe. Para um tema desconhecido, o exemplo usa PHP.

Essas regras não significam que uma URL é confiável. Significam que o programa definiu quais escolhas entende. No capítulo 11 você vai aprender o preparo de texto para a saída HTML.

Faça no seu exemplo

No início de public/index.php, confira a consulta e a escolha de um valor conhecido.

$temas = ["html" => "Estrutura", "css" => "Aparência", "php" => "Servidor"];
$tema = $_GET["tema"] ?? "php";
$tema = is_string($tema) ? $tema : "php";
$escolha = $temas[$tema] ?? $temas["php"];

Mude uma coisa e preveja

Abra index.php?tema=banana.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

A página deve mostrar Servidor, a alternativa prevista. Não deve mostrar banana como conteúdo livre nem produzir aviso de chave indefinida.

Se não acontecer

Se a chave inesperada gerar um aviso, confira a alternativa com ??. Compare a expressão completa com a referência.

Diferencie consulta de envio

GET e POST são métodos de pedido. O formulário de escrita usará POST: o navegador envia os campos no corpo do pedido. GET neste projeto apenas consulta a página e a escolha de tema.

POST não transforma um endereço HTTP em uma conexão protegida e não substitui HTTPS. Para o exercício local, o destino continua 127.0.0.1. Em ambos os métodos, o servidor precisa conferir o que recebeu.

Você pode consultar o método em $_SERVER[“REQUEST_METHOD”]. Usar isset($_POST) não identifica um envio, porque esse array já existe num GET. Vamos usar uma comparação com POST quando o formulário chegar.

Faça no seu exemplo

Confira o método mostrado na faixa Pedido atual.

$metodo = $_SERVER["REQUEST_METHOD"] ?? "GET";

Mude uma coisa e preveja

Remova todos os parâmetros depois de index.php e abra a página novamente.

Anote o que você acha que vai acontecer antes de salvar e recarregar.

Recarregue e confira

O método continua GET e o tema usa a alternativa PHP. Não houve envio de visita.

Se não acontecer

Se um bloco de gravação executar ao abrir a página, há um erro de condição. Nenhuma gravação faz parte desta etapa; restaure a referência antes de avançar.

Trecho do resultado de referência do capítulo 09

A captura mostra um trecho da referência concluída. Abra e percorra o exemplo para conferir o restante. Experimentos temporários podem produzir outra aparência; restaure os valores indicados antes de comparar.

Atividades para fazer antes das respostas

Use uma nova cópia do exemplo. Tente aplicar o que aprendeu antes de consultar os comentários.

  1. Abra a consulta com tema=html e depois tema=php.

  2. Abra tema[]=html e veja a alternativa.

  3. Explique por que isset($_POST) não distingue um envio.

Respostas comentadas

Compare sua explicação e o que realmente aconteceu. Outra solução pode funcionar se cumprir o objetivo e preservar o acesso ao conteúdo.

  1. A página usa Estrutura e depois Servidor, valores do array.

  2. O parâmetro vira array; is_string recusa esse tipo e a escolha volta para PHP.

  3. $_POST existe também quando está vazio. A condição de escrita deve conferir o método POST.

Quando seguir

Você distingue uma consulta GET e uma escolha aceita, sem confundir isso com gravação. Se ainda precisa de ajuda, repita a experiência pequena antes de avançar.

Consulta opcional

Não é preciso ler os links externos para executar os arquivos fornecidos. Eles servem para consultar detalhes quando você quiser.

O arquivo completo

Referência do exemplo 09-get-consultas, reproduzida aqui para que você possa conferir sem sair da página.

public/estilos.css

* { box-sizing: border-box; }
body { margin: 0; background: #f4f7fb; color: #203246;
  font: 1.05rem/1.65 Arial, sans-serif; }
header, main, footer { max-width: 48rem; margin-inline: auto; padding: 1.5rem; }
header { padding-top: 2.5rem; }
h1 { font-size: clamp(1.8rem, 5vw, 2.7rem); line-height: 1.2; }
main { background: #fff; border-radius: .8rem; }
article { border-top: 1px solid #cad4df; padding-block: 1rem; }
a { color: #124e77; text-underline-offset: .2em; }
nav { display: flex; flex-wrap: wrap; gap: 1rem; }
label { display: block; font-weight: bold; }
input:not([type=hidden]), textarea { width: 100%; max-width: 34rem;
  border: 2px solid #718095; border-radius: .35rem; padding: .7rem;
  font: inherit; color: inherit; background: #fff; }
button { font: inherit; background: #124e77; color: white;
  border: 0; border-radius: .35rem; padding: .75rem 1.2rem; cursor: pointer; }
button:hover { background: #103b59; }
.mensagem { white-space: pre-wrap; overflow-wrap: anywhere; }
.erros { color: #8b142c; }
.ok { color: #175c30; font-weight: bold; }
:focus-visible { outline: 3px solid #b04d00; outline-offset: 3px; }
.pular { position: absolute; left: -10000px; }
.pular:focus { position: static; display: block; padding: 1rem; background: white; }
@media (max-width: 35rem) { header,main,footer { padding: 1rem; } }