PHP é à quinta-feira – Redireccionar com ou sem espera
Boas. A nível de direitos sobre o código, devo-vos remeter para o meu primeiro artigo desta rubrica.
Hoje tenho para vocês uma função novamente simples mas de utilidade extrema, cujo objectivo é redireccionar o utilizador para outra página (dentro ou não do mesmo site), com ou sem compasso de espera.
<?php function goTo($url = "",$seconds = 0) { $config_url = "https://pplware.sapo.pt/"; if (empty($url)) $url = $config_url; if (!is_numeric($seconds) || $seconds < 0) $seconds = 0; if ($seconds > 0) { header("Refresh: ".$seconds."; url=".$url); } else { header("Location: ".$url); } exit(); } ?>
Modo de utilização:
É bastante simples e intuitivo, segue um exemplo de como redireccionar para o blog imediatamente, para o fórum imediatamente e para o fórum com 3 segundos de espera.
<?php goTo(); $forumurl = “http://forum.pplware.com/”; goTo($forumurl);//-- Teria de se comentar o goTo(); acima goTo($forumurl,3);//-- Teria de se comentar o goTo(); e o goTo($forumurl); acima ?>
Nota: Nenhum código é executado depois desta função ser chamada pela primeira vez, pois tem o exit(), mas se comentarem no exemplo por ordem, verão a função a ser executada correctamente.
Qualquer dúvida ou sugestão, estão completamente à vontade.
Como vou entrar em exames, etc., se quiserem enviar as vossas propostas para esta rubrica, agradeço, pois será difícil escrevê-la até ao final de Julho.
Este artigo tem mais de um ano
Por vezes a função header não funciona, quando não é colocada no inicio do código php.
Qual a solução mais indicada para contornar esse problema?
@Bónus
Costumo utilizar esta funcção para “contornar” esse problema:
function redirect($url){
if (!headers_sent()){ /*If headers not sent yet… then do php redirect*/
if(@header(‘Location: ‘.$url)){
exit;
}
}else{ /*If headers are sent… do javascript redirect… if java disabled, do html redirect. In last case exit avoid further code execution*/
echo ”;
echo ‘window.location.href=”‘.$url.'”;’;
echo ”;
echo ”;
echo ”;
echo ”;
exit;
}
}
Mesmo que já saibas o porquê, deixo uma pequena explicação:
O problema que relatas deve-se a que já tenham sido enviados headers antes da chamada á funcção header() do php, seja o print de um caracter visivel ou não (ex. um expaço antes de <?php … )
Utilizando ob_start() e ob_end_flush() pode-se chegar a uma solução para isso, mas pode não ser sempre aplicável.
Cumpz.
Bem parece que o blog corta as tags :S
Fica aqui um print da função
http://tinypic.com/r/2vx2kas/5
[syntax highlight e tudo 😀 ]
Serve para contornar o problema sim senhor, mas o ideal é colocar a função “bem colocada” para não teres de te preocupar com isso 😉
Pois, mas muitas vezes necessito colocar o header depois de muitas linhas de código.
Quando não dá com o header, costumo fazer o redirect em html:
echo ”;
Mas não impede que o código continue a ser lido e o redirect não fica imediato como com o header.
Oops, o WordPress “comeu” o código.
Com a função que mostrei, ele faz o exit, ou seja, redirecciona logo.
Se mostras html antes disso, peço desculpa mas não é boa programação 🙂
Não. Não mostro html antes disso.
Uso é a tag de html para redireccionar logo após o php, quando não funciona com o header. (meta http-equiv=”Refresh” etc..)
Sem dúvida, nada como fazer as coisas como deve ser 😀
Na verdade a função apresentada, não ultrapassa literalmente o problema (dai as “aspas”) , já que se os headers já tiverem sido enviados apenas o redirect javascript ou meta irá ser executado, sendo estes menos fiáveis (cuidado com os utilizadores manhosos LOL)
Só agora vi a tua solução através do link que indicaste. Eu usava uma solução parecida, mas que ia directamente para html sem passar por javascript.
Também já me tinham falado da solução através do ob_start() como referes no teu comentário. Mas dizes que nem sempre é aplicável. Podes me explicar porquê?
Obrigado. 😉
OT:
Sistema de comentários para blogues:
http://intensedebate.com/
Aqui um exemplo:
http://deputy-dog.com/2009/06/6-extraordinarily-stubborn-nail-houses.html
Seria uma excelente adição para o pplware.
Isso e usado pela “concorrência” acho este método muito mais limpo…
O que é que ser usado pela “concorrência” tem a ver com qq seja?
Pois é, esta função goTO é preferível a redirects de Javascript e de HTML, como já disseram, e por mais duas razões sobre esses redirects “alternativos”:
– quebra o botão de retroceder (embora no Firefox se note uma melhoria a isso, visto que ignora a página de redirect
– não respeita os standards Web, porque não envia um código de redireccionamento do estilo 3xx (300 e tal), logo bots do Google e outros browser de texto como o links são capazes de não seguir os redirects e ficar naquela página.
E sim, se uma pessoa só consegue perceber a meio do código HTML que tem de redireccionar, então devia rever o esquema com que planeou o site, porque essa medida é incorrecta.
Olá!
Podem ajudar-me a entender porque é que no IE o redireccionamento após o preenchimento do form não é executado?
http://www.nordey.com/deco
Boa tarde João,
A melhor forma de obteres ajuda com problemas é colocares a tua dúvida no fórum.
De qualquer das formas, verifica que não estás a fazer output de qualquer html (ou mesmo espaços em branco) antes de aplicares o redirect.