Frage

Je stolperte auf eine Anleitung, die Sie fühlen, ist von großem Wert, aber nicht ganz richtig erklärt?Das ist mein dilemma.Ich weiß DIESES TUTORIAL hat etwas Wert, aber ich kann einfach nicht bekommen es.

  1. Wo tun Sie nennen jede Funktion?
  2. Die Funktion sollte aufgerufen werden, ersten und dem nächsten, und die Dritte?
  3. Werden alle Funktionen aufgerufen werden, in allen Dateien in eine Anwendung?
  4. Kennt jemand einen besseren Weg, Heilung der "Zurück Schaltfläche Blues"?

Ich Frage mich, ob dies rührt einige gute Konversation, schließt der Autor des Artikels.Der Teil, den ich bin besonders interessiert, ist die Steuerung der zurück-Taste um zu verhindern, dass form doppelte Einträge in einer Datenbank, wenn Sie die zurück-Taste gedrückt wird.Im Grunde wollen Sie zum Steuern der zurück-Taste durch aufrufen der folgenden drei Funktionen, die während der Ausführung des Skripts in Ihrer Anwendung.In welcher Reihenfolge genau Sie zum aufrufen der Funktionen (siehe Fragen oben) ist nicht klar aus der Anleitung.

Alle Vorwärtsbewegung erfolgt durch mit meinem scriptNext Funktion.Dies ist als im aktuellen Skript in zur Aktivierung des neuen Skript.

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

Wenn Sie irgendeine Skript fertig sein die Verarbeitung wird beendet, indem Sie meinen scriptPrevious Funktion.Dieser wird drop das aktuelle Skript vom Ende der stack-array-und reaktivieren Sie den Vorherige Skript in das array.

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

Wenn ein Skript aktiviert, die kann entweder durch die scriptNext oder scriptPrevious Funktionen, oder wegen der Schaltfläche "ZURÜCK" in der browser, es wird rufen Sie die folgende Funktion, um sicherzustellen, dass es das aktuelle Skript nach der Inhalt des Programm-Stacks und nehmen geeignete Maßnahmen, wenn es nicht ist.

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

Die Aktion hängt davon ab, ob das aktuelle Skript existiert innerhalb der Programm-stack oder nicht.Es gibt drei Möglichkeiten:

  • Das aktuelle Skript wird nicht in der $page_stack array, in dem Fall ist es nicht erlaubt, um fortzufahren.Stattdessen ist es ersetzt durch das Skript, das an der Ende des Arrays.
  • Das aktuelle Skript wird in der $page_stack array, aber es ist nicht der letzten Eintrag.In diesem Fall werden alle folgende Einträge in dem array sind entfernt.
  • Das aktuelle Skript wird der Letzte Eintrag in der $page_stack array.Dies ist die erwartete situation.Alle Getränke Runde!
War es hilfreich?

Lösung

Das ist eine gute Diskussion, aber mehr zu dem Punkt, den Sie suchen sollten, in die Post-Redirect-Get (PRG), auch bekannt als "nach der Post."

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

Andere Tipps

Wenn Sie nicht verstehen, meine Artikel dann sollten Sie einen Blick auf Abbildung 1 das zeigt ein typisches Szenario, in dem ein Benutzer durchläuft eine Reihe von Bildschirmen – Anmeldung, Menü, Liste, Suche, hinzufügen und aktualisieren.Wenn ich beschreiben eine Bewegung von vorn ich bedeuten, dass der aktuelle Bildschirm wird angehalten, während Sie eine neue Bildschirm aktiviert ist.Dies passiert, wenn der Benutzer drückt einen link in den aktuellen Bildschirm.Wenn ich beschreiben, eine Bewegung nach HINTEN, meine ich, dass der Benutzer beendet den aktuellen Bildschirm (durch drücken der BEENDEN-oder SUBMIT-button) und kehrt zum vorherigen Bildschirm zurück, die fortgesetzt die Verarbeitung von wo Sie aufgehört.Dies kann auch die Einbeziehung von änderungen in den Bildschirm, die gerade beendet wurden.

Dies ist, wo die Aufrechterhaltung einer Seite-stack, der unabhängig von den browser-Geschichte ist entscheidend – der stack Seite wird gepflegt von der Anwendung und wird verwendet, um zu überprüfen, ob alle Anforderungen.Diese kann gültig sein, so weit wie der browser betroffen ist, sondern identifiziert werden kann, die von der Anwendung als ungültig und entsprechend behandelt werden.

Der stack Seite wird betreut durch zwei Funktionen:

  • scriptNext() wird verwendet, um den Prozess ein VORWÄRTS Bewegung, die fügt eine neue Eintrag am Ende der Stapel und aktiviert den neuen Eintrag.
  • scriptPrevious() wird verwendet, um Prozess eine RÜCKWÄRTS-Bewegung, die entfernt der Letzte Eintrag auf dem stack und re-aktiviert die Vorherige Eintrag.

Jetzt nehmen Sie die situation in dem Beispiel, in dem der Benutzer navigiert zu Seite 4 der LISTE Bildschirm, verschwunden in den ADD-Bildschirm, dann wieder auf Seite 5 in der LISTE-Bildschirm.Die Letzte Aktion in der BEURTEILUNG Bildschirm zu drücken Sie die SENDEN-Schaltfläche, die verwendet die POST-Methode zu senden Sie details, um die server, die der Datenbank Hinzugefügt wurden, nach dem es automatisch beendet und kehrte zu der LISTE Bildschirm.

Wenn Sie also drücken Sie die ZURÜCK-Taste, während in der auf Seite 5 der Bildschirm LISTE der browser-Historie generiert eine Anforderung für die Letzte Aktion auf dem Bildschirm HINZUFÜGEN, die ein POST.Dies ist ein berechtigtes verlangen, soweit die browser betroffen ist, aber nicht, soweit die Anwendung betrifft.Wie kann die Anwendung entscheiden, dass der Antrag ungültig ist?Indem Sie mit der Seite der stack.Wenn der "ADD screen" wurde beendet seinen Eintrag wurde aus der Seite gelöscht stack, daher wird jede Anfrage für eine Bildschirm, die ist nicht in die Seite stapeln können immer behandelt werden, als ungültig.In diesem Fall die ungültige Anforderung umgeleitet werden kann, um den letzten Eintrag im stack.

Die Antworten auf Ihre Fragen sollten daher auf der Hand:

  • Q:Wo tun Sie nennen jede Funktion?
  • A:Rufen Sie die scriptNext() Funktion, wenn der Benutzer wählt, um vorwärts navigieren Sie zu einem neuen Bildschirm, und rufen Sie die scriptPrevious() Funktion, wenn der Benutzer abbricht die aktuelle Bildschirm.
  • Q:Die Funktion sollte aufgerufen werden, ersten und dem nächsten, und die Dritte?
  • A:Jede Funktion wird aufgerufen Reaktion auf eine Aktion gewählt durch die Nutzer, so dass nur eine Funktion verwendet wird in einer Zeit,.
  • Q:Werden alle Funktionen aufgerufen werden alle Dateien in eine Anwendung?
  • A:Alle Funktionen sollten verfügbar sein in allen Dateien in einer Anwendung, aber nur dann aufgerufen, wenn vom Benutzer ausgewählt wurde.

Es Sie wollen, um zu sehen, diese Ideen umzusetzen, dann können Sie herunterladen Beispielanwendung.

Der Teil, den ich bin besonders interessiert, ist die Steuerung der zurück-Taste um zu verhindern, dass form doppelte Einträge in einer Datenbank, wenn Sie die zurück-Taste gedrückt wird.

Ihre Prämisse ist falsch.Es gibt keine solche Sache als "Back-Button-Blues", wenn Sie Ihre Anwendung als web-Anwendung.Wenn Sie entwerfen Sie Ihre Anwendung ohne server Seite Stand, werden Sie nie auf dieses problem stoßen, im ersten Fall.Dieser minimalistische Ansatz für web-Anwendungen funktioniert bemerkenswert gut, und ist in der Regel bekannt als REST.

@ troelskn

Wenn Sie entwerfen Sie Ihre Anwendung ohne server-side-state ....

Es ist nicht möglich eine effektive Anwendung, die nicht Zustand, sonst haben Sie nur eine Sammlung von einzelnen Seiten, die nicht miteinander kommunizieren.Als der Aufrechterhaltung des Zustands auf dem client ist voller Fragen gibt es keine wirksame alternative zum verwalten des Status auf dem server.

@Marston.

Ich löste das problem mit post/redirect/get, aber ich glaube, das tutorial hat einige Verdienste und vielleicht Tony Marston kann weiter drauf ein.Und wie es verwendet werden könnte, zu lösen, nicht unbedingt mein spezielles problem, aber vielleicht etwas ähnliches.Oder wie ist es besser als post/redirect/get, wenn die Funktionen können in der Tat verwendet werden in die Lösung meines Problems.Ich denke, das wird sein eine gute Ergänzung zu der community hier.

if ($_POST) {
    process_input($_POST);
    header("Location: $_SERVER[HTTP_REFERER]");
    exit;
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top