Comment puis-je afficher du code HTML statique après avoir utilisé die () dans un bloc PHP?

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

  •  08-07-2019
  •  | 
  •  

Question

Disons que j'ai un code comme celui-ci:

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

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

J'espère que le but de ce code est simple. Si une certaine condition est remplie (par exemple, impossible de se connecter à la base de données), le programme doit mourir, mais sinon il doit s'exécuter. Mon problème se pose lorsque la fonction die () est exécutée. Il arrête right , et n'envoie que les trois premières lignes au navigateur, mais pas les deux dernières.

Existe-t-il une fonction que je peux utiliser à la place de die () pour que les segments php cessent de s'exécuter, mais le texte HTML statique est toujours envoyé?

Était-ce utile?

La solution

Vous devriez séparer votre en-tête et votre pied de page en deux fichiers et fonctions distincts. Cela facilite grandement la maintenance de l'interface utilisateur et maintient la cohérence des éléments pour le rendu de la vue. Ajoutez à cela Gestion des exceptions et vous êtes en or.

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

?>

Autres conseils

Découplez la logique de votre programme de la présentation. Lisez à propos de MVC, modèles.

Sous sa forme la plus simple, ça se passe comme ça:

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

presentation(logic());


Dans les autres cas où die() ou tel est inévitable (par exemple, une erreur fatale ou la mort d'un code tiers), il existe un hack impliquant un gestionnaire de sortie:

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

Bien que je recommande de l'utiliser uniquement à des fins de diagnostic / débogage.

Passez le dé un paramètre du texte statique.

Par exemple, changez ceci:

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

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

À ceci:

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

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

J'utiliserais probablement des exceptions. Tout encapsuler dans un bloc try / catch, puis émettre une nouvelle exception en cas d'erreur, telle qu'une défaillance de la base de données. Vous ne pouvez rien faire dans le bloc catch (comme une méthode die () vide), mais il serait préférable de présenter un message d'erreur à l'utilisateur ici.

Voici un un très bon guide sur la gestion des exceptions en PHP5 au cas où ne les connaissez pas ou vous avez besoin de mettre à jour ce qui a changé depuis PHP4.

Avez-vous envisagé d'utiliser register_shutdown_function (php.net) pour finir de charger la page? Il devrait être capable de gérer die() et exit().

Si vous consultez la documentation sur PHP , vous verrez que & "Equivalent à" exit () " - C'est-à-dire que l'appel met fin à votre programme et ne vous donne pas vraiment une chance de faire quoi que ce soit. Même en dehors de ZF, vous ne pouvez pas faire grand chose quand une application meurt (s). La solution consiste à utiliser des exceptions.

Une exception non capturée est essentiellement la même chose qu'un die () (autre que la trace de pile générée). Une exception vous donne la possibilité de le placer dans un bloc try / catch, ce qui vous permet de corriger l’erreur et de poursuivre le programme (ou d’afficher un message d’erreur convivial et de générer un journal). En supposant que vous utilisez Zend_Controller_Front, vous pouvez consulter le Démarrage rapide de Zend Framework pour voir comment ils fonctionnent. un gestionnaire d'erreurs par défaut qui interceptera les exceptions non interceptées et affichera un message d'erreur approprié.

Une méthode qui fonctionne mais ne correspond pas exactement à ce que je recherche serait de remplacer die() par die("</body></html>"). Si le texte à retourner était plus compliqué que cela, il pourrait, par exemple, être stocké dans une variable. Y a-t-il quelque chose de mieux que ça?

die() n'est peut-être pas exactement ce que vous voulez ici. Pourquoi ne pas remplacer

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

avec

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

ou lancer / attraper une exception?

Si vous travaillez avec PHP4 ou si vous ne voulez pas vous soucier des exceptions, vous pouvez utiliser cette technique:

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

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

... bien que certaines personnes semblent assez opposées à l’utilisation de ce style, commentée de manière appropriée, je ne vois aucun problème avec cela. Je dirais que c'est beaucoup mieux que de dupliquer votre & "; Pied de page &"; code dans chacune de vos déclarations 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top