• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Variable überschreibt sich, ohne dass ich es will

Status
Für weitere Antworten geschlossen.

kdkmoorhuhn

Neues Mitglied
Hallo erstmal zusammen, bin nach langer Zeit mal wieder hier im Forum, da ich für einen Freund einen kleinen Shop bastle und dafür hab ich eine Frage. Erstmal der Code:
PHP:
while ($buch= mysql_fetch_assoc($result)) {
 $id = $buch['id'];
 if (!isset($_POST[$id])){
  $_POST[$id] = 0;
 }
 echo "<div><form action = '$_SERVER[PHP_SELF]' method = 'post'>Menge: <input type='text' maxlength='3' size='4' value='$_POST[$id]' name= '$id' > $buch[preis] <input type = 'submit' value = 'Bestellen' name = 'submit'></form></div>";
 if (isset($_POST[$id]) && isset($_POST['submit']) && !is_null($_POST[$id])) {
  $_SESSION[$id] = $_POST[$id];
 }
}
foreach ($_SESSION as $key => $value) {
    echo "Schlüssel: $key; Wert: $value<br />\n";
}

Zur Erklärung:
Die Schleife liest die Datenbank aus, was wunderbar klappt, damit werden die Produkte angezeigt (da es klappt steht es nicht im geposteten Code drin). Es wird nun ein Eingabefeld produziert wo der Benutzer die Menge angeben kann, diese Eingabe wird in einem Session gespeichert, das natürlich gestartet wurde. Wenn ich jetzt in einem Feld was eintrage, dann wird das auch im Session gespeichert und kann ausgelesen werden.

Zum Problem:
Sobald ein Feld abgeschickt wird, wird zwar das entsprechende Feld in der Session auf den neuen Wert gesetzt, z.B. ein Produkt mit der id = 5 und der eingegebenen Menge 10 wird zu $_SESSION[5]=10 alle andern Felder der Session, z.B. $_SESSION[4] bekommen den "Wert" NULL zugewiesen, was ich natürlich verhindern will, da ich sonst es nicht vernünftig zu meinem Warenkorb übertragen kann.

Jemand eine Idee?

Vielen Dank schon mal für die Mühe, das durchzulesen
 
escape halt mal richtig und schreib' die arrays korrekt...

PHP:
<?php
 echo '<div>
<form action = "'.$_SERVER['PHP_SELF'].'" method = "post">
Menge:
<input type="text" maxlength="3" size="4" value="'.$_POST['id'].'" name= "'.$id.'" > '.$buch['preis'].'
<input type = "submit" value = "Bestellen" name = "submit">
</form>
</div>';
?>

Nils aka XraYSoLo
 
Vielen Dank für die Idee, auch wenn deine Variante syntaktisch (oder wie das heißt) sicher die korrektere ist, ändert das am Ergebnis rein gar nix, da meine Variante, wie ich es formuliere problemlos geschluckt wird. Das zentrale Problem ist, dass das nicht betroffene Session Feld überschrieben wird, obwohl ich es versuche, durch diese Schleife zu verhindern:
PHP:
if (isset($_POST[$id]) && isset($_POST['submit']) && !is_null($_POST[$id])) {
  $_SESSION[$id] = $_POST[$id];
}
was aber offensichtlich nicht funktioniert.

Über weitere Ideen wäre ich sehr dankbar
 
du machst die arrays ja schon wieder falsch...
...was soll das hier darstellen?

PHP:
<?php
$_SESSION[$id]
?>

? falscher gehts ja gar nicht mehr...
...

PHP:
<?php
//so
$_SESSION['id'];

//und NICHT so
$_SESSION[$id];

//steht aber alles oben
?>

Nils aka XraYSoLo
 
Danke nochmals für die Hilfe, aber ich glaub du verstehst nicht so ganz, was ich will, ich versuch es nochmal auführlich zu erklären:
PHP:
while ($buch= mysql_fetch_assoc($result)) {
//hier wird die Datenbank ausgelesen, denke, dass das klar ist
  $id = $buch['id'];
//hier wird der Variablen $id der jeweils zum Datenabfrage passende Wert 
//zugewiesen, z.B. wenn der 5. Artikel der Datenbank die id 8 hat, dann ist $id = 8
  if (!isset($_POST[$id])){
    $_POST[$id] = 0;
  }
//Diese Schleife ist weniger wichtig, da sie nur zur unterdrückung von
//Fehlermeldung ist
  echo "<div><form action = '$_SERVER[PHP_SELF]' method=       'post'>Menge: <input type='text' maxlength='3' size='4' value='$_POST[$id]' name= '$id' > $buch[preis] <input type = 'submit' value = 'Bestellen' name = 'submit'></form></div>";
//value='$_POST[$id]' bewirkt, dass wenn man in das input Feld was 
//einträgt, 
//und auf Submit drückt, dass beim Wiederaufruf des Fensters der 
//eingetragene Wert wieder drinsteht name ='$id' ordnet den Wert der 
//jeweiligen Wert der Produkt-id zu, dass führt dazu, 
//dass in $_POST[$id] die zu jedem Produkt passende Menge drinsteht, 
//d.h. wenn man 5 Dinge des Produkts mit der id= 9 kaufen will, ist $_POST[9] = 5
  if (isset($_POST[$id]) && isset($_POST['submit']) && !is_null($_POST[$id])) {
  $_SESSION[$id] = $_POST[$id];
  }
//auch wenn das komisch aussieht, es hat schon seine Richtigkeit, ich will 
//nämlich einfach den Wert des $_POST arrays in das $_SESSION array 
//übernimmt, wenn ich $_SESSION['id'] schreiben würde, dann würde 
//jedesmal der neue Mengenwert die alten überschreiben, was ich aber will
// ist: Wenn der User bei dem Produkt mit der id = 1 eine Menge von 5 
//ordert, dass $_SESSION['1'] = '5'. Was ich außerdem will, und was nicht 
//funktioniert, wenn der User anschließend von dem Produkt mit der id = 2 
//eine Menge von 10 ordert, dass $_SESSION['2'] = 10 
//(soweit funktionierts noch, aber:) UND, dass $_SESSION['1'] = 5 
//erhalten bleibt (funktioniert nicht, da aus irgendwelchen Gründen 
//$_SESSION['1'] = NULL gesetzt wird). Also brauch ich irgendeine 
//zusätzliche Kontrollstruktur oder ähnliches die verhindert, dass nicht 
//betroffene Werte der SESSION überschrieben werden
}
foreach ($_SESSION as $key => $value) {
    echo "Schlüssel: $key; Wert: $value<br />\n";
} 
//das ist nur die Ausgabe des $_SESSION arrays, nicht weiter spektakulär

Ich hoffe, dass jetzt klarer geworden ist, was ich will und entschuldige mich für Missverständnisse. Kann auch gut sein, dass man es komplett anders lösen muss, da wäre ich für Lösungsvorschläge und -ansätze sehr dankbar
 
Hallo,

das SESSION Array hat Probleme mit Integer Werten als Key.
Setze vor die ID einfach noch ein Zeichen. Z.B.:
Code:
$_SESSION ['.' . $id] = $count;
@XRaySolo: Wie wär's mal mit mehr Freundlichekit in deinen Antworten? Nicht alles was dir komisch / fremd erscheint ist falsch :wink:


N43
 
ich mach' ihn nur drauf aufmerksam.
wenn ich aber merke, dass etwas schon zum zweiten mal falsch ist, muss ich eben etwas deutschlicher schreiben, damit mans auch wirklich merkt.

Nils aka XraYSoLo
 
ich mach' ihn nur drauf aufmerksam.
wenn ich aber merke, dass etwas schon zum zweiten mal falsch ist, muss ich eben etwas deutschlicher schreiben, damit mans auch wirklich merkt.
Er will eben nicht den Key 'id', sondern den Inhalt von $id als Key. Das einzige Problem ist, dass PHP mit Integer Werten als Key bei Sessions nicht umgehen kann (siehe meinen Link).


N43
 
Status
Für weitere Antworten geschlossen.
Zurück
Oben