detlevk: Frmulardaten lassen sich nicht ändern

Beitrag lesen

Und wieder einmal muss ich euch mit einem Anfängerproblem belästigen. Ich hoffe, dass meine Darstellung einigermaßen übersichtlich ist, wenn auch leider etwas lang (wg. vollständigem Code):

Kurzbeschreibung des Projekts Es soll ein Shop mit PHP und MySQL erstellt werden. In diesem Shop gibt es einen Warenkorb. Dieser ist als assoziatives Array angelegt, das in der Session registriert wird. Die Anzeigeseite eines bestimmten Artikels enthält diese Buttonleiste:

Buttonleiste Von der Anzeigeseite eines bestimmten Artikels soll dieser durch Klick auf das Symbol In Warenkorb dem Warenkorb hinzugefügt werden. Das Symbol Warenkorb dient der Ansicht des derzeitigen Bestandes im Warenkorb ohne etwas zu verändern. Die Ansicht des Warenkorbes soll nach Hinzufügen eines Artikels z.B. so aussehen: Warenkorb Durch den grünen Button soll die Anzahl je Klick um 1 erhöht werden, der rote Button vermindert um 1. Das Mülltonnensymbol löscht den Artikel komplett aus dem Warenkorb. Der Button mit dem durchgestrichenen Warenkorbsymbol löscht den kompletten Warenkorb. Durch Klick auf den Button „Bestellung“ kommt man zu einer Eingabemaske für die notwendigen Daten: Maske Die roten Sterne markieren die verpflichtenden Eingaben. Ebenfalls verpflichtend ist die Checkbox zur Kenntnisnahme der AGB.

Code des Formulars: (Ausschnitt aus Maske.php)

<form method="post" action="Checkout.php" name="Bestellung">
<table style="background-color: rgb(204, 204, 204);
              width: 534px; height: 366px;
              text-align: left; margin-left: auto; margin-right: auto;"
       border="0" cellpadding="2" cellspacing="2">
<tbody><tr><td style="text-align: left; background-color: rgb(204, 204, 204);">Anrede:</td>
<td style="text-align: left;">
<select name="anrede">
<option>Frau</option>
<option>Herr</option></select></td></tr>
<tr><td style="text-align: left;">Vorname:<span style="color: rgb(255, 0, 0);">*</span></td>
<td style="text-align: left;"><input maxlength="50" size="50" name="vorname"></td></tr>
<tr><td style="text-align: left;">Name:<span style="color: rgb(255, 0, 0);">*</span></td>
<td style="text-align: left;"><input maxlength="50" size="50" name="nachname"></td></tr>
<tr><td style="text-align: left;">Anschrift:<span style="color: rgb(255, 0, 0);">*</span></td>
<td style="text-align: left;"><input maxlength="50" size="50" name="anschrift"></td></tr>
<tr><td style="text-align: left;">PLZ:<span style="color: rgb(255, 0, 0);">*</span></td>
<td style="text-align: left;"><input maxlength="12" size="12" name="plz"></td></tr>
<tr><td style="text-align: left;">Ort:<span style="color: rgb(255, 0, 0);">*</span></td>
<td style="text-align: left;"><input maxlength="50" size="50" name="ort"></td></tr>
<tr><td style="text-align: left;">Land:<span style="color: rgb(255, 0, 0);">*</span></td>
<td style="text-align: left;">
<select name="land">
<option>Deutschland</option>
<option>&Ouml;sterreich</option>
<option>Schweiz</option>
<option>Niederlande</option>
<option>Belgien</option>
<option>Luxemburg</option></select></td></tr>
<tr><td style="text-align: left;">Telefon:</td>
<td style="text-align: left;"><input name="tel"></td></tr>
<tr><td style="text-align: left;">Email:<span style="color: rgb(255, 0, 0);">*</span></td>
<td style="text-align: left;"><input maxlength="50" size="50" name="email"></td></tr>
<tr><td>Nachricht:</td><td><textarea cols="50" rows="5" name="textfeld"></textarea></td></tr>
<tr><td style="text-align: right;"><input name="agb" type="checkbox"></td>
<td>Die <a href="AGB.html">allgemeinen Gesch&auml;ftsbedingungen</a>
habe ich zur Kenntnis genommen.</td></tr><tr><td></td>
<td style="text-align: center;">
<input value="Abschicken" type="submit">
<input value="L&ouml;schen" type="reset"></td></tr>
</tbody></table>
</form>

Nach dem Abschicken erscheint eine Übersicht, bei der sowohl die erfassten Lieferdaten als auch die Bestellliste angezeigt werden: Zusammenfassung

Die Lieferdaten werden von diesem Skript (Checkout.php) aus dem Webformular entnommen, ausgewertet und ebenfalls in der Session registriert. Der obere graue Ändern-Button ruft die Maske (Maske.php) wieder auf, um die Daten dort neu einzugeben. Der untere, noch weiße Ändern-Button ruft den Warenkorb wieder auf (Liste.php), um dort Änderungen vorzunehmen.

Code Checkout.php:

<?php
session_start();
$_SESSION['anrede'] = $anrede;
$_SESSION['vorname'] = $vorname;
$_SESSION['nachname'] = $nachname;
$_SESSION['anschrift'] = $anschrift;
$_SESSION['plz'] = $plz;
$_SESSION['ort'] = $ort;
$_SESSION['land'] = $land;
$_SESSION['tel'] = $tel;
$_SESSION['email'] = $email;
$_SESSION['textfeld'] = $textfeld;
$_SESSION['agb'] = $agb;
function fehler()
{
  ?>
  <h1 align=center>Unvollständige Eingabe!</h1><br>
  <p align=center><a href="javascript:history.back();">Zur&uuml;ck</a></p>
  <?php
}
function versand_berechnen($land, $paket, $reg)
{
  if ($land == "Deutschland")
  {
    if ($paket)
    {
      $versand = 5; //Versand als Paket
    }
    else
    {
      $versand = 2.5; //Versand als Brief
    }
  }
  else if ($land == "Schweiz")
  {
    if ($paket)
    {
      $versand = 30; //Versand als Paket außerhalb EU
    }
    else if ($reg)
    {
      $versand = 8; //Versand als Einschreiben
    }
    else
    {
      $versand = 5; //Versand als Brief
    }
  }
  else
  {
    if ($paket)
    {
      $versand = 17; //Versand als Paket in EU
    }
    else if ($reg)
    {
      $versand = 8; //Versand als Einschreiben
    }
    else
    {
      $versand = 5; //Versand als Brief
    }
  }
  return $versand;
}
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
  <meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <meta name="generator" content="PSPad editor, www.pspad.com">
  <title>Zusammenfassung</title>
  </head>
  <body>
  <?php
  if (empty($vorname) || empty($nachname) || empty($anschrift) || empty($plz)
      || empty($ort) || empty($email) || empty($agb))
  {
    fehler();
  }
  else
  {
    $erfasst = 1; //Daten erfolgreich erfasst
    $_SESSION['erfasst'] = $erfasst;
    ?>
    <p align=center><img alt='Logo' src='../Logos/Logo_lang.gif'></p>
    <h1 align=center>Zusammenfassung:</h1>
    <?php
    if ($textfeld)
    {
      $width = 600;
    }
    else
    {
      $width = 300;
    }
    ?>
    <table align=center width=<?=$width?>>
    <tr><td valign=top><h2>Lieferanschrift:</h2></td>
    <?php
    if ($textfeld)
    {
      echo "<td valign=top><h2>Ihre Nachricht:</h2></tr>";
    }
    else
    {
      echo "</tr>";
    }
    echo "<tr><td>$vorname $nachname<br>$anschrift<br>";
    echo "$plz $ort<br>$land<br>";
    echo "$tel</td>";
    if ($textfeld)
    {
      echo "<td width=50% valign=top>$textfeld</td></tr>";
    }
    else
    {
      echo "</tr>";
    }
    ?>
    </table>
    <p align=center><a href="Maske.php">
    <img alt="&Auml;ndern" src="../Buttons/Aendern_grau.gif" border=0></a></p>
    <h2 align=center>Ihre Bestellung:</h2>
    <table align=center><tr><th></th><th>BestNr</th><th>Bezeichnung</th>
    <th>Anzahl</th><th>Preis</th><th>Gesamtpreis</th>
    <?php
    //Ausgabe der Artikelliste
    $zaehler = 1;
    foreach ($korb as $key => $wert)
    {
      $zwisu = sprintf("€%7.2f ", $wert[1] * $wert[2]);
      $zeile = "<tr><td>$zaehler.</td><td>$key</td>";
      $zeile .= "<td>$wert[0]</td><td align=right>$wert[1]</td><td>€ $wert[2]</td>
                 <td align=right>$zwisu</td></tr>";
      echo $zeile;
      $sumItem = $sumItem + $wert[1]; //Gesamtzahl aufsummieren
      $sumPrice = $sumPrice + ($wert[1] * $wert[2]); //Gesamtpreis aufsummieren
      $sumZeile = "<tr><td></td><td></td><td><b>Zwischensumme:</b></td>
                   <td align=right><b>$sumItem</b></td>";
      $sumZeile .= "<td></td><td align=right>
                    <b>€ ".number_format($sumPrice, 2, ',', '.')."</b></td></tr>";
      $zaehler++;
      if ($land == "Deutschland" && $wert[3] == 5 || $sumPrice > 40)
      {
        $paket = 1; //Flag für Versand als Paket
      }
      else if ($land != "Deutschland" && $wert[4] == 8 || $sumPrice > 20)
      {
        $reg = 1; //Flag für Versand als Einschreiben
      }
    }
    echo $sumZeile;
    $versand = versand_berechnen($land, $paket, $reg);
    $versand = number_format($versand, 2, ',', '.');
    echo "<tr><td></td><td></td><td>Versand:</td><td></td><td></td>
          <td align=right>€ $versand</td></tr>";
    $gesamt = $sumPrice + $versand;
    $gesamt = "€ ".number_format($gesamt, 2, ',', '.');
    echo "<tr><td></td><td></td><td><b>Gesamtsumme:</b></td><td></td><td></td>
          <td align=right><b>$gesamt</b></td></tr></table>";
    ?>
    <p align=center>
    <a href="Liste.php">
    <img alt="&Auml;ndern" src="../Buttons/Aendern.gif" border=0></a>
    <a href ="Erfassung.php">
    <img alt="Abschlie&szlig;en" src="../Buttons/Abschliessen.gif" border=0></a>
    </p>
    <?php
  }
  ?>
  </body>
</html>

Problem: Der Warenkorb kann beliebig geändert werden. Die Lieferdaten oben aber können, wenn sie registriert sind, nicht mehr geändert werden! Ohne Registrierung gehen sie aber im Falle einer Änderung des Warenkorbs verloren. Unverständlich: Der Warenkorb ist auch in der Session registriert und wird durch die Änderungen nach Belieben überschrieben. Warum werden die Formulardaten nicht mehr überschrieben?