Ir para conteúdo
Fórum Script Brasil
  • 0

<!DOCTYPE html>


Frank K Hosaka

Pergunta

Essa semana passei várias horas na frente do micro, tentando escrever <!DOCTYPE html> no topo do meu projeto PHP, mas eu ainda não consegui. A minha ideia era separar CSS, JavaScript, <form>, <div>, cada um em seu lugar. Quase que entrei em desespero, o micro simplesmente travou, alegando Cannot modify header information, ou seja, eu não posso mais usar o comando header("location:pagina.php"); mais de uma vez.

Eu fiquei bastante mordido, eu senti que perdi dois anos da minha vida para nada, mas o meu instinto de fazer gambiarra falou mais alto. Ele disse para eu usar o JavaScript ao invés do PHP,  e assim eu criei o comando echo "<script>window.replace('pagina.php')</script>";, ou seja, fiz um código JavaScript bem no meio do PHP e isso torna impossível a tarefa de separar o joio do trigo.

No meio do meu desmoronamento digital, eu encontrei um belo código em JavaScript

var lçto = "";
var descrição = "";
function lançar(id,jd) {lçto=id; descrição=jd; divmodal2.style.display="block";};
function registro(id,jd) {divmodal2.style.display="none"; eleconta = document.getElementById(lçto);
	eledescrição = document.getElementById(descrição); eleconta.value=id; eledescrição.innerHTML=jd;} 

Essa é a mais bela gambiarra que eu já inventei, ele coloca no formulário do lançamento contábil a conta e a descrição da conta selecionada do plano de contas que aparece numa janela modal. Eu não quero perder isso, assim a minha ideia de separar as coisas vou ter que deixar para depois. É claro que o navegador não vai colocar no topo da página <!DOCTYPE html>, se eu não resolver o problema da organização, do HTTP Caching, ou seja, vou ter que negligenciar as notificações do navegador.

Eu não posso passar o resto da minha vida de braços cruzados. Esse é um sonho de 1999, o de conectar um computador de bolso no banco de dados de um computador de mesa. O meu novo sonho em 2022 é usar o celular e o notebook ao mesmo tempo. Por enquanto, eu não faço a menor ideia de como fazer isso. Já fazer o navegador aceitar a primeira diretriz do HTML no topo da página é uma surpresa que nunca imaginei que iria enfrentar.

Link para o comentário
Compartilhar em outros sites

2 respostass a esta questão

Posts Recomendados

  • 1

Bom dia Sr. @Frank K Hosaka!

1 hora atrás, Frank K Hosaka disse:

header("location:pagina.php");

Uma vez eviado um cabeçalho(header) para o browser, ele não pode mais ser alterado.

O que envia um cabeçalho para o browser?
Lembre-se de que o php é uma linguagem server-side. Php não chega ao browser (o browser não interpreta php).
Se o php entregar um único caractere sequer ao browser, um cabeçalho automágico vai junto.
Se entregar um espaço em branco, ou qualquer caractere invisível, um cabeçalho vai junto.

Portanto, separar as responsabilidades é muito importante num projeto que se deseja o mínimo de escalabilidade e manutenibilidade.

Faça com que todo o php(a lógica server-side) aconteça primeiro e somente depois, entregue algo ao browser.

O que é entregar algo ao browser?
Veja esse trecho:
 <?php
if(...
...
...
...
header('Location...

Nenhum olhar desatento percebeu, mas há um espaço antes da tag de abertura do php:
image.png.27e3f174c3149c7e379e0c79c40530a0.png
Bem ali.
Aquele espaço foi entregue ao browser antes de qualquer php ser interpretado no servidor.

Outra forma:
<?
if(...
...
echo ...
...
header('Location...

Neste não há espaço antes de se abrir a tag php
mas há um echo acontecendo antes do header('Location...
Dessa forma, consideramos que o echo já entregou algo ao browser.
Assim, header('Location... não poderá mais alterar o cabeçalho já existente.

O sr. pode ler mais em: https://www.php.net/manual/en/function.header.php
image.thumb.png.8e1e1e67f39100593d8c0f548c6598dc.png

Link para o comentário
Compartilhar em outros sites

  • 0

Obrigado pela resposta.

Eu ainda estou bem longe de entender a diferença entre o servidor e o cliente, mas consegui ajuntar um monte de estilo, um monte de função em JavaScript, um monte de <form>, um monte de <div>, num só arquivo, e agora consigo ver <!DOCTYPE html> no topo da tela de inspeção do navegador, claro que precisei do comando do JavaScript "location.replace(mesmapagina.php)".

Ao invés de ter um monte de arquivo php, cada um fazendo coisas diferentes, eu decidi executar o máximo de tarefas diferentes dentro de um só arquivo. Mas, para isso, eu precisei mandar um monte de POST para a mesma página, e o POST setado é que que determinava que tarefa executar. Só achei estranho só agora o PHP reclamar comigo, justamente quando decidi organizar os meus códigos.

Mas graças a esse episódio, eu gostei demais do "location.replace" do JavaScript. Ele limpa o cabeçalho, e não permite você voltar na página anterior. Estou pensando seriamente usar esse recurso para me livrar da mensagem da ausência de cache-control, mas isso vou ver com o tempo.

Graças a Deus, tudo está funcionando como eu esperava. Hoje, comecei uma nova fase do meu projeto. Liberei parte do projeto para o meu irmão brincar no Motorola G-22. O meu projeto é monousuário. Vou ficar bem feliz se conseguir fazer o meu projeto ficar biusuário até a metade de 2024.

Agradeço suas orientações, mas botar na prática é bem complicado, isso requer uma baita disciplina nipônica, e isso eu não tenho, só herdei os olhos rasgados.

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,4k
×
×
  • Criar Novo...