Come posso visualizzare HTML statico dopo aver usato die () in un blocco PHP?

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

  •  08-07-2019
  •  | 
  •  

Domanda

Diciamo che ho un codice come questo:

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

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

Spero che lo scopo di questo codice sia chiaro. Se viene soddisfatta una determinata condizione (ovvero non è possibile connettersi al database), il programma dovrebbe morire, ma altrimenti dovrebbe essere eseguito. Il mio problema sorge quando viene eseguita la funzione die (). Si ferma giusto e invia solo le prime tre righe al browser, ma non le ultime due.

Esiste una funzione che posso usare al posto di die () in modo che i blocchi php smettano di essere eseguiti, ma il testo HTML statico viene comunque inviato?

È stato utile?

Soluzione

Dovresti separare intestazione e piè di pagina in file e funzioni separati. Ciò rende l'interfaccia utente molto più semplice da mantenere e mantiene le cose coerenti per il rendering della vista. Abbinalo all'utilizzo di Gestione delle eccezioni e sei d'oro.

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

?>

Altri suggerimenti

Disaccoppia la logica del programma dalla presentazione. Leggi su MVC, modelli.

Nella forma più semplice va così:

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

presentation(logic());


Per altri casi, in cui die() o simili sono inevitabili (ad es. errore fatale o morte di codice di terze parti), esiste un hack che coinvolge il gestore di output:

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

Anche se consiglio di usarlo solo a scopo diagnostico / di debug.

Passa al dado un parametro del testo statico.

Ad esempio, cambia questo:

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

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

A questo:

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

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

Probabilmente userei le eccezioni. Avvolgere tutto in un blocco try / catch, quindi generare una nuova eccezione in una condizione di errore come un errore del database. Non potresti fare nulla nel blocco catch (come un metodo die () vuoto), ma sarebbe meglio presentare un messaggio di errore all'utente qui.

Ecco una guida abbastanza buona sulla gestione delle eccezioni in PHP5 nel caso tu non hai familiarità con loro o devi rispolverare ciò che è cambiato da PHP4.

Hai esaminato l'utilizzo di register_shutdown_function (php.net) per terminare il caricamento della pagina? Dovrebbe essere in grado di gestire die() e exit().

Se guardi la documentazione PHP vedrai che " Equivalente a & exit () quot; - vale a dire che chiamarlo termina il tuo programma e non ti dà davvero molte possibilità di fare nulla. Anche al di fuori di ZF, non c'è molto che puoi fare quando un'applicazione muore (). La soluzione è utilizzare le eccezioni.

Un'eccezione non rilevata è essenzialmente la stessa cosa di un die () (diverso dalla traccia dello stack che viene generata). Ciò che un'eccezione ti dà è la possibilità di inserirlo in un blocco try / catch, dandoti l'opportunità di correggere l'errore e continuare con il programma (o visualizzare un messaggio di errore amichevole e generare un registro). Supponendo che tu stia utilizzando Zend_Controller_Front, puoi controllare Zend Framework Quickstart per vedere come fanno un gestore di errori predefinito che rileverà eccezioni non rilevate e visualizzerà un messaggio di errore appropriato.

Un metodo, che funziona ma non è esattamente quello che sto cercando, sarebbe quello di sostituire die() con die("</body></html>"). Se il testo da restituire fosse più complicato di così, potrebbe, per esempio, essere memorizzato in una variabile. C'è qualcosa di meglio di questo?

die() potrebbe non essere esattamente quello che vuoi qui. Perché non sostituire

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

con

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

o lanciare / catturare un'eccezione?

Se stai lavorando con PHP4, o semplicemente non vuoi preoccuparti delle eccezioni, puoi usare questa tecnica:

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

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

.. anche se alcune persone sembrano piuttosto contrarie all'uso di questo stile, opportunamente commentato, non vedo alcun problema con esso. Direi che è molto meglio che duplicare il tuo & Quot; footer & Quot; codice in ciascuna delle tue dichiarazioni 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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top