Jessica: Doppelte Einträge

Hallo!

Ich habe ein kl. E-Shop-System basierend auf PHP/MySQL aufgebaut.

Problem beim Warenkorb:
Wenn man auf die "Hinzufügen"-Grafik klickt, wird der Artikel in den Warenkorb gelegt - so weit so gut. Aber wie kann ich verhindern, dass beim Neuladen der Seite (F5 - Aktualisierung) nochmal der Artikel hinzugefügt wird?

<a href="$PHP_SELF?id=auswahl&aktion=buy&cat=".$cat."&pid=".$id."&".SID."">
<img border="0" src="../img/warenkorb.gif" alt="Bestellen"></a>

if ($aktion == "buy")
  Artikel in den Warenkorb ...

Fakt ist, dass der Link, so in etwa: "webadresse?id=auswahl&aktion=buy&cat=Kategorie&pid=1&PHPSESSID=7c03a41a4ce37f9b016343cae2b78cda" mit der Aktion "buy" in die Adressleiste übernommen und beim Neuladen wird das Ganze eben nochmal ausgeführt wird.

Danke & Gruß

Jessica

  1. Hallo!

    Aber wie kann ich verhindern, dass beim Neuladen der Seite (F5 - Aktualisierung) nochmal der Artikel hinzugefügt wird?

    Die einfache Methode: Mittels Header auf eine andere Seite ("Der Artikel wurde zugebucht") umzuleiten.

    Sicherer ist es für das Formular eine eindeutige ID zu erzeugen und diese beim Absenden zu speichern. Das Script schaut dann nach, ob diese ID bereits gespeichert wurde.

    Beste Grüße
    Viennamade

    1. Hallo!

      Aber wie kann ich verhindern, dass beim Neuladen der Seite (F5 - Aktualisierung) nochmal der Artikel hinzugefügt wird?

      Die einfache Methode: Mittels Header auf eine andere Seite ("Der Artikel wurde zugebucht") umzuleiten.

      Das ...

      Sicherer ist es für das Formular eine eindeutige ID zu erzeugen und diese beim Absenden zu speichern. Das Script schaut dann nach, ob diese ID bereits gespeichert wurde

      ... ist falsch (formuliert), sagen wollte ich was hier http://www.dclp-faq.de/q/q-phplib-reloads.html steht.

      Tut leid,
      Viennamade

  2. Hallo Jessica,

    <a href="$PHP_SELF?id=auswahl&aktion=buy&cat=".$cat."&pid=".$id."&".SID."">

    Die & müssen ordentlich durch &amp; dargestellt werden.

    und noch zwei Links:
    11.19. Wie verhindere ich mehrfaches Absenden eines Formulars?
    http://www.dclp-faq.de/q/q-formular-mehrfach.html

    29.16. Wie kann ich Reloads durch den User erkennen und verhindern?
    http://www.dclp-faq.de/q/q-phplib-reloads.html

    Grüße
      David

    --
    >>Nobody will ever need more than 640k RAM!<<
    1981 Bill Gates
  3. Hallo Jessica!

    <a href="$PHP_SELF?id=auswahl&aktion=buy&cat=".$cat."&pid=".$id."&".SID."">
    <img border="0" src="../img/warenkorb.gif" alt="Bestellen"></a>

    if ($aktion == "buy")
      Artikel in den Warenkorb ...

    Ich gehe mal davon aus, dass du den Warenkorb in eine Session speicherst und nicht schon in eine Datenbank?

    Ich würde das Problem so lösen:
    Annahme: $cat = Katalog/Artikel-Kategorie
             $pid = Produkt-ID
             Dem Warenkorb wird anscheinend immer nur ein Stück
             hinzugefügt bzw. der Benutzer kann nicht explizit die
             Anzahl angeben?

    $_SESSION["Warenkorb"][$cat][$pid] = (isset($_SESSION["Warenkorb"][$cat][$pid])) ? 1 : $_SESSION["Warenkorb"][$cat][$pid]++;

    Mit einer foreach-Schleife kannst du dann bei einer Kauf-Bestätigung den Warenkorb auslesen.

    Alternativ kann man -- wie es bereits von anderen gepostet wurde -- auch dem Formular eine eindeutige ID vergeben.

  4. Hello,

    ich habe mich hier zum Thema "Vorgangsbearbeitung/Vorgangsverarbeitung" schon mehrfach verbreitet.

    Jedes Formular beim Client erhält vor dem Aussenden ein Formularzertifikat. Dieses wird auf dem Server in einer temporären Tabelle für den Vorgang vermerkt und beim Post wird ein Update auf diesen Satz durchgeführt. Wenn kein Satz mit dem Zertifikat vorhanden ist, oder das abgearbeitet-Flag des Satzes bereits gestzt ist, wird der Post ignoriert, oder ein fehler ausgelöst. Nach dem Buchen des Satzes wird ein neues Formularzertifikat erzeugt und eingetragen und das Formular erneut an den Client geschickt.

    Das Sammeln von Shop-Bestellungen registrierter Nutzer in der Sessiondatei ist nicht kundenfreundlich, es sei denn, dass der Kunde bei der nächsten Anmeldung oder einem Reconnect nach einem Connection Loss dieselbe Sessiondatei wiederbekommt.

    Die Datenbank ist da einfach der bessere Ort.

    Wenn man natürlich nur "Peanuts Jobs" mit Laufkunden abwickelt, mag das egal sein.

    Harzliche Grüße aus http://www.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau