سؤال

من أي وقت مضى تعثر على البرنامج التعليمي الذي تشعر هي ذات قيمة كبيرة ولكن ليس تماما أوضح بشكل صحيح ؟ أن المعضلة.أعلم هذا البرنامج التعليمي له بعض القيمة ولكن أنا فقط لا يمكن الحصول عليه.

  1. أين كل وظيفة ؟
  2. الدالة التي ينبغي أن تسمى الأولى والتي المقبل ، الثالثة ؟
  3. سوف جميع الوظائف في جميع الملفات في التطبيق ؟
  4. لا أحد يعرف من طريقة أفضل علاج "الزر مرة أخرى بلوز" ؟

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

جميع المهاجمين الحركة التي يؤديها باستخدام scriptNext وظيفة.هذا هو ودعا في السيناريو الحالي في من أجل تفعيل السيناريو الجديد.

function scriptNext($script_id)
// proceed forwards to a new script
{
   if (empty($script_id)) {
      trigger_error("script id is not defined", E_USER_ERROR);
   } // if

   // get list of screens used in this session
   $page_stack = $_SESSION['page_stack'];
   if (in_array($script_id, $page_stack)) {
      // remove this item and any following items from the stack array
      do {
         $last = array_pop($page_stack);
      } while ($last != $script_id);
   } // if

   // add next script to end of array and update session data
   $page_stack[] = $script_id;
   $_SESSION['page_stack'] = $page_stack;

   // now pass control to the designated script
   $location = 'http://' .$_SERVER['HTTP_HOST'] .$script_id;
   header('Location: ' .$location); 
   exit;

} // scriptNext

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

function scriptPrevious()
// go back to the previous script (as defined in PAGE_STACK)
{
   // get id of current script
   $script_id = $_SERVER['PHP_SELF'];

   // get list of screens used in this session
   $page_stack = $_SESSION['page_stack'];
   if (in_array($script_id, $page_stack)) {
      // remove this item and any following items from the stack array
      do {
         $last = array_pop($page_stack);
      } while ($last != $script_id);
      // update session data
      $_SESSION['page_stack'] = $page_stack;
   } // if

   if (count($page_stack) > 0) {
      $previous = array_pop($page_stack);
      // reactivate previous script
      $location = 'http://' .$_SERVER['HTTP_HOST'] .$previous;
   } else {
      // no previous scripts, so terminate session
      session_unset();
      session_destroy();
      // revert to default start page
      $location = 'http://' .$_SERVER['HTTP_HOST'] .'/index.php';
   } // if

   header('Location: ' .$location); 
   exit;

} // scriptPrevious

كلما السيناريو هو تفعيلها ، يمكن أن تكون إما من خلال scriptNext أو scriptPrevious الوظائف ، أو لأن من الزر الخلفي في المتصفح, فإنه سيتم استدعاء التالية وظيفة للتحقق من أن هذا هو النصي الحالي وفقا محتويات البرنامج كومة واتخاذ الإجراءات المناسبة إذا لم يكن.

function initSession()
// initialise session data
{
   // get program stack
   if (isset($_SESSION['page_stack'])) {
      // use existing stack
      $page_stack = $_SESSION['page_stack'];
   } else {
      // create new stack which starts with current script
      $page_stack[] = $_SERVER['PHP_SELF'];
      $_SESSION['page_stack'] = $page_stack;
   } // if

   // check that this script is at the end of the current stack
   $actual = $_SERVER['PHP_SELF'];
   $expected = $page_stack[count($page_stack)-1];
   if ($expected != $actual) {
      if (in_array($actual, $page_stack)) {// script is within current stack, so remove anything which follows
      while ($page_stack[count($page_stack)-1] != $actual ) {
            $null = array_pop($page_stack);
         } // while
         $_SESSION['page_stack'] = $page_stack;
      } // if
      // set script id to last entry in program stack
      $actual = $page_stack[count($page_stack)-1];
      $location = 'http://' .$_SERVER['HTTP_HOST'] .$actual;
      header('Location: ' .$location);
      exit;
   } // if

   ... // continue processing

} // initSession

الإجراءات المتخذة يعتمد على ما إذا كان السيناريو الحالي موجود داخل برنامج المكدس أو لا.هناك ثلاثة الاحتمالات:

  • السيناريو الحالي ليس في $page_stack مجموعة ، في هذه الحالة هو لا يجوز أن يستمر.بدلا من ذلك هو استبدال النص الذي هو في نهاية الصفيف.
  • السيناريو الحالي في $page_stack مجموعة ، ولكن ليس هذا هو الإدخال الأخير.في هذه الحالة كل الإدخالات التالية في الصفيف إزالة.
  • السيناريو الحالي هو آخر دخول في $page_stack مجموعة.هذا هو الحالة المتوقعة.جميع المشروبات جولة!
هل كانت مفيدة؟

المحلول

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

http://www.theserverside.com/patterns/thread.tss?thread_id=20936

نصائح أخرى

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

هذا هو المكان والحفاظ على صفحة كومة وهي مستقلة عن المتصفح التاريخ أمر بالغ الأهمية – الصفحة المكدس هو الحفاظ على تطبيق يستخدم للتحقق من جميع الطلبات.هذه قد تكون صحيحة بقدر المتصفح هو المعني ، ولكن قد يتم تحديدها من قبل التطبيق أنها غير صالحة والتعامل معها وفقا لذلك.

الصفحة المكدس يتم الاحتفاظ من قبل اثنين من المهام:

  • scriptNext() تستخدم في عملية إلى الأمام الحركة ، وهو ما يضيف جديدا دخول في نهاية المكدس ، ينشط دخول جديدة.
  • scriptPrevious() تستخدم في عملية تراجع الحركة التي يزيل الدخول الأخير من المكدس ، إعادة تنشيط الإدخال السابق.

الآن تأخذ الوضع في المثال حيث أن المستخدم لديه التنقل إلى صفحة 4 من قائمة الشاشة ، ذهب إلى إضافة الشاشة ، ثم عاد إلى صفحة 5 من قائمة الشاشة.الإجراء الأخير في إضافة الشاشة اضغط على زر الإرسال التي تستخدم الأسلوب POST إرسال التفاصيل إلى الخادم التي تمت إضافتها إلى قاعدة البيانات ، وبعد ذلك إنهاء تلقائيا وعاد إلى شاشة القائمة.

لذلك إذا كنت اضغط على الزر مرة أخرى. في صفحة 5 من قائمة شاشة المتصفح التاريخ سوف تولد طلبا آخر العمل على إضافة الشاشة ، التي كانت آخر.هذا هو طلب صالحة بقدر المتصفح المعنية ، ولكن ليس بقدر التطبيق المعنية.كيف يمكن تطبيق تقرر أن الطلب غير صالح ؟ عن طريق التحقق مع الصفحة المكدس.عند إضافة الشاشة تم إنهاء دخولها حذفت من الصفحة المكدس ، ولذلك أي طلب الشاشة في الصفحة كومة يمكن دائما أن تعامل على أنها غير صالحة.في هذه الحالة غير صالحة طلب يمكن إعادة توجيه إلى آخر إدخال في المكدس.

الإجابات على الأسئلة الخاصة بك ولذلك ينبغي أن يكون واضحا:

  • Q:أين كل وظيفة ؟
  • A:يمكنك استدعاء scriptNext() وظيفة عندما يختار المستخدم إلى التنقل إلى الأمام إلى شاشة جديدة ، واستدعاء scriptPrevious() وظيفة عندما يقوم المستخدم إنهاء الشاشة الحالية.
  • Q:الدالة التي ينبغي أن تسمى الأولى والتي المقبل ، الثالثة ؟
  • A:كل وظيفة في استجابة العمل الذي تم اختياره من قبل مستخدم واحد فقط حتى يتم استخدام الدالة في وقت.
  • Q:سوف جميع الوظائف في جميع الملفات في التطبيق ؟
  • A:جميع الوظائف يجب أن تكون متاحة في جميع الملفات في التطبيق ، ولكن فقط يسمى عند اختياره من قبل المستخدم.

بل كنت ترغب في رؤية هذه الأفكار في العمل ثم يمكنك تحميل بلدي تطبيق نموذج.

أنا مهتم بشكل خاص في السيطرة على الزر مرة أخرى من أجل منع شكل إدخالات مكررة في قاعدة البيانات عندما تعود يتم الضغط على زر.

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

@ troelskn

إذا كنت تصميم التطبيق الخاص بك دون أي ملقم جانب الدولة ....

فإنه ليس من الممكن تصميم تطبيق فعال التي لا تملك الدولة, وإلا كل ما عليك هو مجموعة من الصفحات الفردية التي لا يمكنهم التواصل مع بعضهم البعض.والحفاظ على الدولة على العميل محفوف القضايا لا يوجد بديل فعال ولكن للحفاظ على الدولة على الملقم.

@مارستون.

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

if ($_POST) {
    process_input($_POST);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top