nixwisserin: warenkorb nicht aktualsieren

Hallo
die artikel meines warenkorbes werden in einer Tabelle der Db gespeichert (MySQL).
Nun stehe ich vor dem Problem, das beim Aktualisieren und vor/zurückblättern der Artikel noch ein weiteres Mal in den Korb gelegt wird.
Leider hab ich keine Idee wie man das verhindern kann. Muß man das mit PHP machen (denk ich mal) oder gibts da auch ne Möglichkeit mit SQL? Wenn ja, könnt ihr mit nen Ansatz geben, wie das aussieht?

  1. Hi,
    du könntest vor dem hinzufügen eines neuen artikels mit SELECT
    überprüfen ob der schon im Warenkorb liegt. oder du legst den artikel
    nicht mit INSERT sondern mit REPLACEhinzufügst.

    MfG

    1. Hi,
      du könntest vor dem hinzufügen eines neuen artikels mit SELECT
      überprüfen ob der schon im Warenkorb liegt. oder du legst den artikel
      nicht mit INSERT sondern mit REPLACEhinzufügst.

      MfG

      also das mit REPLACe geht leider nicht. Aber da tut sich nix ändern.
      [php]
      <?session_start();
      $wk_id=session_id();

      include_once("dblogon.php");
      $sql_wkeintrag = "REPLACE INTO warenkorb (art_nr, firmen_id, art_titel, art_preis, art_menge, art_mwst, wk_id, artikelid) values ('$art_nr', '$firmen_id', '$art_titel', '$art_preis', '$menge', '$art_mwst', '$wk_id', $artikelid)";
      $result_wkeintrag = mysql_query($sql_wkeintrag) OR die(mysql_error()."  ".mysql_errno());
      [/php]

      1. Hi,

        also das mit REPLACe geht leider nicht.

        Wie das geht nicht?

        Aber da tut sich nix ändern.

        Was heißt es ändert sich nix? keine neuen einträge oder wie?

          
        <?  
        session_start();  
        $wk_id=session_id();  
        include_once("dblogon.php");  
          
        $sql_wkeintrag = "REPLACE INTO warenkorb (art_nr, firmen_id, art_titel, art_preis, art_menge, art_mwst, wk_id, artikelid) values ('$art_nr', '$firmen_id', '$art_titel', '$art_preis', '$menge', '$art_mwst', '$wk_id', $artikelid)";  
        $result_wkeintrag = mysql_query($sql_wkeintrag) OR die(mysql_error()."  ".mysql_errno());  
        
        

        bringt er dir ne fehlermeldung? wenn ja welche?

        MfG

      2. Hallo nixwisserin,

        da Du eh' schon Sessions verwendest kannst Du mit relativ wenig Aufwand dafür sorgen, daß Datensätze (bei einem Reload) nicht mehrfach angelegt werden.

        Hi,
        du könntest vor dem hinzufügen eines neuen artikels mit SELECT
        überprüfen ob der schon im Warenkorb liegt. oder du legst den artikel
        nicht mit INSERT sondern mit REPLACEhinzufügst.

        MfG

        also das mit REPLACe geht leider nicht. Aber da tut sich nix ändern.
        [php]
        <?session_start();
        $wk_id=session_id();

        if (!$_SESSION['wk_item_added']) {

        include_once("dblogon.php");
        $sql_wkeintrag = "REPLACE INTO warenkorb (art_nr, firmen_id, art_titel, art_preis, art_menge, art_mwst, wk_id, artikelid) values ('$art_nr', '$firmen_id', '$art_titel', '$art_preis', '$menge', '$art_mwst', '$wk_id', $artikelid)";
        $result_wkeintrag = mysql_query($sql_wkeintrag) OR die(mysql_error()."  ".mysql_errno());

        Nach erfolgreichem Eintrag merkst Du dir das in einer Session-Variablen, also z.B.

        if ($result_wkeintrag) $_SESSION['wk_item_added'] = TRUE;

        }

        An einer geeigneten stelle in deinem Skript muß Du _vorher_ natürlich

        $_SESSION['wk_item_added'] = FALSE;

        setzen, aber _nur_ dann, wenn dein Skript in der Absicht aufgerufen wird einen Artikel (gewollt) in den wk zu legen (ansonsten bliebe ja $_SESSION['wk_item_added'] immer TRUE und man könnte keine weiteren Artikel mehr in den wk legen ...) und natürlich auch vor dem allerersten in-den-Warenkorb-legen mußt Du $_SESSION['wk_item_added'] mit FALSE vorbelegen.

        Ich hoffe, dir ist das Prinzip klar geworden, ansonsten frag' einfach nochmal nach.

        Grüsse
        Frankie

      3. Hi,

        $sql_wkeintrag = "REPLACE INTO warenkorb (art_nr, firmen_id, art_titel, art_preis, art_menge, art_mwst, wk_id, artikelid) values ('$art_nr', '$firmen_id', '$art_titel', '$art_preis', '$menge', '$art_mwst', '$wk_id', $artikelid)";

        was mir hier grad auffällt, warum addest du

        • art_nr
        • art_titel
        • art_preis
        • art_mwst

        in dieser tabelle reicht dir völllig:

        • firmen_id
        • art_menge
        • wk_id
        • artikelid

        alles weitere bekommst du ja über die seperaten tabellen.
        Des weiteren würde ich der übersichtlichkeit wegen es dann so schreiben:

        $sql_wkeintrag = "REPLACE INTO warenkorb SET"
                         ."firmen_id=$firmen_id, "
                         ."art_menge=$art_menge, "
                         ."wk_id=$wk_id, "
                         ."artikelid=$artikelid"

        MfG

    2. hi,

      du könntest vor dem hinzufügen eines neuen artikels mit SELECT
      überprüfen ob der schon im Warenkorb liegt.

      und wenn ich dann artikel a schon einmal in den warenkorb gelegt habe, und er mir dann bei genauerem nachdenken aber so gut gefällt, dass ich ihn noch ein zweites mal hineinlegen möchte ...?

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hi,

        und wenn ich dann artikel a schon einmal in den warenkorb gelegt habe, und er mir dann bei genauerem nachdenken aber so gut gefällt, dass ich ihn noch ein zweites mal hineinlegen möchte ...?

        dann gibt es ein FELD namens ANZAHL auch in der DB welches dann aktualisiert wird wenn du dort 2 einträgst.

        MfG

        1. hi,

          dann gibt es ein FELD namens ANZAHL auch in der DB welches dann aktualisiert wird wenn du dort 2 einträgst.

          und das löst in wie fern das hier in frage stehende problem? (nämlich, dass bei betätigen des zurück-buttons ein erneutes hinzufügen erfolgt.)

          gruß,
          wahsaga

          --
          /voodoo.css:
          #GeorgeWBush { position:absolute; bottom:-6ft; }
          1. Hi,

            und das löst in wie fern das hier in frage stehende problem?
            (nämlich, dass bei betätigen des zurück-buttons ein erneutes
            hinzufügen erfolgt.)

            tut es eben nicht. weil REPLACE, kennst du das denn nicht? also von dir
            hätt ich qualifiziertere äußerungen erwartet.

            MfG

            1. hi,

              tut es eben nicht. weil REPLACE, kennst du das denn nicht?

              du begreifst die problematik offenbar immer noch nicht.

              das problem ist, dass beim betätigen des zurück-buttons noch mal die gleiche aktion ausgelöst wird, wie beim originalen hinzufügen eines artikels - also muss an der stelle eine möglichkeit gefunden werden, das zu unterscheiden (oder zu vermeiden).
              wie du das machen willst, ist mir immer noch unklar.
              ob du dabei ein replace oder update machst, ist eigentlich wurscht

              also von dir hätt ich qualifiziertere äußerungen erwartet.

              und ich von dir etwas mehr verständnis für das eigentliche problem, oder eine detailierte schilderung, wie dein ansatz geeignet sein soll, dass problem zu verhindern.

              gruß,
              wahsaga

              --
              /voodoo.css:
              #GeorgeWBush { position:absolute; bottom:-6ft; }
              1. Hi,

                das problem ist, dass beim betätigen des zurück-buttons noch mal die
                gleiche aktion ausgelöst wird, wie beim originalen hinzufügen eines
                artikels

                bzw. beim drücken von F5, oder dem aktuallisieren button des Browsers. das ist mir klar. Ich habe ihr gesagt sie soll
                a) SELECT machen und schon obs den Eintrag schon gibt wenn ja dann egal wenn noch nicht dann per INSERT reinsetzten
                b) Stattdessen anstatt des "kompliziert" SELECT -> if() -> else einfach ein REPLACE.

                ob du dabei ein replace oder update machst, ist eigentlich wurscht

                Nein REPLACE fügt einen datensatz hinzu außer dieser besteht schon
                dann wird er aktuallisiert. dazu muss man einen UNIQUE key auf die
                entsprechenden spalten legen. was sie wohl vergessen bzw. noch nicht gemacht hat.

                und ich von dir etwas mehr verständnis für das eigentliche problem, oder eine detailierte schilderung, wie dein ansatz geeignet sein soll, dass problem zu verhindern.

                Die erklärung liefert die beschreibung von REPLACE im MySQL Manuell

                MfG

                1. hi,

                  bzw. beim drücken von F5, oder dem aktuallisieren button des Browsers. das ist mir klar. Ich habe ihr gesagt sie soll
                  a) SELECT machen und schon obs den Eintrag schon gibt wenn ja dann egal wenn noch nicht dann per INSERT reinsetzten

                  und wie unterscheidest du diese reload-request durch den von mir als benutzer _bewusst_ ausgelösten request, weil ich den artikel _ein weiteres_ mal in den warenkorb legen will (um die anzahl zu erhöhen)?

                  du machst deinen SELECT, artikel ist bereits drin - also triit dein "dann egal" in kraft.
                  das ist aber nicht das, was ich als nutzer jetzt erreichen wollte.

                  Die erklärung liefert die beschreibung von REPLACE im MySQL Manuell

                  nein, tut sie nicht.
                  was REPLACE macht, ist mir bewusst - ich halte es hier nur für fehl am platze, weil es nicht das _kann_, was hier erforderlich ist - nämlich zwischen "ungewolltem" und "gewolltem" erneuten hinzufügen des artikels zu unterscheiden.

                  gruß,
                  wahsaga

                  --
                  /voodoo.css:
                  #GeorgeWBush { position:absolute; bottom:-6ft; }
                  1. Hi,

                    was REPLACE macht, ist mir bewusst - ich halte es hier nur für fehl
                    am platze, weil es nicht das _kann_, was hier erforderlich ist -
                    nämlich zwischen "ungewolltem" und "gewolltem" erneuten hinzufügen
                    des artikels zu unterscheiden.

                    Da hast du recht, aber wenn ich es nicht übersehen habe dann war das
                    auch garnicht gefragt sondern nur das beim aktuallisieren ein neuer
                    eintrag gemacht wird.

                    Wäre gewollt <-> nicht gewollt gefragt gewesen hätt ich wie hier
                    https://forum.selfhtml.org/?t=108793&m=678413 auf
                    eine zusätzliche Sessionvariable verwiesen.

                    MfG

                    1. Hallo Daniel,

                      Wäre gewollt <-> nicht gewollt gefragt gewesen hätt ich wie hier
                      https://forum.selfhtml.org/?t=108793&m=678413 auf
                      eine zusätzliche Sessionvariable verwiesen.

                      Da Du auf mich verweist: Natürlich ist der Kern des Problems "gewolltes / ungewolltes" Hinzufügen, da im vorliegenden Fall ein Reload, zumindest habe ich das so verstanden, ein "ungewolltes" Hinzufügen bewirkt. Ob ich im Falle eines "gewollten" Hinzufügens INSERT oder REPLACE verwende ist meiner Meinung nach ziemlich egal. Wichtig ist, daß ungewolltes Hinzufügen, zumindest bei einem Reload, verhindert wird. Je nach Aufbau des Skripts kann das evtl. bedeuten, daß ein Hinzufügen explizit bestätigt werden müsste, aber immerhin noch wesentlich besser, als wenn ungewollte Artikel in den Warenkorb wandern würden.

                      Grüsse
                      Frankie

                2. Moin!

                  Nein REPLACE fügt einen datensatz hinzu außer dieser besteht schon
                  dann wird er aktuallisiert.

                  Das ist so nicht ganz korrekt. REPLACE führt einen INSERT durch - immer. Sofern der Datensatz vorher schon bestand, wird er vor dem INSERT allerdings mit DELETE entfernt.

                  Trotzdem hat wahsaga Recht: Dein Ansatz löst nicht im geringsten das Problem, dass ein Reload einer Aktionsseite "füge Artikel hinzu" beim Shop grundsätzlich weitere, unerwünschte Artikel hinzufügen würde - oder dass die Fähigkeit, bereits hinzugefügte Artikel absichtlich und ganz ohne Reload erneut hinzuzufügen, verloren geht.

                  • Sven Rautenberg