Como posso exposição estática HTML depois que eu morrer usado () em um bloco PHP?

StackOverflow https://stackoverflow.com/questions/307322

  •  08-07-2019
  •  | 
  •  

Pergunta

Vamos dizer que eu tenho algum código como este:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

Espero que o propósito deste código é simples. Se uma determinada condição é satisfeita (ou seja, não pode se conectar ao banco de dados), então o programa deveria morrer, mas caso contrário ele deve ser executado. Meu problema surge quando a função die () é executado. Ele pára direito lá, e envia apenas as primeiras três linhas para o navegador, mas não as duas últimas linhas.

Existe uma funciton que eu posso usar em vez de die () para que os pedaços PHP irá parar a execução, mas o texto HTML estático ainda é enviada através?

Foi útil?

Solução

Você deve separar seu cabeçalho e rodapé em um arquivos e funções distintas. Isso faz com que a interface do usuário muito mais fácil de manter e mantém as coisas consistentes para renderizar a vista. Casal que, com o uso Exceção manipulação e você é ouro.

<?php

printHeader(); // outputs the html header
try
{
    if (some condition)
    {
        throw new Exception("It Died...");
    }
    // More processing here that should not execute if the above condition is true
    // ...
}
catch (Exception e)
{
    echo $e->getMessage();
}
printFooter(); // outputs the html footer

?>

Outras dicas

Dissociar a sua lógica do programa de apresentação. Leia sobre MVC, templates.

Na forma mais simples ele vai como que:

<?php
function logic() {
    if (!$someCondition) {
        return 'display_empty_page';
    } else {
        return 'display_other_stuff';
    }
}

presentation(logic());



Para outros casos, onde die() ou tal é inevitável (erro por exemplo fatal ou código do 3o partido morrendo), não há corte envolvendo manipulador de saída:

ob_start('myhandler'); 
function myhandler($page) {return $page.' extra markup';}
die();

Embora eu recomendo usar isso apenas para diagnóstico / fins de depuração.

Passe a morrer um parâmetro do texto estático.

Por exemplo mudança esta:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die();
}
else{
  #Do something
}
?>
</body>
<html>

Para isto:

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
  die("OMG RED ALERT!!!!</body></html>");
}
else{
  #Do something
}
?>
</body>
<html>

Eu provavelmente usar exceções. Enrole tudo em um bloco try / catch, em seguida, lançar uma nova exceção em uma condição de erro como uma falha de banco de dados. Você não podia fazer nada no bloco catch (como um método die empty ()), mas que seria melhor para apresentar uma mensagem de erro para o usuário aqui.

Aqui está um muito bom guia sobre manipulação de exceção em PHP5 no caso de você 'não está familiarizado com eles ou você precisa retocar sobre o que mudou desde PHP4.

Você já olhou em usar register_shutdown_function ( php.net) para terminar o carregamento da página? Deve ser capaz de lidar com die() e exit().

Se você olhar para a documentação PHP você verá que "Equivalente a exit ()" - ou seja, chamando-o de terminar o seu programa e realmente não lhe dar muita chance de fazer qualquer coisa. Mesmo fora da ZF, não há um lote inteiro que você pode fazer quando um dado aplicativo () s. A solução é Exceções de uso.

Uma exceção não capturada é essencialmente a mesma coisa que um die () (que não seja o rastreamento de pilha que é gerada). O que uma exceção lhe dá é a capacidade de colocá-lo em um bloco try / catch, dando-lhe a oportunidade de corrigir o erro e continuar com o programa (ou exibir uma mensagem de erro amigável e gerar um log). Supondo que você está usando Zend_Controller_Front, você pode conferir o Zend Framework Quickstart para ver como eles fazem um manipulador de erro padrão que vai pegar exceções.Ele e exibir uma mensagem de erro apropriada.

Um método que funciona, mas não é exatamente o que estou procurando, seria substituir die() com die("</body></html>"). Se o texto de retorno foram mais complicado do que isso, poderia, digamos, ser armazenado em uma variável. Existe alguma coisa melhor do que isso?

die() pode não ser exatamente o que você quer aqui. Por que não substituir

if (!$someCondition) { 
    die();
} else {
    /* do stuff */
}

com

if ($someCondition) {
    /* do stuff */
} else {
    /* output error message/redirect/output nothing/whatever */
}

ou lance / capturar uma exceção?

Se você está trabalhando com PHP4, ou simplesmente não querem se preocupar com exceções, então você pode usar esta técnica:

<html>
<head><title>Title</title></head>
<body>

<?php
do {
    if (!$someCondition){
          break;
    } else {
          #Do something
    }
} while (0);
?>
</body>
<html>

.. embora algumas pessoas parecem bastante vez de usar este estilo, comentou de forma adequada, não vejo qualquer problema com ele. Eu diria que é muito melhor do que duplicar o seu código "rodapé" em cada um de seus die () declarações.

<html>
<head><title>Title</title></head>
<body>

<?php
if (!$someCondition){
header ("location:error_page.php?erro_message='This error occured'");

  die();
}
else{
  #Do something
}
?>
</body>
<html>

error_page.php

header
echo $_GET[$error_message];
footer
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top