Antman: Warenkorb funktion

Hallo Forum,

an eine Funktion wird werden 2 Arrays übergeben. Eines mit den Artekelnummern und das andere mit den dazugehörigen Anzahlen.

Wenn in der DB bereits die Artikel vorhanden sind, sollen dort die Anzahlen aktualisiert werdern. Das geschieht aber nicht. Ich bekomme immer mehrere Zeilen mit der gleichen Artikelnummer. Sieht jemand den Fehler ?

function updateCard($anzahl, $artikelnummer)
{
    for($i=0; $i <= count($anzahl); $i++) {//remove empty itemnumbers
        if(!empty($anzahl[$i])) {
         $anz[] = $anzahl[$i];
      $art[] = $artikelnummer[$i];
 }
    }
    $i = 0;
    foreach($art as $key => $value) {// create one array
        if (!empty($anz[$i])) {
            $in[$art[$i]] = $anz[$i];
       $i++;
 }
    }

## update item counts
        $itemNumbers = implode(',', $art);
$res =& $this->db->query("
    SELECT
        artikelnummer, anzahl
    FROM
        warenkorb
    WHERE
 sid = '".$this->sid."'
    AND
        artikelnummer
    IN
        (".$itemNumbers.")
");

$old = array();
if($res->numRows() > 1) {
    while($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
    $old[$row['artikelnummer']] = $row['anzahl'];
    $result =& $this->db->query("
        UPDATE
     warenkorb
        SET
     anzahl = '".$in[$row['artikelnummer']]."'
 WHERE
            sid = '".$this->sid."'
 AND
     artikelnummer = '".$row['artikelnummer']."'
    ");
}
       print_r($old);

Bin ratlos.

  1. Hello,

    Bin ratlos.

    Angesichts Deines Codes ohne nähere Erläuterungen bin ich es auch. Mit Aufwand könnte ich _vielleicht_ verstehen, was Du damit vor hattest. Besser wäre aber wohl, Du beschreibst nochmal fertig, was Du erreich wolltest.

    Was soll denn mit den Artikeln passieren, für die es zwar im Array aber nicht in der DB einen Eintrag gibt?

    Außerdem wirst Du Dir Deine for()-Schleifen schenken können.
    Die ganze Aufgabe wird sich vermutlich mit einer einzigen foreach()-Schleife lösen lassen.

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

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    1. Moinsen,

      Bin ratlos.

      Haettest du das Script _selbst_ geschrieben dann wuesstes du evtl. auch was es macht und was nicht.
      Tipp: http://de.php.net

      Gruss/Danke/Bitte
      mfg nuss

      --
      Learning by Doing - probieren geht ueber studieren!
      Haetten das die Leute frueher nicht gemacht haetten wir heute keine Computer ;-)
      (Wer kaempft kann verlieren, wer nicht kaempft, hat schon verloren!)
      1. Bin ratlos.
        Haettest du das Script _selbst_ geschrieben dann wuesstes du evtl. auch was es macht und was nicht.
        Tipp: http://de.php.net

        Hääää? Verstehe ich nicht. Natürlich habe ich das selbst geschrieben.
        Wozu soll das Forum denn da sein. Soll ich hier Fragen stellen, die ich selber beantworten kann?

    2. Außerdem wirst Du Dir Deine for()-Schleifen schenken können.
      Die ganze Aufgabe wird sich vermutlich mit einer einzigen foreach()-Schleife lösen lassen.

      Na dann lass mal hören.

      1. Hello,

        Außerdem wirst Du Dir Deine for()-Schleifen schenken können.
        Die ganze Aufgabe wird sich vermutlich mit einer einzigen foreach()-Schleife lösen lassen.

        Na dann lass mal hören.

        Bisschen überzogene Erwartungshaltung von Dir!
        Erklär doch nochmal auf deutsch, was Dein Script womit und wann genau machen soll.

        Und wenn Du dann die Konstruktionen in 'deinem' Script noch mit Kommentaren versehen würdest und insbesondere dazuschreibst, was nicht funktioniert und wie Du das festgestellt hast, dann könnten wir Dir bestimmt auch helfen, die (Denk-)Fehler zu beseitigen.

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

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        1. Hallo Tom,

          die Kommentare sind doch drin. "dann las mal hören" habe ich nur gesagt, weil ich echt an der Funktion zu knacken habe und du so einfach sagtest es ginge mit nur einer foreach Schleife. Das fand ich sehr demotivierend.

          Also an die Funktion gehen zwei Arrays. Diese stammen aus einem Formular. Das erste beinhaltet die Artikelnummern das zweite die Anzahl, die der Benutzer eingegeben hat.
          Das Formular ist eine Tabelle. Erste Spalte Artikelnummern und in der zweiten das dazugehörige eingabefeld. Da evntl nur in ein Eingabefeld eine Anzahl eingegeben wurde, schmeißt die for Schleife alle leeren Einträge raus.

          Die Foreach Schleife erzeugt aus beiden Arrays ein einziges, dessen Index die Artikelnummer ist und der Wert die Anzahl.

          Folgender Code nimmt die Artikelnummern in einem Array $art und holt die Artikel mit den gleichen Artikelnummern aus de DB.

          update item counts

          $itemNumbers = implode(',', $art);
              $res =& $this->db->query("
                  SELECT
               artikelnummer, anzahl
           FROM
               warenkorb
                  WHERE
               sid = '".$this->sid."'
                  AND
               artikelnummer
           IN
              (".$itemNumbers.")
              ");

          $old = array();
          if($res->numRows() > 1) {
              while($row =& $res->fetchRow(DB_FETCHMODE_ASSOC)) {
                  $old[$row['artikelnummer']] = $row['anzahl'];
             $result =& $this->db->query("
                      UPDATE
                   warenkorb
                      SET
                   anzahl = '".$in[$row['artikelnummer']]."'
               WHERE
                   sid = '".$this->sid."'
               AND
                          artikelnummer = '".$row['artikelnummer']."'
               ");
                         }

          Das array $old beinhaltet beinhaltet die Artikelnummern die schon in der DB waren. $old benötige ich für einen zweiten Teil der Funktion, den ich nicht gepostet habe und der bereits funktioniert.
          In der while Schleife sollen die Artikelnummer aktualisiert werden. Werden sie aber nicht. Sondern es werden, obwohl die Artikelnummern bereits vorhanden sind, neue Zeilen mit derselben angelegt.

          Jetzt verständlicher ? :)

          1. Hier ist noch mal die ganze Funktion:

            http://www.pastebin.com/120600

          2. Hello,

            Also an die Funktion gehen zwei Arrays. Diese stammen aus einem Formular. Das erste beinhaltet die Artikelnummern das zweite die Anzahl, die der Benutzer eingegeben hat.

            Überleg mal:
            über welchen Weg sind die beiden Arrays harmonisiert?
            Du musst ja einem Artikel auch immer eine Anzahl zuordnen können.

            Über welches Array und welche Sortierung wird abgearbeitet?

            Wie könnte man nun die dauzugehörigen Werte aus dem zweiten Array dazu holen, prüfen ob beide wertig sind und dann verarbeiten?

            Besser wäre es aber tatsächlich, ein einziges Multiupdate durchzuführen. Das geht aber nur, wenn man das Filter passend gestalten kann. Du willst Ja nur bestimmte Sätze mit bestimmten Werten überscheiben. Es wird also daher wahrscheinlich auf mehrere Updates in einer Schleife herauskommen. Di kann man dann auch gleich in der foreach()-Schliefe durchführen, die das Artikelnummernarray durchläuft und die Mengen dazu holt.

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

            Tom

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