كيف يمكنني عرض HTML ثابتة بعد لقد استعملت يموت() في PHP بلوك ؟

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

  •  08-07-2019
  •  | 
  •  

سؤال

دعونا نقول لدي بعض التعليمات البرمجية مثل هذا:

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

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

أتمنى أن الغرض من هذا القانون هو واضحة.إذا اجتمع شرط معين (أي لا يمكن الاتصال إلى قاعدة البيانات) ، ثم البرنامج يجب أن يموت, لكن على خلاف ذلك ينبغي أن تنفذ.مشكلتي تنشأ عندما يموت() يتم تنفيذ وظيفة.يتوقف صحيح هناك و يرسل فقط أول ثلاثة خطوط المتصفح ، ولكن ليس آخر سطرين.

هل هناك funciton التي يمكن استخدامها بدلا من يموت() بحيث php قطع سيتم إيقاف تنفيذ ، ولكن HTML ثابتة النص لا يزال إرسالها من خلال ؟

هل كانت مفيدة؟

المحلول

يجب أن يكون فصل رأس وتذييل الصفحة في ملفات منفصلة وظائف.وهذا يجعل واجهة المستخدم أسهل بكثير للحفاظ على ويبقي الأمور متسقة لتقديم عرض.الزوجين أن مع استخدام معالجة الاستثناء وكنت الذهبي.

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

?>

نصائح أخرى

فصل البرنامج المنطق من العرض.قرأت عن MVC, قوالب.

في أبسط شكل وغني عن مثل هذا:

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

presentation(logic());



في الحالات الأخرى ، حيث die() أو هذا أمر لا مفر منه (مثلا ، خطأ فادح أو 3rd الطرف رمز الموت) ، هناك هاك تشمل انتاج معالج:

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

على الرغم من أن أوصي باستخدام هذا فقط من أجل التشخيص/أغراض التصحيح.

تمر يموت معلمة من نص ثابت.

على سبيل المثال تغيير هذا:

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

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

إلى هذا:

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

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

ربما أود أن استخدام الاستثناءات.التفاف كل شيء في try / catch ثم رمي جديد استثناء في حالة خطأ مثل قاعدة البيانات فشل.هل يمكن أن تفعل شيئا في كتلة catch (مثل فارغة يموت (طريقة)), ولكن سيكون من الأفضل أن يقدم رسالة خطأ للمستخدم هنا.

هنا دليل جيد جدا على معالجة الاستثناء في PHP5 في حال كنت لم تكن مألوفة مع أو تحتاج إلى فرشاة على ماذا تغير منذ PHP4.

هل نظرت إلى استخدام register_shutdown_function (php.net) حتى انتهاء تحميل الصفحة ؟ يجب أن تكون قادرة على التعامل مع die() و exit().

إذا نظرتم PHP الوثائق سترى أن "أي ما يعادل exit()" - أي الدعوة ينهي البرنامج لا يعطيك فرصة أن تفعل أي شيء.حتى خارج ZF ، ليس هناك الكثير يمكنك القيام به عند تطبيق يموت()s.الحل هو استخدام الاستثناءات.

وهو غير مسك استثناء هو أساسا نفس الشيء كما يموت() (بخلاف تتبع المكدس التي يحصل إنشاؤها).ما استثناء يمنحك القدرة على وضعها في try/catch, مما يتيح لك الفرصة لتصحيح الخطأ على تواصل مع البرنامج (أو عرض رسالة الخطأ المألوفة وإنشاء سجل).على افتراض أنك تستخدم Zend_Controller_Front, يمكنك التحقق من الإطار زند التشغيل السريع لمعرفة كيفية جعل الافتراضي معالج الأخطاء التي سوف الصيد غير مسك الاستثناءات عرض رسالة خطأ مناسبة.

أسلوب واحد التي يعمل ولكن ليس بالضبط ما كنت أبحث عنه ، سيكون محل die() مع die("</body></html>").إذا كان النص إلى العودة كانت أكثر تعقيدا من ذلك ، يمكن القول ، أن يتم تخزينها في متغير.هل هناك أي شيء أفضل من هذا ؟

die() قد لا تكون بالضبط ما تريد هنا.لماذا لا يحل

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

مع

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

أو رمي/الصيد استثناء ؟

إذا كنت تعمل مع PHP4, أو فقط لا تريد عناء مع استثناءات ، ثم هل يمكن استخدام هذا الأسلوب:

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

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

..على الرغم من أن بعض الناس يبدو تماما بدلا من استخدام هذا النمط المناسب قائلا: أنا لا أرى أي مشاكل مع ذلك.أود أن أقول أنه أفضل بكثير من تكرار "تذييل" رمز في كل من يموت() البيانات.

<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
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top