¿Cómo puedo Mostrar HTML Estático Después de que yo he Utilizado die() en un Bloque en PHP?

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

  •  08-07-2019
  •  | 
  •  

Pregunta

Digamos que tengo algo de código como este:

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

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

Espero que el propósito de este código es sencillo.Si una determinada condición se cumple (es decir, no se puede conectar a la base de datos), entonces el programa debe morir, pero en caso contrario se debe ejecutar.Mi problema surge cuando el die() se ejecuta la función.Deja de derecho allí, y sólo envía las primeras tres líneas para el navegador, pero no en las dos últimas líneas.

Hay una función que puedo usar en vez de morir() para que el php trozos detendrá la ejecución, pero el HTML estático, el texto es enviado a través de?

¿Fue útil?

Solución

Debería separar su encabezado y pie de página en archivos y funciones separados. Esto hace que la interfaz de usuario sea mucho más fácil de mantener y mantiene las cosas consistentes para representar la vista. Combina eso con el uso de Manejo de excepciones y eres dorado.

<?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

?>

Otros consejos

Desacoplar la lógica de su programa de la presentación. Lea sobre MVC, plantillas.

En forma más simple es así:

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

presentation(logic());



Para otros casos, donde die() o algo así es inevitable (por ejemplo, error fatal o muerte de código de terceros), hay un truco que involucra al controlador de salida:

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

Aunque recomiendo usar eso solo para fines de diagnóstico / depuración.

Pase el dado un parámetro del texto estático.

Por ejemplo, cambie esto:

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

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

A esto:

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

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

Probablemente usaría excepciones. Envuelva todo en un bloque try / catch, luego arroje una nueva excepción en una condición de error como una falla de la base de datos. No podría hacer nada en el bloque catch (como un método de troquel vacío), pero sería mejor presentar un mensaje de error al usuario aquí.

Aquí hay una muy buena guía sobre el manejo de excepciones en PHP5 en caso de que no está familiarizado con ellos o necesita repasar lo que ha cambiado desde PHP4.

Has mirado en el uso de register_shutdown_function (php.net) para terminar de cargar la página?Debe ser capaz de manejar die() y exit().

Si observa la documentación de PHP verá que " Equivalente a exit () " - es decir, llamarlo finaliza su programa y realmente no le da muchas oportunidades de hacer nada. Incluso fuera de ZF, no hay mucho que puedas hacer cuando una aplicación muere () s. La solución es usar Excepciones.

Una excepción no detectada es esencialmente lo mismo que un dado () (aparte del seguimiento de pila que se genera). Lo que le ofrece una excepción es la capacidad de ponerlo en un bloque try / catch, que le da la oportunidad de corregir el error y continuar con el programa (o mostrar un mensaje de error amigable y generar un registro). Suponiendo que está usando Zend_Controller_Front, puede consultar el Inicio rápido de Zend Framework para ver cómo funcionan un controlador de errores predeterminado que detectará las excepciones no detectadas y mostrará un mensaje de error apropiado.

Un método, que funciona pero no es exactamente lo que estoy buscando, sería reemplazar die() con die("</body></html>"). Si el texto a devolver fuera más complicado que eso, podría, por ejemplo, almacenarse en una variable. ¿Hay algo mejor que esto?

die() podría no ser exactamente lo que quiere aquí. ¿Por qué no reemplazar

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

con

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

o lanzar / atrapar una excepción?

Si está trabajando con PHP4, o simplemente no quiere molestarse con excepciones, entonces podría usar esta técnica:

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

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

... aunque algunas personas parecen bastante opuestas a usar este estilo, comentaron adecuadamente, no veo ningún problema con él. Yo diría que es mucho mejor que duplicar su & "; Pie de página &"; código en cada una de sus declaraciones die ().

<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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top