# Warenkorbinhalt (Session) in Datenbank speichern?!



## FairfaX (2. Juni 2011)

Hallo zusammen!

Ich arbeite jetzt schon seit einer Woche an einem Warenkorb-script mit Datenbankbasierten Login- und Registerbereich, welche auch alle funktionieren .

Nun hab ich ein Problem, ich muss diese Warenkorb Session sprich den ausgewählten Warenkorbinhalt in eine Datenbank speichern.

Tja und jetzt weis ich nicht mehr weiter , ich habe schon sämtliche Methoden aus verschieden Foren probiert aber irgendwie hakt es... 

Ich hoffe mir kann jemand helfen bzw. einen Denkanstoss geben  wie ich dieses Problem lösen könnte.

p.s. habe es mit session_set_save_handler()-Funktion auch probiert, aber verstehe es nicht ganz.....

Hier meine Warenkorb.php und Index.php

Indexx.php

```
<?php require warenkorb.php'; ?>

<html>
<head>

</head>
<body>

<?php warenkorb(); ?>
<br /><br />
<?php produkte(); ?>

</body>
</html>
```


Warenkorb

warenkorb.php

```
<?php

session_start();

$page = 'indexx.php';

mysql_connect ('localhost','root','') or die (mysql_error());
mysql_select_db('warenkorb') or die(mysql_error());


if (isset($_GET['add'])) {
   $menge =mysql_query('SELECT id, menge FROM produkte WHERE id='.mysql_real_escape_string((int)$_GET['add']));
    while ($menge_row = mysql_fetch_assoc($menge)) {
          if ($menge_row['menge']!=$_SESSION['cart_'.(int)$_GET['add']]) {
             $_SESSION['cart_'.(int)$_GET['add']]+='1';

          }
   }
   header('Location: '.$page);
}

if (isset($_GET['remove'])) {
  $_SESSION['cart_'.(int)$_GET['remove']]--;
  header('Location: '.$page);
}

if (isset($_GET['delete'])) {
  $_SESSION['cart_'.(int)$_GET['delete']]='0';
  header('Location: '.$page);
}
echo "<h3>Artikel im Einkaufswagen</h3>";

function produkte () {
 echo "<h3>Vorhandene Artikel</h3>";
 $get = mysql_query('SELECT id, name, beschreibung, preis FROM produkte WHERE menge > 0 ORDER BY id DESC');
 if (mysql_num_rows($get)==0) {
   echo "Keine Artikel vorhanden!";
}
 else {
    while ($get_row = mysql_fetch_assoc($get)) {
          echo '<p>'.$get_row['name'].'<br />'.$get_row['beschreibung'].'<br />&euro;'.number_format($get_row['preis'], 2).' <a href="warenkorb.php?add='.$get_row['id'].'">Add</a></p>';

    }
  }
}

function warenkorb() {
  foreach($_SESSION as $name => $value) {
   if ($value>0) {
     if (substr($name, 0, 5)=='cart_') {
        $id = substr($name, 5, (strlen($name)-5));
        $get = mysql_query('SELECT id, name, preis FROM produkte WHERE id='.mysql_real_escape_string((int)$id));
        while ($get_row = mysql_fetch_assoc($get)) {
         $sub = $get_row['preis']*$value;
         echo $get_row['name'].' x '.$value.' für &euro;'.number_format($get_row['preis'], 2).'  = &euro; '.number_format($sub, 2).' <a href="warenkorb.php?remove='.$id.'">[-]</a> <a href="warenkorb.php?add='.$id.'">[+]</a> <a href="warenkorb.php?delete='.$id.'">[Löschen]</a><br />';
        }
     }
     $total += $sub;
   }
  }
  if ($total==0) {
    echo "Ihr Warenkorb ist leer.";
  }
  else {
   echo '<p>Gesamt: &euro;'.number_format($total, 2).'</p>';
    echo "<h5><a href='bestellung.php'>Bestellung abschließen</a> </h5>";

  }
}


?>
```


----------



## saftmeister (2. Juni 2011)

Viel einfacher wäre es, wenn du eine Cart-Klasse baust, oder statt einfach alles direkt in $_SESSION zu speichern, vorher in ein Array packen und dann das Array in $_SESSION speichern. Dann kannst du nämlich ganz einfach das komplette Array serialisieren und in der DB ablegen.

Da ich allerdings die Vermutung habe, das du mit in der DB speicher meinst, das die gekauften Artikel einer Bestellung zugeordnet werden sollen: Du brauchst eine Tabelle Bestellungen, welche ID+Bestellnummer+UserID+ArtikelID+Menge und ggf. den Preis aufnehmen kann, sprich du brauchst die Spalten dafür. Einen INSERT-Query kann man dann ja problemlos vornehmen.

Oder für welchen Zweck soll das Speichern denn nun stattfinden?


----------



## FairfaX (2. Juni 2011)

Danke saftmeister, für deine schnelle Antwort! 

Zur Speicherung:
Stimmt, die Artikel sollen einer Bestellung zugeordnet werden ( m zu n Beziehung?) da bräucht ich doch noch eine Tabelle z.B. BestellPosition oder....?

Und der Code müsste dann so aussehen oder?: (Funktioniert nicht)


```
$query = "INSERT INTO bestellungen (id, name, preis, menge) 
VALUES ('$_SESSION . cart_() . ')"; 
          $abfsessions = mysql_query($query); 
          if (!$abfsessions) die ("Fehler in der Abfrage");
```



Gruß


----------



## saftmeister (2. Juni 2011)

Nein, wenn du 4 Spalten angibst, musst du auch 4 Spalten füllen. Angenommen, du hast ein Array $cart, was in der Session liegt und so aussieht:


```
$cart = array(
  'user' => '1234',   // Mal angenommen, das wäre die ID des Users saftmeister
  'bestellartikelliste' => array(  // Artikel im Warenkorb sind ja evtl. mehrer, also wieder ein array
     1 => array(       // Artikel haben Eigenschaften wie ID, Artikelnummer, Preis, Farbe, Größe, etc. 
        id => 567,
        artikel_nr => 'ABC123',
        bez => 'Waschmaschine "Superweiß"',
        umdr_pro_min => 1500,
        farbe => 'weiss'
        preis => 500.0,
        anzahl => 1,
     ),
     2 => array(        // Und noch ein Artikel mit bestimmten Attributen
        id => 789,
        bez => 'Kühlschrank Superfreeze',
        artikel_nr => 'DEF987',
        farbe => 'marinblau',
        preis => 250.0,
        anzahl => 1
     )
  )
);

// Den Waren-Korb in die Session
$_SESSION['cart'] = $cart;
```

An anderer Stelle kannst du dann auf die Elemente im Warenkorb zugreifen, um sie in die Bestellungstabelle zu schreiben:


```
$cart = $_SESSION['cart'];

foreach($cart['bestellartikelliste'] as $bestellartikel)
{
   
   $query = sprintf("INSERT INTO bestellungen (artikelid, name, preis, menge) VALUES (%d, %s, %f, %d)",
      $bestellartikel['id'], $bestellartikel['bez'], $bestellartikel['preis'], $bestellartikel['anzahl']
   );
   mysql_query( $query ) or die( mysql_error() );

   $insert_id = mysql_insert_id();

   // Hier die insert_id benutzen, um sie in eine Kreuz-Tabelle zu schreiben - wegen Normalisierung
}
```


----------



## FairfaX (2. Juni 2011)

ok, danke werde es jetzt mal ausprobieren!


----------



## FairfaX (4. Juni 2011)

Hallo,

also ich habe den Code jetzt angepasst und eingefügt, aber irgendwie tut sich da nichts... 

Deshalb wollte ich fragen, ob mir jemand zeigen kann wo und wie ich den Code in meine Warenkorb.php einfügen muss, damit die Inhalte in der Datenbank gespeichert werden.

Ich komm einfach nicht weiter und wäre für jede Hilfe dankbar!


----------



## saftmeister (4. Juni 2011)

Wenn du jetzt noch die Warenkorb.php posten würdest, und beschreibst, wie du vorgehen willst, damit die Werte in die DB geschrieben werden (ungefährer Ablauf), könnte man evtl. weiter helfen.


----------



## FairfaX (4. Juni 2011)

Ok, ich habe eine Datenbank (warenkorb) mit 2 Tabellen (1. produkte und 2.bestellung).

Dazu habe ich zwei php Dateien.

1. Indexx.php
2. Warenkorb.php

Die Warenkorb.php beinhaltet 2 Schleifen. Die erste Schleife (function produkte) ruft die vorhandenen Produkte aus der Datenbank ab.

Die zweite (function warenkorb), zeigt die ausgewählten Produkte in der Session 
$_SESSION['warenkorb_'] an.

Nun sollen beim Klick auf Bestellung abschließen, alle Produkte, die sich in der $_SESSION['warenkorb_'] in die Datenbank eingetragen werden. 

Ich wollte dies so machen, dass die Produkte = id, name, menge und preis, welche sich in der $_SESSION['warenkorb_'] befinden in die Datenbank gespeichert werden, aber ich hab es bis jetzt nicht hinbekommen.

Zuerst habe ich es über INSERT INTO versucht, dann mit dem session__set_save_handler versucht, bin aber kläglich gescheitert. auf anraten von saftmeister habe ich es mit array code aber ohne erfolg

Das Problem liegt wahrscheinlich daran, dass man die $_SESSION['warenkorb_'] auslesen muss und dann kann man erst die Variablen in die Datenbank bestellung -> speichern. und genau hier komm ich nicht weiter...



Indexx.php

```
<?php require warenkorb.php; ?> 

<html> 
<head> 

</head> 
<body> 

<?php warenkorb(); ?> 
<br /><br /> 
<?php produkte(); ?> 

</body> 
</html>
```



Warenkorb.php

```
<?php

session_start();


$page = 'indexx.php';

mysql_connect ('localhost','root','') or die (mysql_error());
mysql_select_db('warenkorb') or die(mysql_error());


if (isset($_GET['add'])) {
   $menge =mysql_query('SELECT id, menge FROM produkte WHERE id='.mysql_real_escape_string((int)$_GET['add']));
    while ($menge_row = mysql_fetch_assoc($menge)) {
          if ($menge_row['menge']!=$_SESSION['warenkorb_'.(int)$_GET['add']]) {
             $_SESSION['warenkorb_'.(int)$_GET['add']]+='1';

          }
   }
   header('Location: '.$page);
}

if (isset($_GET['remove'])) {
  $_SESSION['warenkorb_'.(int)$_GET['remove']]--;
  header('Location: '.$page);
}

if (isset($_GET['delete'])) {
  $_SESSION['warenkorb_'.(int)$_GET['delete']]='0';
  header('Location: '.$page);
}
echo '<span style="font-family:Verdana;font-size:large;font-weight:bold;color:blue;">Artikel im Einkaufswagen</span><br /><br />';

function produkte () {
 echo "<h3>Vorhandene Artikel</h3>";
 $get = mysql_query('SELECT id, name, beschreibung, preis FROM produkte WHERE menge > 0 ORDER BY id DESC');
 if (mysql_num_rows($get)==0) {
   echo "Keine Artikel vorhanden!";
}
 else {
    while ($get_row = mysql_fetch_assoc($get)) {
          echo '<p>'.$get_row['name'].'<br />'.$get_row['beschreibung'].'<br /><br />Preis: &euro;'.number_format($get_row['preis'], 2).'  <a href="warenkorb.php?add='.$get_row['id'].'">ADD</a></p>';

    }
  }
}




function warenkorb() {
  foreach($_SESSION as $name => $value) {
   if ($value>0) {
     if (substr($name, 0, 10)=='warenkorb_') {
        $id = substr($name, 10, (strlen($name)-10));
        $get = mysql_query('SELECT id, name, preis FROM produkte WHERE id='.mysql_real_escape_string((int)$id));
        while ($get_row = mysql_fetch_assoc($get)) {
         $sub = $get_row['preis']*$value;
         echo $get_row['name'].' x '.$value.' für &euro;'.number_format($get_row['preis'], 2).'  = &euro; '.number_format($sub, 2).' <a href="warenkorb.php?remove='.$id.'">[-]</a> <a href="warenkorb.php?add='.$id.'">[+]</a> <a href="warenkorb.php?delete='.$id.'">[Löschen]</a><br />';
        }
     }
     $gesamt += $sub;
   }
  }
  if ($gesamt==0) {
    echo "Ihr Warenkorb ist leer.";
  }
  else {
   echo '<p>Gesamt: &euro;'.number_format($gesamt, 2).'</p>';
    echo "<h5><a href='bestellung.php'>Bestellung abschließen</a> </h5>";



  }
}




?>
```


----------



## saftmeister (4. Juni 2011)

Ein INSERT INTO ist aber genau das richtige, um es in der DB abzulegen. Hier mal ein Entwurf:


```
// Hier müsstest du die Variablen $id, $name, $menge und $preis mit den Werten aus warenkorb_ befüllen
$query = "INSERT INTO bestellungen (id, name, menge, preis) VALUES ($id, $name, $menge, $preis)";
mysql_query( $query ) or die ( mysql_error() );
```

Das ist als Schablone allgemein für MySQL-Datenbank-Abfragen (INSERT gehört dazu) zu sehen.


----------

