Como Atrasar a Execução de um Script PHP com a Função sleep() (Guia Sênior)

<< Aula anterior | Sumário do Curso | Próxima aula >>



Fala, dev! Chegando na área com mais um truque essencial para o seu cinto de utilidades.

Na grande maioria das vezes, nosso objetivo como programadores é fazer o código rodar o mais rápido possível, certo? Mas e se eu te disser que existem momentos em que o seu sistema precisa pisar no freio e esperar?

É exatamente para isso que serve a função sleep(). Ela recebe como argumento um número inteiro (em segundos) e literalmente "trava" (pausa) a execução do script por aquele período. Vamos entender como ela funciona na prática e, mais importante, os perigos ocultos que a maioria dos cursos básicos não te ensina.



Como atrasar a execução de um script (O Básico)

A sintaxe é extremamente simples. No exemplo abaixo, pedimos ao servidor que imprima uma mensagem, durma por 3 segundos, e depois continue o trabalho.

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <title>Apostila PHP Progressivo</title>
</head>
<body>
    <h3>Iniciando o processamento...</h3>
    
    <?php
        echo "Atrasando 3 segundos...<br>";
        
        // O PHP fará uma pausa de exatos 3 segundos
        sleep(3);
        
        // Acorda e continua a execução
        echo "Obrigado por esperar! Processo concluído.";
    ?>
</body>
</html>


🛠️ Dica de Ouro (O Segredo do Buffer): Se você rodar o código acima no navegador, pode ter a impressão de que a página ficou "carregando" por 3 segundos e depois mostrou tudo de uma vez. Isso acontece porque o servidor guarda o HTML no buffer antes de enviar para a tela. Para ver o texto aparecer, pausar, e o restante aparecer depois, você precisa usar funções como ob_implicit_flush(true); e flush(); antes do sleep().


Quando eu devo usar o sleep() na vida real?

Você não vai usar isso para irritar o usuário fazendo a página demorar, obviamente. No mercado de trabalho real, usamos o sleep() principalmente no Back-end e em Tarefas Cron (Jobs):

  • Consumo de APIs (Rate Limiting): Muitas APIs (como Twitter, Google, ou sistemas de pagamento) bloqueiam o seu IP se você fizer muitas requisições por segundo (Erro HTTP 429). Usamos o sleep() no meio de um laço while ou for para pausar o robô e evitar o bloqueio.
  • Web Scraping: Se você está criando um bot para ler dados de outro site, acessar 100 páginas em 1 segundo vai derrubar o servidor alvo (e te banir). O sleep() simula o comportamento humano.
  • Aguardar um serviço externo: Dar tempo para que um banco de dados termine uma inserção pesada ou um arquivo termine de ser transferido via FTP.


O Nível Micro: Conheça a função usleep()

O sleep() só aceita segundos inteiros (1, 2, 3...). E se você quiser pausar o script por apenas meio segundo (0.5s)? Para isso, usamos o usleep() (Micro-sleep).

Ele recebe o valor em microssegundos (1 segundo = 1.000.000 de microssegundos).

<?php
    echo "Pausando por meio segundo...<br>";
    
    // 500.000 microssegundos = 0.5 segundos
    usleep(500000); 
    
    echo "Voltamos!";
?>


Saia do Básico e Domine o PHP Profissional

Entender as minúcias de buffers, tempo de execução e travamento de sessão é o que as empresas procuram em testes práticos para vagas Júnior e Pleno. Se você quer ter todo o nosso material didático na palma da mão, organizado do zero ao avançado, sem depender de internet, a nossa Apostila é para você.

Apostila PHP Progressivo
Baixar Apostila de PHP Agora 🚀


⚠️ O Perigo Oculto: Travamento de Sessão e max_execution_time

Como prometi, aqui está o conteúdo avançado que vai salvar sua pele:

1. O Limite de Tempo do PHP: Por padrão, o PHP tem um limite máximo de execução (geralmente 30 segundos, definido no php.ini). Se você criar um loop com vários sleep() que ultrapasse esses 30 segundos, o servidor vai estourar um Fatal Error (Maximum execution time exceeded) e matar seu site. Sempre que trabalhar com longas esperas, ajuste a função set_time_limit(0);.

2. O Bloqueio de Sessão (Session Locking): Esse erro é clássico! Se você usar session_start() e logo depois um sleep(10), o PHP bloqueia o arquivo de sessão daquele usuário por 10 segundos. Se o mesmo usuário tentar abrir outra aba do seu site ou fazer uma requisição AJAX simultânea, o site inteiro vai parecer travado para ele até o sleep terminar.
Como resolver: Use a função session_write_close(); antes do sleep para liberar a sessão para outras abas!




Continue Explorando:

Agora que você sabe dominar o relógio do servidor, avance para os próximos tópicos estruturais do PHP:

  • Trabalhando com Datas: Como usar a função date() e time() no PHP
  • Entendendo o php.ini: Como aumentar o tempo de execução e limite de memória
  • Documentação Oficial da função sleep()


<< Aula anterior | Sumário do Curso PHP | Próxima aula >>

Como Fazer Redirecionamento de Página no PHP com header() (Sem Erros!)

<< Aula anterior | Sumário do Curso | Próxima aula >>



Fala, dev! Tudo certo por aí?

Sabe quando você preenche um formulário de login, digita sua senha, clica em "Entrar" e o site magicamente te joga para a tela do seu Painel de Controle? Isso não é mágica, é manipulação de rotas! Em algum momento do seu sistema web, você precisará transferir o usuário de uma página para outra automaticamente.

No PHP, lidar com esse tráfego é uma tarefa muito simples graças à função nativa header(). Hoje, vamos aprender a usar essa função do jeito certo, garantindo a segurança do seu sistema e evitando os erros mais clássicos que travam a vida dos iniciantes.



Como redirecionar uma página em PHP (O Básico)

A função header() serve para enviar cabeçalhos HTTP brutos para o navegador do usuário. Para fazer um redirecionamento, nós enviamos o cabeçalho Location, informando a nova URL.

Veja como é direto ao ponto. No exemplo abaixo, redirecionamos o usuário para a página inicial do nosso portal:

<?php
    // Redireciona o usuário para a URL especificada
    header('Location: https://www.programacaoprogressiva.net/');
    
    // Encerra a execução do script imediatamente
    die();
?>


⚠️ Segurança Sênior: Por que o die() ou exit() é obrigatório?

Muitos tutoriais na internet apenas mostram o comando header() e esquecem do die() (ou exit()). Isso é uma falha de segurança gravíssima.

O header('Location: ...') avisa o navegador: "Ei, vá para a outra página!". Porém, o servidor PHP continua executando todo o código que estiver abaixo dessa linha no seu arquivo. Se um usuário malicioso usar ferramentas (como o Postman ou cURL) para ignorar o redirecionamento, ele poderá acessar áreas restritas do seu código!

Regra de Ouro: Sempre que usar header('Location: ...'), coloque um die(); ou exit; na linha de baixo para "matar" o processamento do servidor naquele exato momento.


SEO para Programadores: Redirecionamento 301 vs 302

Se você está criando um site profissional e quer rankear no Google, precisa entender que existem dois tipos principais de redirecionamento:

  • 302 (Temporário): É o padrão do PHP. Diz ao Google: "A página mudou de lugar só por enquanto, não atualize seus registros". Excelente para redirecionar após um login ou carrinho de compras.
  • 301 (Permanente): Diz ao Google: "Essa página mudou de endereço para sempre. Passe toda a autoridade de SEO da antiga para a nova". Ideal para quando você muda a URL de um artigo ou migra de domínio.

Para forçar um redirecionamento 301 focado em SEO no PHP, adicione os parâmetros extras na função:

<?php
// Redirecionamento 301 (Permanente) - Excelente para SEO
header('Location: https://meusite.com/nova-pagina.php', true, 301);
exit;
?>


Trava em pequenos erros e perde horas procurando no Google?

Entender o ciclo de vida de uma requisição HTTP, cabeçalhos e segurança é o que diferencia o "digitador de código" do Engenheiro de Software. Na nossa Apostila Completa de PHP, você aprende do zero com exercícios práticos focados no mundo real. Estude no seu ritmo, offline e sem anúncios!

Apostila PHP Progressivo
Baixar Apostila de PHP Agora 🚀


A Dor de Cabeça: Erro "Cannot modify header information - headers already sent"

Todo programador PHP já tomou um susto com esse erro na tela! Ele acontece porque você não pode enviar um cabeçalho (header) se já tiver enviado algum conteúdo para a tela (mesmo que seja um simples espaço em branco ou uma tag HTML).

❌ O jeito ERRADO (Vai gerar erro):

<html>
<body>
    <h1>Bem-vindo!</h1>
    <?php
        // ERRO! O HTML acima já foi enviado para a tela. O cabeçalho vai falhar.
        header('Location: painel.php');
        exit;
    ?>
</body>
</html>

✅ O jeito CERTO:

Coloque a lógica de redirecionamento no topo absoluto do seu arquivo, antes de qualquer tag HTML, echo ou espaços fora das tags <?php ?>.

<?php
    session_start();
    if(!isset($_SESSION['logado'])) {
        header('Location: login.php');
        exit;
    }
?>
<html>
<body>
    <h1>Você está logado e pode ver esta página!</h1>
</body>
</html>

Dica Extra: Se o seu sistema for muito complexo e você precisar redirecionar no meio do código, pesquise sobre as funções ob_start() e ob_end_flush() (Output Buffering).




Continue Dominando o Backend

O redirecionamento é apenas o começo da manipulação de rotas. Para aprofundar, veja nossas aulas complementares:



<< Aula anterior | Sumário do Curso PHP | Próxima aula >>

Como Verificar e Forçar Redirecionamento HTTPS no PHP (Guia de Segurança)

<< Aula anterior | Sumário do Curso | Próxima aula >>



Fala, dev! Tudo sob controle no backend?

Se você já navegou pela internet nos últimos anos, com certeza já se deparou com o navegador gritando: "Este site não é seguro!" ao tentar acessar uma página HTTP comum. No mundo atual, não ter um cadeado verde (ou ícone de segurança) no seu site é praticamente assinar a sentença de morte para o seu tráfego e credibilidade.

Hoje vamos entender como o PHP lida com esse protocolo e como você pode escrever códigos para identificar e proteger o acesso dos seus usuários.



O que é HTTP vs HTTPS e por que o PHP precisa saber disso?

Resposta Direta: Para checar se o usuário está em uma conexão segura via PHP, verificamos se a chave HTTPS existe e não está vazia na variável superglobal $_SERVER. O HTTPS (Hypertext Transfer Protocol Secure) adiciona uma camada de criptografia (SSL/TLS) ao HTTP comum, protegendo os dados trafegados entre o cliente e o servidor contra interceptações.



Para deixar claro a diferença estrutural:

  • HTTP: A comunicação é feita em "texto plano". Se alguém interceptar a rede (um ataque Man-in-the-Middle), consegue ler senhas, e-mails e dados de cartão de crédito.
  • HTTPS: A comunicação é criptografada. Mesmo que o pacote de dados seja interceptado no meio do caminho, o atacante só verá um monte de caracteres ilegíveis e embaralhados.

Além da segurança vital, os motores de busca (como o Google) priorizam sites em HTTPS. Ou seja: ter um site HTTPS é fundamental para o seu SEO.



Script PHP: Verificando se a página é HTTPS

A estrutura nativa para descobrir o protocolo que está sendo utilizado naquele exato momento de acesso é bem simples e elegante. Basta perguntar ao servidor web se a flag HTTPS foi ativada na requisição.

<?php
/**
 * Script Progressivo: Verificador de Protocolo
 */

// Verifica se a chave 'HTTPS' existe, não está vazia e tem o valor 'on'
if (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off') {
    echo "<h3 style='color: green;'>🔒 Segurança garantida: O HTTPS está ativo!</h3>";
} else {
    echo "<h3 style='color: red;'>⚠️ Cuidado: O HTTP padrão está ativo (Conexão não segura).</h3>";
}
?>


🛠️ Curiosidade de Arquitetura: A condição verifica se o valor é diferente de 'off' porque alguns servidores IIS (da Microsoft) costumam setar a variável $_SERVER['HTTPS'] com a string 'off' em conexões não seguras, em vez de simplesmente deixá-la vazia como o Apache faz. Prever esses cenários é o que te faz um programador à prova de falhas!


Quer ir além dos scripts básicos de internet?

Profissionais que escrevem códigos seguros e eficientes ganham as melhores vagas e fecham os contratos mais caros. Se você está cansado de ficar pescando dicas soltas e quer um material linear, didático e focado no seu crescimento profissional, a nossa Apostila Completa é o atalho perfeito. Estude offline, pratique com exercícios focados e acesse o gabarito.

Apostila PHP Progressivo
Baixar Apostila PHP Progressivo Agora 🚀


O Cenário Moderno: Proxies, Cloudflare e Load Balancers

Se você colocar o seu site atrás de uma CDN de performance como a Cloudflare ou em um balanceador de carga da AWS, o script acima pode falhar. Por quê?

Porque o usuário conecta via HTTPS na Cloudflare, mas a Cloudflare pode se conectar via HTTP com o seu servidor. Para o seu PHP, a conexão parecerá insegura, gerando loops de redirecionamento ou falsos positivos.

Para contornar isso em servidores corporativos, o padrão de mercado é checar um cabeçalho extra:

<?php
// Verificação Sênior: Lida com conexões diretas e proxies/Cloudflare
$isSecure = false;

if (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on') {
    $isSecure = true;
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https' || !empty($_SERVER['HTTP_X_FORWARDED_SSL']) && $_SERVER['HTTP_X_FORWARDED_SSL'] === 'on') {
    $isSecure = true;
}

echo $isSecure ? "Conexão Segura Ativa!" : "Atenção: Tráfego Inseguro.";
?>


Bônus: Como forçar o HTTPS no PHP (Redirecionamento 301)

Agora que você sabe detectar a conexão, de nada adianta apenas mostrar um aviso. O correto é proteger o usuário! Se ele acessar via HTTP, nós devemos pegá-lo pela mão e redirecioná-lo obrigatoriamente para a versão segura do site.

Coloque este trecho de código no topo do seu arquivo principal (antes de qualquer saída HTML):

<?php
// Se não for seguro...
if (empty($_SERVER['HTTPS']) || $_SERVER['HTTPS'] === "off") {
    // Monta a nova URL forçando o "https://"
    $redirectURL = "https://" . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
    
    // Envia o cabeçalho de redirecionamento permanente (Bom para SEO)
    header('HTTP/1.1 301 Moved Permanently');
    header('Location: ' . $redirectURL);
    exit(); // Encerra o script para garantir o salto
}
?>


Torne-se um Mestre da Programação

Segurança de redes, manipulação de servidores, linguagens de baixo nível e arquitetura web. Se você quer ter o arsenal completo de um Engenheiro de Software sempre à disposição no seu celular, tablet ou PC, nosso Mega Pack é o seu próximo passo.

Mega Pack 7 Apostilas de Programação



Consolide seu Conhecimento

Proteger aplicações web é um ciclo contínuo de estudos. Agora que você dominou a verificação de protocolo, que tal aprofundar suas habilidades em outras métricas de servidores e segurança?



<< Aula anterior | Sumário do Curso PHP | Próxima aula >>

Como Pegar o Navegador e SO do Usuário em PHP (Guia do User Agent)

<< Aula anterior | Sumário do Curso | Próxima aula >>



E aí, dev! Preparado para dar mais um passo na sua jornada Full-Stack?

Sempre que acessamos uma página na internet, uma conversa invisível acontece entre o nosso computador e o servidor do site. Nessa conversa, o seu Browser (o navegador que você usa, como Chrome, Firefox, Safari ou Edge) envia um "cartão de visitas" automático para o servidor. E é exatamente isso que vamos aprender a capturar hoje com o PHP!



O que é o HTTP_USER_AGENT no PHP?

Resposta Direta: O User Agent é uma string de texto enviada pelo navegador do cliente no cabeçalho HTTP de uma requisição. No PHP, capturamos essa informação usando a superglobal $_SERVER['HTTP_USER_AGENT'], que nos revela qual é o navegador, a versão, o sistema operacional (Windows, Mac, Linux, Android) e até o motor de renderização (como WebKit) do usuário.



A Analogia do "Crachá de Visitante"

Pense no servidor do seu site como a portaria de um prédio de luxo. Cada vez que uma URL é solicitada, um visitante chega à porta. O User Agent é o crachá desse visitante. Nele está escrito: "Olá, eu sou o Google Chrome, versão 114, estou rodando em um Windows 11 de 64 bits".

Saber ler esse crachá é fundamental para um programador de elite. Com essa informação, você pode:

  • Criar estatísticas de acesso (Analytics): Descobrir se o seu público usa mais celular ou computador de mesa.
  • Detectar Bots: Saber se quem está acessando é um usuário real ou o robô rastreador do Google (Googlebot).
  • Melhorar a Experiência (UX): Exibir um aviso de atualização caso o usuário esteja usando um navegador pré-histórico (como o falecido Internet Explorer).


Script Prático em PHP: Exibindo as Informações do Cliente

A captura dessas informações fica armazenada em uma única e poderosa variável de ambiente do nosso servidor web. Veja como é simples integrá-la dentro da estrutura HTML da sua página:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Apostila PHP Progressivo - User Agent</title>
</head>
<body> 

<?php
    // Captura a string inteira enviada pelo navegador
    $agente_usuario = $_SERVER['HTTP_USER_AGENT'];
    
    echo "<h3>Informações do seu Browser (User Agent):</h3>";
    echo "<p>" . $agente_usuario . "</p>";
?>

</body>
</html>


Se você rodar esse script no seu servidor local (XAMPP, WAMP, etc.) acessando pelo seu computador agora mesmo, verá na tela algo gigante e feio, parecido com isso:

Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36



Chega de tutoriais rasos pela internet!

Entender de onde vêm os dados das Superglobais é o que separa o amador do Programador Sênior. Você quer aprender a manipular esses dados para criar sistemas de login, bloqueio de bots e relatórios profissionais? Estude de forma linear, offline e sem distrações com o nosso material completo.

Apostila PHP Progressivo
Baixar Apostila PHP com Exercícios e Gabarito 🚀


🛠️ Dica de Mestre: Como tomar decisões baseadas no User Agent

Como vimos, a string retornada é um grande bloco de texto. O legal mesmo é usar funções de manipulação de strings, como a strpos(), para procurar palavras específicas (como "Android" ou "Chrome") e criar comportamentos dinâmicos no seu site.

Veja como é fácil redirecionar um usuário de celular para uma página diferente, ou apenas exibir uma mensagem personalizada:

<?php
$agente = $_SERVER['HTTP_USER_AGENT'];

// Verifica se a palavra 'Android' existe dentro da string do User Agent
if (strpos($agente, 'Android') !== false) {
    echo "Identificamos que você está usando um celular Android. Bem-vindo à versão Mobile!";
    // Aqui você poderia colocar um redirecionamento: header('Location: mobile.php');
} 
// Verifica se é o navegador Firefox
elseif (strpos($agente, 'Firefox') !== false) {
    echo "Que bom gosto! Você está usando o Mozilla Firefox.";
} 
else {
    echo "Acesso realizado por um dispositivo ou navegador genérico.";
}
?>


⚠️ Atenção à Segurança: Nunca confie dados críticos ou de segurança no HTTP_USER_AGENT. Assim como IPs podem ser forjados (Spoofing), qualquer usuário malicioso ou ferramenta (como o Postman) pode alterar essa string para dizer ao seu servidor que é um "Googlebot" ou um "iPhone de última geração" só para burlar regras do seu site. Use-o para métricas e melhorias de UI/UX, não para controle de acessos rígidos!


Economize Tempo e Acelere sua Carreira!

O mercado de tecnologia não espera. Se você quer evoluir mais rápido, ter os conceitos essenciais sempre à mão e apoiar o ensino de programação no Brasil, o Mega Pack é a escolha definitiva.

Todas as Apostilas de Programação



Consolide seu Conhecimento

Agora que você já sabe como ler o "crachá" do usuário, é hora de aprofundar seus estudos em manipulação de requisições e strings. Sugerimos a leitura atenta dos seguintes artigos para fechar seu raciocínio de Backend:



<< Aula anterior | Sumário do Curso PHP | Próxima aula >>

Como Pegar o IP do Usuário em PHP (Script Completo + Segurança)

<< Aula anterior | Sumário do Curso | Próxima aula >>



Fala, mestre do código! Tudo tranquilo?

Se você está desenvolvendo um sistema de login, um sistema de votos, ou até mesmo um painel de estatísticas, mais cedo ou mais tarde você vai se esbarrar com a seguinte necessidade: "Como eu sei quem é esse usuário acessando minha página?"

A resposta mais fundamental na arquitetura de redes da internet é o famoso Endereço IP.



O que é um Endereço IP e Como Capturá-lo no PHP?

Resposta Direta: Para pegar o IP do usuário em PHP, utilizamos a variável superglobal $_SERVER. O índice padrão é o $_SERVER['REMOTE_ADDR'], porém, para identificar usuários reais que estejam atrás de Proxies ou Load Balancers, devemos verificar também os cabeçalhos HTTP_CLIENT_IP e HTTP_X_FORWARDED_FOR.



O IP (Internet Protocol) é como se fosse o "CPF" ou o "Endereço Residencial" do seu dispositivo na rede. Todo smartphone, computador ou geladeira inteligente conectado à internet que usa o protocolo TCP/IP recebe esse número para ser identificado unicamente na rede.

Sem ele, a internet simplesmente não saberia para onde enviar os dados de volta quando você clica em um link.



A Evolução: Do IPv4 para o IPv6

Historicamente, o IP costumava ser um número de 32 bits, o famoso IPv4. Para facilitar o entendimento dos nós humanos, esse número é dividido em 4 blocos (octetos), separados por pontos.
Exemplo: 192.168.1.2

Porém, com o crescimento explosivo da grande rede (agora até a coleira do cachorro tem internet), os endereços IPv4 se esgotaram. A solução foi atualizar a arquitetura para o IPv6, que possui 128 bits e utiliza um formato hexadecimal bem maior, suportando um número praticamente infinito de dispositivos.

💡 Dica de Mestre: O seu código PHP precisa estar preparado para ler tanto o formato IPv4 quanto o IPv6. Afinal, a migração global já é uma realidade!


Como pegar o IP do Usuário na Prática (Script em PHP)

A princípio, você pode pensar: "É só usar o REMOTE_ADDR e pronto!". Mas a vida de um desenvolvedor web não é tão simples. Muitos usuários acessam a internet por meio de conexões corporativas, Proxies, VPNs ou servidores de balanceamento de carga (como a Cloudflare).

Quando isso acontece, o REMOTE_ADDR vai te devolver o IP do Proxy, e não do usuário real. Para resolver isso, fazemos uma cascata de verificações buscando cabeçalhos específicos. Veja o algoritmo clássico e eficaz:



<?php
/**
 * Script Progressivo para capturar o IP real do usuário
 * @return string Endereço IP
 */

$ip_address = '';

// 1. Verifica se o IP foi passado diretamente por um cliente (Ex: internet compartilhada)
if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip_address = $_SERVER['HTTP_CLIENT_IP'];
}
// 2. Verifica se o IP está vindo de um Proxy ou Load Balancer (Ex: Cloudflare, VPNs)
elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    // O X-Forwarded-For pode retornar uma lista de IPs. O primeiro costuma ser o real.
    $ip_address = $_SERVER['HTTP_X_FORWARDED_FOR'];
}
// 3. Caso não haja proxy, pega o endereço remoto padrão (Conexão direta)
else {
    $ip_address = $_SERVER['REMOTE_ADDR'];
}

echo "O seu Endereço IP é: " . $ip_address;
?>


Entendendo o Código passo a passo:

  • HTTP_CLIENT_IP: É um cabeçalho que algumas redes enviam para identificar o IP da máquina na rede local antes de sair para a internet.
  • HTTP_X_FORWARDED_FOR: É o padrão de ouro para identificar usuários passando por Proxies. Se o usuário usa uma rede corporativa, o proxy anota o IP original do funcionário aqui antes de enviar a requisição para o seu servidor.
  • REMOTE_ADDR: O IP da máquina que está efetivamente batendo no seu servidor Apache/Nginx.


Cansado de pesquisar códigos pela metade no Google?

Entender variáveis superglobais é só o começo. O mercado não paga por quem "copia e cola", paga por quem entende a Lógica do Backend. Domine o PHP do zero ao avançado, sem distrações, sem anúncios piscando, estudando offline onde e quando quiser.

Apostila PHP Progressivo
Baixar Apostila Completa em PDF 🚀


⚠️ Atenção com a Cibersegurança: Nunca confie cegamente no usuário

Como desenvolvedores Full-Stack, precisamos pensar como hackers. Você reparou que usamos variáveis baseadas em cabeçalhos HTTP (os que começam com HTTP_)?

A grande pegadinha do desenvolvimento web é que qualquer cabeçalho HTTP pode ser falsificado (Spoofing). Um usuário mal intencionado pode usar ferramentas como o Postman ou cURL para forçar a variável HTTP_X_FORWARDED_FOR e enviar um IP falso (por exemplo, 127.0.0.1) para enganar o seu sistema de bans e firewall.

🛠️ Regra de Ouro da Segurança em PHP: O ÚNICO cabeçalho que não pode ser falsificado pelo cliente é o $_SERVER['REMOTE_ADDR']. Ele é gerado diretamente pela conexão TCP do seu servidor Web. Use os outros cabeçalhos para melhorar a estatística e exibir a localidade, mas se for para bloquear ou banir um usuário por questões críticas de segurança, armazene e confie prioritariamente no REMOTE_ADDR.


Se você quer limpar e garantir que o dado recebido é realmente um endereço IP válido antes de salvar no seu Banco de Dados MySQL, o PHP possui uma função maravilhosa chamada filter_var():

<?php
// Valida se a string capturada é realmente um IP válido (IPv4 ou IPv6)
if (filter_var($ip_address, FILTER_VALIDATE_IP)) {
    echo "O IP {$ip_address} é um endereço válido no formato de redes!";
    // Código para salvar no Banco de Dados...
} else {
    echo "Endereço IP inválido. Cuidado com injeção de dados falsos!";
}
?>


Quer a biblioteca completa do Programador de Elite?

Leve não só o PHP, mas C, C++, Redes, Java, HTML e CSS de uma vez só.

Mega Pack 7 Apostilas de Programação



Consolide seu Conhecimento

Não pare por aqui! Para dominar a arquitetura de backend e como o seu servidor se comunica com o mundo externo, recomendamos fortemente o estudo dos seguintes tópicos da nossa rede:



<< Aula anterior | Sumário do Curso PHP | Próxima aula >>

Como Calcular o Fatorial em PHP Usando Laços (FOR, WHILE e DO WHILE)

O que você vai aprender neste tutorial

  • O que é o Fatorial na matemática e qual a sua lógica.
  • Como criar um algoritmo em PHP para calcular o fatorial de qualquer número.
  • Implementações práticas utilizando os laços WHILE, FOR e o temido DO WHILE.

O que é o Fatorial de um Número?

O fatorial de um número inteiro positivo (representado pelo símbolo !), é o resultado da multiplicação desse número por todos os seus antecessores maiores que zero.

Por exemplo, chamamos fatorial de um número n, representado por n!, o seguinte cálculo matemático:
n! = 1 x 2 x 3 x ... x (n-1) x n

Vamos ver isso na prática, calculando os primeiros fatoriais:

  • 2! = 2 x 1 = 2
  • 3! = 3 x 2 x 1 = 6
  • 4! = 4 x 3 x 2 x 1 = 24
  • 5! = 5 x 4 x 3 x 2 x 1 = 120

A lógica de programação por trás disso é muito simples: se o usuário insere um valor n, basta multiplicarmos 1 por 2, por 3, por 4... até chegar no valor limite n. O fatorial é o produto final de todas essas multiplicações acumuladas.

Script em PHP: Como calcular o Fatorial

Para construir nosso código, precisaremos de algumas variáveis fundamentais. Vamos armazenar em $n o número digitado pelo usuário através do nosso formulário HTML.

O resultado das multiplicações será guardado na variável $fatorial. ⚠️ Atenção: Diferente de somas, onde inicializamos variáveis com 0, na multiplicação precisamos iniciar a variável $fatorial com 1. Se iniciarmos com zero, qualquer multiplicação por zero será zero, e nosso script falharia!

Por fim, usaremos uma variável de controle chamada $count, que começará em 1 e irá até o valor de $n, aumentando de um em um.

1. Cálculo de Fatorial usando o laço WHILE

Nesta abordagem, o laço WHILE (enquanto) verifica a condição antes de executar o bloco. Adicionamos a função intval() para garantir a segurança dos dados recebidos.

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Fatorial com WHILE - PHP Progressivo</title>
</head>
<body>
    <form action="" method="get">
        <label for="number">Fatorial de:</label>
        <input type="number" name="number" id="number" min="0" required />
        <input type="submit" value="Calcular" />
    </form> 

    <?php 
    if (isset($_GET['number'])) {
        $n = intval($_GET['number']);
        $fatorial = 1;
        $count = 1;
        
        while ($count <= $n) {
            $fatorial *= $count; // Equivalente a: $fatorial = $fatorial * $count;
            $count++;
        } 
        
        echo "<h3>O fatorial de $n é: $fatorial</h3>";
    }
    ?>
</body>
</html>

Estude com a Melhor Didática 🚀

Adquira a Apostila PHP Progressivo e tenha o conteúdo do site organizado em PDF. Ideal para quem quer aprender lógica e programação sem distrações.

Baixar Apostila (PDF)

2. Cálculo de Fatorial usando o laço FOR

Muitos programadores preferem usar o laço FOR para este tipo de problema matemático. O motivo? Ele é mais compacto e permite declarar a variável de controle, a condição de parada e o incremento na mesma linha de código.

<?php 
// Assumindo que o formulário HTML já existe acima
if (isset($_GET['number'])) {
    $n = intval($_GET['number']);
    $fatorial = 1;
    
    // O laço FOR agrupa a inicialização, a condição e o incremento
    for ($count = 1; $count <= $n; $count++) {
        $fatorial *= $count;
    }
    
    echo "<h3>O fatorial de $n é: $fatorial</h3>";
}
?>

3. Desafio: Consegue resolver usando DO WHILE?

O laço do while é ligeiramente diferente, pois ele executa o bloco de código pelo menos uma vez antes de verificar a condição. Veja como fica a solução para gerar o nosso fatorial:

<?php 
if (isset($_GET['number'])) {
    $n = intval($_GET['number']);
    $fatorial = 1;
    $count = 1;
    
    // Tratativa especial: se for 0!, o fatorial é 1 e pulamos o laço
    if ($n > 0) {
        do {
            $fatorial *= $count;
            $count++;
        } while ($count <= $n);
    }
    
    echo "<h3>O fatorial de $n (usando Do While) é: $fatorial</h3>";
}
?>

🛠️ Dica de Mestre: Note que, no do while, precisamos fazer uma verificação extra com if ($n > 0). Como o bloco do é executado antes da verificação, se o usuário digitasse 0, o script multiplicaria o fatorial e incrementaria a variável desnecessariamente. Dominar essas pequenas diferenças lógicas é o que separa um iniciante de um programador sênior!

Como Criar a Sequência de Fibonacci em PHP: Passo a Passo com Laços

O que você vai aprender neste tutorial

  • O que é a famosa Sequência de Fibonacci e como ela funciona.
  • Como estruturar a lógica de troca de variáveis (atual, último e penúltimo).
  • Como criar um script PHP moderno usando o laço de repetição for para gerar a série dinamicamente a partir da entrada do usuário.

O que é a Sequência de Fibonacci?

A sequência de Fibonacci é uma sucessão numérica infinita onde os dois primeiros termos são 0 e 1, e cada número subsequente é calculado pela soma dos dois números imediatamente anteriores a ele.

Essa é, sem dúvida, uma das questões de lógica de programação mais cobradas em entrevistas de emprego para desenvolvedores juniores. Entender como construí-la usando laços de repetição (como o laço FOR ou WHILE) é um divisor de águas no seu aprendizado de algoritmos.

Vamos visualizar a formação da série na prática:

  • Termo 1 = 0
  • Termo 2 = 1
  • Termo 3 = 1 + 0 = 1
  • Termo 4 = 1 + 1 = 2
  • Termo 5 = 2 + 1 = 3
  • Termo 6 = 3 + 2 = 5
  • ...e assim por diante.

💡 Curiosidade: A série de Fibonacci não vive apenas nos computadores. Ela possui proporções matemáticas fascinantes que aparecem frequentemente na natureza, desde a disposição das pétalas de uma flor até espirais de galáxias. Vale a leitura na Wikipédia sobre a Sequência de Fibonacci.

Como Fazer a Série de Fibonacci com Laços em PHP

Para transformarmos essa matemática em código PHP, precisamos que o usuário nos diga quantos termos ele quer ver. Inicialmente, sempre exibimos o 0 e o 1. Portanto, o usuário precisa digitar um número maior que 2 para a brincadeira fazer sentido.

A Lógica das Variáveis

Nós vamos utilizar três variáveis fundamentais para fazer o script "lembrar" dos números passados:

  • $atual - Vai armazenar o número atual que está sendo calculado.
  • $ultimo - Armazena o último número gerado pela série.
  • $penultimo - Armazena o número que veio antes do último.

O estado inicial delas, antes do laço começar, será:

$ultimo = 1;
$penultimo = 0;

Dentro do nosso laço, a mágica acontece nesta ordem exata:

  1. Calculamos o próximo número: $atual = $ultimo + $penultimo;
  2. Imprimimos o valor de $atual.
  3. O pulo do gato: Atualizamos as variáveis para a próxima rodada do laço. O antigo $ultimo passa a ser o $penultimo, e o $atual recém-calculado vira o novo $ultimo.

A Lógica está travando sua evolução? 🧠

Se você teve que ler a explicação das variáveis duas vezes, não se preocupe, é normal! A melhor forma de fixar algoritmos como o de Fibonacci é treinando offline, sem distrações. Baixe o Mega Pack Projeto Progressivo e tenha acesso vitalício a centenas de exercícios resolvidos passo a passo em PHP, JS, Python e mais.

Ver o Conteúdo do Mega Pack Completo

Código Completo: Gerador de Fibonacci em PHP

Abaixo, temos o código HTML para o formulário e o script PHP atualizado. Utilizamos a função intval() e o operador ?? para garantir que o código seja seguro e não gere erros no seu servidor moderno.

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Gerador de Fibonacci - PHP Progressivo</title>
</head>
<body>
    <h2>Calculadora da Sequência de Fibonacci</h2>
    <form action="" method="get">
        <label for="number">Exibir até qual termo (maior que 2):</label><br>
        <input type="number" name="number" id="number" min="3" required />
        <input type="submit" value="Calcular" />
    </form> 
    <hr>

    <?php 
    // Verifica se o usuário enviou o número pelo formulário
    if (isset($_GET['number'])) {
        // Captura o valor, garantindo que seja um número inteiro seguro
        $n = intval($_GET['number']);
        
        // Verifica se o número atende ao requisito mínimo
        if ($n > 2) {
            $ultimo = 1;
            $penultimo = 0;
            
            echo "<h3>Os primeiros $n termos são:</h3>";
            // Exibe os dois primeiros termos fixos
            echo "0 <br> 1 <br>";
            
            // O laço começa em 1 e vai até $n - 2 (pois já exibimos 2 termos)
            for ($count = 1; $count <= $n - 2; $count++) {
                
                // Regra de negócio do Fibonacci
                $atual = $ultimo + $penultimo;
                echo $atual . "<br>";
                
                // Atualização de variáveis para a próxima iteração
                $penultimo = $ultimo;
                $ultimo = $atual;
            }
        } else {
            echo "<p style='color:red;'>Por favor, insira um número maior que 2.</p>";
        }
    }
    ?>
</body>
</html>

⚠️ Atenção ao detalhe técnico: Nossa variável de controle do for vai de 1 até $n - 2. Subtraímos dois do total justamente porque já imprimimos o 0 e o 1 manualmente fora do laço. Se não fizéssemos isso, a sequência teria dois números a mais do que o usuário pediu!

Potenciação em PHP: Como calcular potência com Laços e a função pow()

💡 O que você vai aprender:

Como calcular a potência de um número no PHP? Neste tutorial, você verá três formas: a lógica manual com laços de repetição (essencial para treinar o raciocínio), o uso da função nativa pow() e o operador de exponenciação moderno **.

A potenciação é uma operação matemática básica onde multiplicamos uma base por ela mesma tantas vezes quanto indicar o expoente. No PHP, existem diversas formas de realizar esse cálculo, desde o controle total via loops até funções de alto nível.

Como funciona a Potenciação?

Para calcular a potência de um número no PHP de forma direta, usamos a função pow($base, $expoente) ou o operador ** (ex: $base ** $expoente). Mas antes de usar os atalhos, entender a lógica por trás é o que diferencia um digitador de código de um programador real.

Potenciação em PHP: Base e Expoente

Exemplo: 5⁴ significa 5 multiplicado por ele mesmo 4 vezes (5x5x5x5 = 625).

Cálculo de Potência usando Laços (While, Do While e For)

Se você estiver em uma entrevista técnica e pedirem para calcular a potência sem usar funções prontas, você usará os loops. A ideia é começar com um resultado igual a 1 e multiplicá-lo pela base repetidamente.


<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Potenciação Manual no PHP</title>
</head>
<body>
    <form action="" method="get">
        Base: <input type="number" name="base" required /><br><br>
        Expoente: <input type="number" name="expoente" required /><br><br>
        <input type="submit" value="Calcular" />
    </form>

<?php
$base = $_GET['base'] ?? null;
$exp = $_GET['expoente'] ?? null;

if ($base !== null && $exp !== null) {
    // 1. Usando WHILE
    $resultadoWhile = 1;
    $count = 1;
    while($count <= $exp) {
        $resultadoWhile *= $base;
        $count++;
    }
    echo "Resultado com WHILE: $resultadoWhile <br>";

    // 2. Usando FOR (Mais limpo)
    $resultadoFor = 1;
    for($i = 1; $i <= $exp; $i++) {
        $resultadoFor *= $base;
    }
    echo "Resultado com FOR: $resultadoFor <br>";
}
?>
</body>
</html>

Domine a Programação em 2026 🚀

Aprenda PHP, JS, Python, Java, C, C++ e HTML com o material didático mais completo da internet. Do zero ao Full-Stack.

Quero meu Mega Pack!

Métodos Nativos do PHP: pow() e Exponenciação (**)

Embora aprender com laços seja importante para a faculdade ou lógica básica, no dia a dia usamos as ferramentas da linguagem. Se você precisar trabalhar com números decimais (ex: 1.5 elevado a 2.3), os laços manuais ficam muito complexos. É aí que entram as funções nativas:

A função pow()

Antigamente, era a forma padrão. Ela aceita dois parâmetros e retorna o resultado, lidando bem com números do tipo float.


$resultado = pow(5, 2); // Retorna 25

O Operador de Exponenciação (Moderno)

Introduzido no PHP 5.6 e padrão absoluto hoje em dia, o operador ** é muito mais intuitivo e rápido.


$resultado = 5 ** 2; // Retorna 25
$cubo = 2 ** 3;    // Retorna 8

🛠️ Curiosidade: O operador ** tem precedência sobre outros operadores matemáticos, o que significa que ele é calculado antes de somas ou subtrações na maioria dos casos!

⚠️ Atenção: Se você estiver estudando para certificações ou concursos, pratique a lógica com laços. Para projetos reais e freelances, use sempre o operador ** pelo desempenho e clareza.


Como Achar o Maior Número, Soma e Média em PHP (Exercícios Resolvidos)

🚀 O que você vai aprender hoje:

Como encontrar o maior número, a soma e a média em PHP? A lógica consiste em assumir que o primeiro número é o "maior" e compará-lo um a um com os demais. Para a soma, acumulamos os valores e, para a média, dividimos o total pela quantidade de itens.

  • Algoritmo clássico de comparação (If/Else).
  • Cálculo de Média Aritmética no Back-end.
  • Bônus Sênior: Como resolver o mesmo problema em 1 linha usando Arrays e funções modernas.

Fala, dev! Chegou a hora de afiar a lógica de programação. Vamos resolver juntos as questões 07 e 08 da nossa famosa lista de exercícios de laços em PHP.

Desafio 07: Faça um programa que leia 5 números e informe o maior número.

Desafio 08: Faça um programa que leia 5 números e informe a soma e a média dos números.

A Lógica Clássica (Passo a Passo para Iniciantes)

Para descobrirmos qual é o maior número de uma lista sem usar funções prontas, nós usamos uma técnica de "Rei da Colina". Funciona assim:

  1. Nós pegamos o primeiro número e dizemos: "Você é o maior número (o Rei) provisoriamente" ($maior = $n1;).
  2. Depois, olhamos para o segundo número. Ele é maior que o nosso "Rei"? Se for, ele toma a coroa ($maior = $n2;).
  3. Repetimos isso até o quinto número. Quem sobrar na variável $maior no final, é o vencedor absoluto.

Para a Soma e a Média, a matemática é simples e direta: somamos todos e dividimos por 5.

O Código: Resolvendo na Força Bruta

Abaixo está o script completo. Note que adicionamos o operador ?? (Coalescência Nula) para evitar erros caso o usuário acesse a página sem enviar o formulário.


<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Maior, Soma e Média em PHP</title>
</head>
<body>

<h3>Analisador de Números</h3>
<form action="" method="get">
    Número 1: <input type="number" step="any" name="n1" required><br><br>
    Número 2: <input type="number" step="any" name="n2" required><br><br>
    Número 3: <input type="number" step="any" name="n3" required><br><br>
    Número 4: <input type="number" step="any" name="n4" required><br><br>
    Número 5: <input type="number" step="any" name="n5" required><br><br>
    <input type="submit" value="Analisar Dados">
</form>
<hr>

<?php
// Só processa se o formulário for enviado
if (isset($_GET['n1'])) {
    
    // Captura os dados com segurança
    $n1 = (float) $_GET['n1'];
    $n2 = (float) $_GET['n2'];
    $n3 = (float) $_GET['n3'];
    $n4 = (float) $_GET['n4'];
    $n5 = (float) $_GET['n5'];

    // 1. Encontrando o Maior
    $maior = $n1;
    if($n2 > $maior) $maior = $n2;
    if($n3 > $maior) $maior = $n3;
    if($n4 > $maior) $maior = $n4;
    if($n5 > $maior) $maior = $n5;
    
    echo "<strong>O maior número é:</strong> {$maior} <br>";

    // 2. Calculando a Soma
    $soma = $n1 + $n2 + $n3 + $n4 + $n5;
    echo "<strong>A soma total é:</strong> {$soma} <br>";

    // 3. Calculando a Média
    $media = $soma / 5;
    echo "<strong>A média aritmética é:</strong> {$media} <br>";
}
?>

</body>
</html>

Chega de escrever código repetitivo! ⚡

A lógica bruta ensina, mas o mercado exige produtividade. Se você quer dominar as melhores práticas, atalhos profissionais e se tornar um Desenvolvedor Full-Stack respeitado, conheça o nosso Mega Pack com 7 Apostilas.

Inclui: PHP, JavaScript, Python, Java, C, C++ e HTML/CSS.

Quero Dominar Todas as Linguagens 🚀

O Padrão 2026: Resolvendo com Arrays e Funções Nativas

O código acima funciona perfeitamente e é excelente para você treinar a sua lógica manual. Mas, no mundo real corporativo, se um programador Sênior ver você declarando 5 variáveis e fazendo 4 ifs seguidos, ele vai mandar você refatorar.

O PHP possui funções nativas poderosas. Veja como resolveríamos o mesmo problema agrupando os números em um ARRAYS EM PHP:


<?php
// Cria um Array (Lista) com os números recebidos
$numeros = [$n1, $n2, $n3, $n4, $n5];

// max() encontra o maior valor do Array automaticamente
$maior = max($numeros); 

// array_sum() soma todos os itens da lista
$soma = array_sum($numeros); 

// count() conta quantos itens existem, garantindo a média correta
$media = $soma / count($numeros); 

echo "Maior: {$maior} | Soma: {$soma} | Média: {$media}";
?>

Percebeu a diferença? O código ficou muito menor, mais limpo e infinitamente mais fácil de manter. Se amanhã o cliente pedir para analisar 100 números em vez de 5, o segundo código continua exatamente o mesmo, enquanto no primeiro você teria que digitar 99 ifs!


🎓 Valide sua Lógica de Programação!

Mostre para as empresas que você domina a estruturação de algoritmos e o ecossistema PHP. Ao finalizar seus estudos, garanta a sua certificação oficial.

Curso de PHP com certificado online Obter meu certificado!

Laços de Repetição em PHP: Resolvendo o Exercício de Crescimento Populacional

🎯 O que você vai aprender neste exercício:

  • Como usar formulários HTML para enviar dados dinâmicos via GET.
  • A aplicação prática de um Laço de Repetição (While) em cálculos matemáticos contínuos.
  • Prevenção de Bugs: Como validar dados para impedir que seu servidor trave com um Loop Infinito.

Fala, dev! Se você está estudando programação, com certeza já esbarrou em algum desafio de matemática aplicada. Hoje, vamos resolver o famoso Exercício 05 da nossa lista de Laços de Repetição.

A premissa é simples: temos duas cidades (A e B). A cidade A tem uma população menor, mas cresce mais rápido que a cidade B. O usuário vai informar a população e a taxa de crescimento de ambas. Nosso script em PHP precisa calcular em quantos anos a cidade A vai ultrapassar ou igualar a cidade B.

O que são Laços de Repetição no PHP?

Laços de repetição (como while, do...while e for) são estruturas no PHP que permitem executar um bloco de código repetidas vezes enquanto uma condição específica for verdadeira. Neste exercício, o código continuará calculando a nova população ano a ano "enquanto" (while) a população de A for menor que a de B.

Para entender profundamente a teoria antes da prática, recomendo revisar nossa aula sobre LAÇO WHILE E DO-WHILE.

A Lógica do Algoritmo (Evitando desastres)

Antes de sair digitando código, vamos pensar como um Desenvolvedor Sênior. O cálculo base para o fim do primeiro ano é:

  • $A = $A * (1 + $taxa_A_decimal);
  • $B = $B * (1 + $taxa_B_decimal);

Lembrando que o usuário digita a taxa em porcentagem (ex: 3%), então precisamos dividir esse valor por 100 para obter o decimal (0.03) antes de somar.

⚠️ Atenção ao Loop Infinito: Se o usuário disser que a Cidade A cresce a 1% e a Cidade B cresce a 5%, a cidade A nunca vai alcançar a B. Se não validarmos isso, o PHP vai rodar o laço para sempre até derrubar o seu servidor. Nós adicionamos uma trava de segurança no código moderno abaixo para evitar isso!

Apostila Completa PHP Progressivo

Chega de travar na hora de criar a lógica! 🧠

O segredo dos grandes programadores não é decorar comandos, é resolver problemas. Nossa Apostila PHP Progressivo contém dezenas de listas de exercícios resolvidos e explicados passo a passo, exatamente como este. Estude offline, no seu tempo, e construa uma base sólida de lógica.

Baixar a Apostila em PDF agora 📥

O Código Completo (Padrão PHP 8.x)

Abaixo temos a solução atualizada. Diferente de tutoriais antigos, aqui usamos o operador de coalescência nula (??) para capturar os dados do formulário com segurança, sem gerar avisos (warnings) na tela.


<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Cálculo Populacional - Programação Progressiva</title>
</head>
<body>

<h3>Calculadora de Crescimento Populacional</h3>
<form action="" method="get" style="margin-bottom: 20px;">
    <label>População da cidade A:</label><br>
    <input type="number" name="A" required /><br><br>
    
    <label>População da cidade B:</label><br>
    <input type="number" name="B" required /><br><br>
    
    <label>Taxa de crescimento da cidade A (em %):</label><br>
    <input type="number" step="0.01" name="tA" required /><br><br>
    
    <label>Taxa de crescimento da cidade B (em %):</label><br>
    <input type="number" step="0.01" name="tB" required /><br><br>
    
    <input type="submit" value="Calcular" style="padding: 8px 15px; cursor: pointer;" />
</form>

<?php
// Captura os dados com segurança (PHP 7+)
$A = $_GET['A'] ?? null;
$B = $_GET['B'] ?? null;
$tA = $_GET['tA'] ?? null;
$tB = $_GET['tB'] ?? null;

// Só executa se o formulário foi enviado
if ($A !== null && $B !== null && $tA !== null && $tB !== null) {
    
    // VALIDAÇÃO: Evitando o loop infinito e inconsistências
    if ($A >= $B) {
        echo "<p style='color: red;'>A população de A já é maior ou igual a B!</p>";
    } elseif ($tA <= $tB) {
        echo "<p style='color: red;'>Erro Lógico: A taxa de crescimento de A deve ser maior que a de B, senão nunca a alcançará!</p>";
    } elseif ($A < 0 || $B < 0) {
        echo "<p style='color: red;'>Não existem populações negativas!</p>";
    } else {
        $count = 0;
        
        // Converte a porcentagem para decimal
        $tA /= 100;
        $tB /= 100;
        
        echo "<div style='max-height: 200px; overflow-y: auto; background: #eee; padding: 10px; border: 1px solid #ccc;'>";
        
        // O Laço: Enquanto A for menor que B
        while ($A < $B) {
            $A += ($A * $tA);
            $B += ($B * $tB);
            $count++;
            
            // Usamos round() para exibir números inteiros de habitantes
            echo "Ano {$count} - Pop. A: " . round($A) . " | Pop. B: " . round($B) . "<br>";
        }
        
        echo "</div>";
        echo "<h3 style='color: green;'>✔️ Em {$count} anos a população de A ultrapassa/iguala a de B!</h3>";
    }
}
?>

</body>
</html>

Melhorias implementadas nesta versão:

  • Trocamos o do...while antigo por um while clássico, que é mais legível para este tipo de cálculo.
  • Adicionamos uma <div> com barra de rolagem (scroll) para exibir a evolução ano a ano sem quebrar o layout do seu site, caso a conta demore 150 anos.
  • A validação agora barra valores negativos e lógicas que travam o processador.

🔥 Quer mergulhar de cabeça em TODAS as linguagens?
Se você quer aprender não apenas PHP, mas dominar o front-end e back-end por completo, conheça o nosso Mega Pack com 7 Apostilas de Programação (HTML, JS, PHP, C, Java, Python). É o arsenal definitivo do desenvolvedor Full-Stack.