PHP é à quinta-feira – Redireccionar com ou sem espera

16 Comentários

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 = "http://www.pplware.com/";
	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.

Comentários

16

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *

  1. Avatar de Bónus

    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?

    1. Avatar de DreamWave
      DreamWave

      @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.

      1. Avatar de DreamWave
        DreamWave

        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 😀 ]

      2. Avatar de Bruno Bernardino

        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 😉

        1. Avatar de Bónus

          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.

          1. Avatar de Bónus

            Oops, o WordPress “comeu” o código.

          2. Avatar de Bruno Bernardino

            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 🙂

          3. Avatar de Bónus

            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..)

        2. Avatar de DreamWave
          DreamWave

          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)

          1. Avatar de Bónus

            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. 😉

  2. Avatar de CarlosMC
    CarlosMC

    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.

    1. Avatar de Mrodrigues
      Mrodrigues

      Isso e usado pela “concorrência” acho este método muito mais limpo…

      1. Avatar de CarlosMC
        CarlosMC

        O que é que ser usado pela “concorrência” tem a ver com qq seja?

  3. Avatar de softclean
    softclean

    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.

  4. Avatar de Joao
    Joao

    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

    1. Avatar de Bruno Bernardino

      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.