Enrico: Problem mit Neuaufbau des Warenkorbs nach Löschen von Artikeln

Hallo,

ich bin gerade dabei, endlich den eigentlichen Bestellvorgang unseres Webshops in Angriff nehmen zu können, zunächst aber ohne besondere optische Aufmachung, sondern nur, um dessen Funktionalität umzusetzen und zu gewährleisten.

Ich lese den Inhalt des Warenkorbs über einen sehr sicher verschlüsselten Cookie ein, splitte ihn nachfolgend auf und gebe ihn aus:

Zu Testzwecken gebe ich die global definierte Variable "_a" aus, die die Länge der sich im Warenkorb befindlichen Positionen aus. Darunter habe ich ein - noch sichtbares - Textfeld, das, wenn ein Artikel gelöscht werden soll und eine Checkbox angeklickt wurde, dessen Index bekommt. Sollen mehrere Artikel gelöscht werden, so werden die Indizes in diesem Feld mittels Komma getrennt angezeigt:

oder

Mein Problem ist nun, dass die Löschvorgänge reibungslos funktionieren, solange ich nicht den letzten Artikel (mit) auswähle.

Hier wird, und auf die Ursache dieses Fehlers komme ich partout nicht, ein weiteres, nicht definiertes Array-Element bei der Ausgabe erzeugt:

Hier der JavaScript-Code, der sich um das Löschen und die Neuerzeugung des Warenkorbes kümmert:

  
if (document.getElementById('Loeschen').value !== '')  
{  
   var String = read_cookie('String'),  
       Position = String.split("|"),  
       x = 0,  
       Daten = '',  
       Loeschen = document.getElementById('Loeschen').value.indexOf(',') !== -1 ? document.getElementById('Loeschen').value.split(',') : [document.getElementById('Loeschen').value];  
  
   for (; x < _a; x++)  
      if (!in_array (x, Loeschen))  
      {  
         Spalte = Position[x].split(",");  
  
         Daten += document.getElementById('M' + x).value + ',';  
         Daten += Spalte[1] + ',';  
         Daten += (Spalte[2] != '') ? Spalte[2] + ',' : ',';  
         Daten += (Spalte[3] != '') ? Spalte[3] + ',' : ',';  
         Daten += Spalte[4];  
  
         if (x < _a - 1)  
            Daten += '|';  
      }  
  
   set_cookie ('String', bin2hex (rc4 (rawurlencode (Daten), get_key (safe))) + safe);  
  
   Warenkorb_anzeigen();  
}

Ich habe sicherlich nur einen klitzekleinen Fehler in meinem Code, der für den fehlerhaften Neuaufbau verantwortlich ist, aber ich komme nicht dahinter, da ich ja mittels der Abfrage

if (x < _a - 1)

eigentlich schon Sorge dafür trage, dass nur dann das Trennzeichen ergänzt wird, wenn noch ein weiterer Artikel hinzugefügt werden soll. Das Trennzeichen kennzeichnet, dass noch ein weiterer Artikel ergänzt wird.

Wo liegt der Fehler?

Ich bin mit meinem Stuhl auch schon hin- und hergerutscht, nicht, dass ich auf der Leitung sitze, aber nichts, ich komme nicht dahinter :-|

Vielen Dank für eure Unterstützung.

Gruß,
Enrico

  1. Ich lese den Inhalt des Warenkorbs über einen sehr sicher verschlüsselten Cookie ein

    He?

    Da ist ein Loch in der Größe eines Scheunentors in Deiner "Sicherheit". Der Schlüssel muss in JS, also im Browser bekannt sein - ergo ist er es jedem Angreifer auch. Der Warenkorb ist manipulierbar, den Bestellungen kann man nicht trauen, muss diese also ohnehin serverseitig nachrechnen und auch inhaltlich (Ware-Preis-Anzahl-Gesamtpreis?) überprüfen. Das ist eine Angelegenheit, die strikt dagegen spricht, Warenkörbe in JS zu speichern. Dafür gibt es z.B. die serverseitige Session.

    Bei Deinem Problem hilft nur Debugging - auf den ersten Blick sehe ich den Verursacher nämlich auch nicht. Lass Die also alle Variablen schön schrittweise ausgeben und prüfe deren Plausibilität.

    Jörg Reinholz

  2. Hallo,

    ich habe mir den Code nicht genauer angeschaut. Auf Anhieb habe ich keinen Fehler im Code gesehen. Um das im Detail zu debuggen, bräuchte ich das zugehörige Formular. Ein funktionsfähiges Beispiel auf jsfiddle wäre praktisch.

    Generell würde ich dazu raten, das zu vereinfachen. Anstatt sich ein eigenes Format zu überlegen, solltest du ein prädestiniertes Format wie JSON verwenden. Mit JSON.parse() und JSON.stringify() ist es möglich, solche Daten eindeutig und zuverlässig zu (de)serialisieren. Dabei kann eigentlich nichts schiefgehen, und wenn doch, ist es tausendmal einfacher, den Fehler zu finden, da du bei der Manipulation der Daten nicht auf String-Ebene, sondern auf Objekt-Ebene arbeitest.

    Was die Verschlüsselung angeht, so hat sich Jörg bereits geäußert. Wenn du schon den Warenkorb im Cookie speicherst – Warum? Üblich ist das serverseitige Speichern in einer Session –, so fügt eine clientseitige Verschlüsselung keine Sicherheit hinzu, sondern verschleiert die Daten nur minimal.

    Mathias

  3. @@Enrico:

    nuqneH

    Dass die Versandkosten zwar ausgewiesen, aber nicht berechnet werden, ist dir bewusst?

    Qapla'

    --
    „Talente finden Lösungen, Genies entdecken Probleme.“ (Hans Krailsheimer)