2011-01-15 9 views
5

Perdón por el título de sonido dramático, solo quería saber si hay una manera de evitar que todos los tipos de comandos PHP se ejecuten EXCEPTO uno.¿Hay una alternativa para morir?

Por ejemplo, ahora cuando elimino un script usando die() mis páginas se ven medio rotas porque la parte inferior del html de la página no se cargaba ya que se utilizaba la función include().

Entonces, ¿hay alguna manera de decirle a PHP "no permitir que se ejecuten más comandos excepto la función de inclusión"?

+1

Entonces quizás 'die()' no es el comando correcto para usar. ¿Cuál es el contexto? ¿Por qué tienes que matar el script en absoluto? –

+0

No, si es tu tiempo, simplemente tendrás que 'morir' ... Lo siento. :) En serio, parece que estás haciendo esto de la manera incorrecta. Simplemente no mates tu página mientras todavía está haciendo algo. ¡Utiliza un mejor manejo de errores! – deceze

+0

@Felix Kling Estoy eliminando la secuencia de comandos si el valor del parámetro GET es distinto a 3 valores predeterminados predeterminados por razones de seguridad. – TJDeatwiler

Respuesta

2

Necesitará utilizar un comando custom die(), como my_die() para incluir los archivos necesarios. No puede anular die() ni ninguna otra función le permitirá hacer lo que busca.

0

¿Por qué no puedes hacer esto?

if(something didn't work) { 
    include('footer.php'); 
    die(); 
} 

Si lo está usando con frecuencia, conviértalo en una función.

function finish_and_die($message) { 
    print $message; 
    include('footer.php'); 
    exit; 
} 
+0

no porque tengo más de 1 archivo de inclusión en varios niveles en la página y la parte de procesamiento está en el medio, no quiero tener que preocuparme por el pedido si hay otra forma. – TJDeatwiler

0

Usted podría intentar algo como:

if(is_secure($_GET['value'])) // Whatever you're using to check if the value is allowed 
{ 
    // Page content goes here 
} 

De esta manera, toda la otra incluye el procesamiento y el código de la página seguirá recibiendo llamada.

Alternativamente, si no es válido, genere una excepción y tenga un manejador de excepciones que sepa cómo completar el código de la página.

11

Puede utilizar return a "terminar" un archivo incluido, sin matar a todo el guión:

test1.php

<?php 
include 'test2.php'; 
echo 'foo'; 

test2.php

<?php 
echo 'bar'; 
return; 
echo 'baz'; 

Salidas:

barfoo 
+0

Manera útil de continuar el script. Solo maneja lo que te devuelva como quieras, gracias. – Andrew

-1

Si usa un enfoque OOP combinado con el almacenamiento en búferes de salida, esta es la forma de resolver el problema:

La clase Controller (donde va su lógica) tiene un miembro que es una instancia de la clase Template. clase El controlador dispone de un método __destruct, que hace que la plantilla de

cuando exit() o die() son llamados, se llama el método del objeto Controller __destruct, que a su vez llama al método del objeto Plantilla render.

+0

La lógica pertenece a los modelos, no a los controladores ... – netcoder

+1

La lógica de negocios pertenece a los controladores. Almacenamiento/Lógica de Datos pertenece a Modelos. La lógica de visualización pertenece a Vistas. – Stephen

+0

Curiosamente, así es como acabo de construir mi marco para representar plantillas. :) – Spechal

1

exit() detendrá la ejecución y ejecutará cualquier manejador de salida registrado.

Lanzar una excepción se levantará donde sea que esté el intento circundante. Si no hay ninguna prueba hasta el nivel superior, terminará toda la ejecución del script.

return at global scope volverá a salir del archivo de inclusión actual, a lo que haya incluido/requiera del archivo.

Personalmente, recomiendo un enfoque bien pensado para la entrega de excepciones y el uso de try/throw.

Cuestiones relacionadas