Ich habe Tests gefahren, so mit 100 Seiten aufreufen etc. und bin zu dem Schluß gekommen, das die Datenbank schneller ist als die Session-Variable,
Nein, das ist unmöglich. Erstens führst Du in dem problematischen Skript überhaupt keine Änderung an $UserID durch und zweitens stehen alle externen Variablen mit Beginn des Skriptablaufs zur Verfügung.
Dein Skript scheint funktionsmäßig korrekt zu sein, es müßte sich also um ein Cache-Problem handeln. Versuche nochmal, die <meta>-Angaben wie beschrieben per header() auszugeben.
Davon unabhängig würde ich Dir wirklich ans Herz legen, den Warenkorb in die Session zu legen - Du ersparst Dir damit bestimmt die Hälfte vom Code, weil die ganzen voluminösen mysql-Geschichten wegfallen.
Der "elseif ($Steuerung = 'update')"-Block beispielsweise kann mit allen Eventualitäten auf folgende kurze Zeilen zusammenschrumpfen:
if (isset($_SESSION["artikel"][$MaterialID]))
if ($Art=="plus")
$_SESSION["artikel"][$MaterialID]++;
else
$_SESSION["artikel"][$MaterialID]--;
else
$_SESSION["artikel"][$MaterialID]=1;
Weiterhin solltest Du unbedingt:
-
register_globals ausschalten und die superglobals $_GET und $_SESSION verwenden, so wie Du es bereits mit $_POST machst. Mit register_globals versaust Du Dir den gesamten Namensraum und öffnest unter Umständen auch noch Sicherheitslöcher, weil man dem Skript gerade bei den URL-Parametern ohne Aufwand x-beliebige Variablen unterjubeln kann. Das ist auch der Grund, warum register_globals jetzt standardmäßig ausgeschaltet ist und diese superglobals eingeführt wurden.
-
Die Session startest Du besser mit session_start(). Damit entfällt die Registrierung jeder einzelnen Variable, weil Du einfach auf $_SESSION zugreifen kannst - jegliche Änderung darin wird beim Skriptende automatisch gespeichert.
-
Du solltest Daten, die nicht mit 110%-iger Sicherheit aus Zahlen bestehen, immer mit htmlentities() ausgeben. In Deinem Fall betrifft das insbesondere Hersteller- und Artikelname, aber durchaus auch andere Variablen.
-
Du solltest Dich eventuell mit mysql_escape_string() vertraut machen.
-
Deine URLs sind falsch. Das Zeichen & darf in HTML niemals alleine stehen, auch nicht in href-Attributen oder ähnlichem. Willst Du ein Und haben, benutze &. Oder konfiguriere Dein PHP so, daß es auch das Semikolon als Trennzeichen akzeptiert. Siehe auch http://validator.w3.org.
Gruß,
soenk.e