Zum Inhalt springen

PHP ein array einem Session-Objekt zuweisen


Empfohlene Beiträge

Geschrieben

Hallo,

ich übergebe 3 Parameter mittels Get (artnr, besch und preis).

Diese 3 parameter speichere ich in einem array. dieses array wird dann

anschließend einem session-array angehängt.

ich gebe das arrray mittels var_dump() aus und der knecht hat mir 2 mal das gleiche array in mein session-array gespeichert.

guckst du hier->




session_start();

//Prüfen, ob alle Parameter übermittelt wurden.
if(isset($_GET['artnr']) && isset($_GET['besch']) && isset($_GET['preis']))
{
//Speichern in Session-Array
$warenkorp = array($_GET['artnr'], $_GET['besch'], $_GET['preis']);
if(!isset($_SESSION['warenkorp']))
{
$_SESSION['warenkorp'] = array();
}

$menge = array_push($_SESSION['warenkorp'], $warenkorp);
echo $menge;
var_dump($_SESSION['warenkorp']);

echo "<p> Ihre Session-ID: " . session_id();
}
else
{
exit;
}[/PHP]

das hier -> if(!isset($_SESSION['warenkorp'])) funktioniert so auch nicht, wie es laut debugger den anschein hat.

wie kann man fragen, ob eine session-variable schon existiert?

Gruß

Alex

Geschrieben

Habe zwar jetzt länger nicht mehr mit PHP und Sessions gearbeitet, aber wenn ich das noch richtig im Kopf habe, musst Du die Session bevor der Header gesendet wird verarbeiten.

Der Ausschnitt ist irgendwie etwas undurchsichtig von der Logik. Ich denke Du möchtest doch wenn kein Warenkorb vorhanden ist (bzw keine Übergabeparameter), einen leeren Korb erzeugen und wenn Daten übergeben wurden, den bestehenden ergänzen:


$warenkorb = array()


if isÜbergabe && isSessionSet then

    lade Warenkorb aus Session

    ergänze Daten an Warenkorb

fi


schreibe Warenkorb in Session

Phil

Geschrieben (bearbeitet)

so ähnlich ja!

1. ich überprüfe, ob die parameter alle vorhanden sind, wenn ja werden diese in ein array gespeichert

2. danach prüfe ich, ob das session-objekt vorhanden ist, wenn nicht soll eins angelegt werden.

3. anschließend speichere ich das "normale" array in das session-array

wie überprüfe ich, ob der warenkorp (session[warenkorp] schon existiert?

Bearbeitet von alexC++
Geschrieben


if(!isset($_SESSION['warenkorp']))
{
$_SESSION['warenkorp'] = array();
}

mach besser
if(count($_SESSION['warenkorp']) == 0)
{
$_SESSION['warenkorp'] = array();
}
[/PHP]

im uebrigen muss man variablen in PhP nicht initialisieren

hast du mal versucht

[PHP]
var_dump($_SESSION['warenkorp']);
$menge = array_push($_SESSION['warenkorp'], $warenkorp);
var_dump($_SESSION['warenkorp']);

ist dein warenkorb vorher eventuell vorher schon vorhanden?

Geschrieben (bearbeitet)

wie überprüfe ich, ob der warenkorp (session[warenkorp] schon existiert?

Ohne es getestet zu haben:



//Session aktuell holen bzw neu initialisieren
session_start();

//generell leeren Warenkorb bereitstellen
$warenkob = array();

//falls der Warenkorb in der Session existiert _und_ auch ein Array ist, da
//wir mit Arrayfunktionen darauf arbeiten möchten prüfen ob der richtige
//Typ vorliegt
if ( isset($_SESSION("warenkorb")) && (is_array($_SESSION("warenkorb")) )
//Warenkorb aus der Session holen
$warenkorb = $_SESSION("warenkorb");

//wenn Parameter vorhanden und nicht leer ist
if ( isset($_GET["param"]) && ($_GET["param"] != null) )
//an das Warenkorbarray anhängen
array_push($warenkorb, $_GET["param"]);

//Warenkorb zurück in die Session schreiben, damit ist auch sichergestellt,
//dass falls keine Datenübergeben wurden bzw. fehlerhafte Daten in der
//Session standen, beim nächsten Aufruf wieder ein definiertes Array
//vorhanden ist. Entweder leer bei Initialisierung / fehlerhaften Daten oder
//gefülltes Array mit bestehendem Warenkorb
$_SESSION["warenkorb"] = $warenkorb;

header()....echo.....
[/PHP]

evtl dann noch @ bei session_start() ergänzen, falls Du Fehlermeldungen nicht angezeigt haben willst, solltest Du aber durch die php.ini entsprechend Steuern, da sie für's Developing sehr hilfreich sind, nur nicht für den Produktiveinsatz

Phil

Bearbeitet von flashpixx
Geschrieben

noch eine gedankliche stütze, du solltest dir den aufbau der Session in der art dort noch einmal ueberlegen...

denn was passiert wenn ich den gleichen artikel noch einmal in den warenkorb packe?

oder einen bestimmten entfernen moechte, oder die menge veringern moechte

ich wuerd dir raten das ganze ehr so aufzubauen

$session["warenkorb"][$artnr]["menge"]

$session["warenkorb"][$artnr]["preis"]

$session["warenkorb"][$artnr]usw

das macht es in der spaeteren verarbeitung bedeutend leichter

Ted

Geschrieben

ich wuerd dir raten das ganze ehr so aufzubauen

$session["warenkorb"][$artnr]["menge"]

$session["warenkorb"][$artnr]["preis"]

$session["warenkorb"][$artnr]usw

Da würde ich widersprechen, denn warum soll ich hier mit mehreren assoziativen Arrays arbeiten, es führt schneller zu Fehlern, falls es mal vergessen wird. Ich würde zu einer entsprechenden Klasse greifen, damit steht in der Session nur ein Objekt, jeder Artikel ist ebenfalls Objekt und da Objekte serialisierbar sind, besteht auch kein Problem diese in einer Session abzulegen.

Phil

Geschrieben
ted

ist dein warenkorb vorher eventuell vorher schon vorhanden?

ja, es sieht so aus!

wenn ich debugge und bei der ersten seite den button "zum warenkorp" klicke, dann öffnet er mir die seite und ich sehe das var_dump() schon, obwohl ich ab anfang der seite debugge.

Geschrieben
Da würde ich widersprechen, denn warum soll ich hier mit mehreren assoziativen Arrays arbeiten, es führt schneller zu Fehlern, falls es mal vergessen wird. Ich würde zu einer entsprechenden Klasse greifen, damit steht in der Session nur ein Objekt, jeder Artikel ist ebenfalls Objekt und da Objekte serialisierbar sind, besteht auch kein Problem diese in einer Session abzulegen.

Phil

natuerlich, geb ich dir vollkommen recht, aber seine session ist momentan aehnlich aufgebaut und ich wollte davon nicht soweit abweichen :P

$session["warenkorb"][0]["menge"]

$session["warenkorb"][0]["preis"]

$session["warenkorb"][1]["menge"]

$session["warenkorb"][1]["preis"]

$session["warenkorb"][2]usw

so muesste seine Session bei mehreren artikeln im moment aussehn

Geschrieben
ja, es sieht so aus!

wenn ich debugge und bei der ersten seite den button "zum warenkorp" klicke, dann öffnet er mir die seite und ich sehe das var_dump() schon, obwohl ich ab anfang der seite debugge.

ich nehme an das er die seite 2 x aufruft.

includierst du die irgendwo?

edit: sry 4 doppelpost :(

Geschrieben

var_dump() beim ersten aufruf.

wenn ich dann ein anderes fahrzeug in den warenkorp lege, seht der Audi 2 mal drin


array
0 =>
array
0 => string '2' (length=1)
1 => string 'Audi A6 quattro Baujahr 2008, 235 PS' (length=36)
2 => string '35000.00' (length=8)
3 => int 1

[/PHP]

nach 2tem aufruf steht 2 mal der a6 drin und 1mal der a8.

wenn ich nochmal die seite aufrufe stehen beide 2 mal drin

[PHP]
array
0 =>
array
0 => string '2' (length=1)
1 => string 'Audi A6 quattro Baujahr 2008, 235 PS' (length=36)
2 => string '35000.00' (length=8)
3 => int 1
1 =>
array
0 => string '2' (length=1)
1 => string 'Audi A6 quattro Baujahr 2008, 235 PS' (length=36)
2 => string '35000.00' (length=8)
3 => int 1
2 =>
array
0 => string '3' (length=1)
1 => string 'Audi A8 Baujahr 2008, 355 PS' (length=28)
2 => string '67000.00' (length=8)
3 => int 1

Geschrieben

Da wir nur Ausschnitte vom Code sehen, können wir nicht wirklich viel helfen. Wenn Du mehr Hilfe benötigst, schaue Dir auch das Log Deines Servers an, wie oft die Datei aufgerufen wird bzw welche Dateien ggf noch zusätzlich aufgerufen werden. Ggf kannst Du diese Daten auch posten

Ich ziehe ein required_once einem include immer vor.

@T3D: Bezüglich des OOP Designs, es hat schon durchaus Sinn so etwas hier anzubringen, denn diese "Array-Elemente-Schubserei" ist nie hilfreich, eine anständige Kapselung bzw das dazu passende Design, vermeidet entsprechende Fehler

Phil

Geschrieben (bearbeitet)

ziehe ich auch vor!

nur habe ich beides nicht verwendet :)

wenn ich das ganze per klasse -> objekte löse

würde die seite trotzdem 2 mal aufgerufen und ein und das selbe

objekt würden 2 mal in der session gespeichert.

das ist also nicht das problem (oop)

ich kann euch auch die 2 seiten zu schicken, dann könnt ihr mal schauen.

wenn ihr zeit habt.

ist alles ohne template mit html und php gemixt (bin auf einer schulung und da wird das leider so gemacht)

Bearbeitet von alexC++
Geschrieben
ziehe ich auch vor!

nur habe ich beides nicht verwendet :)

Es muss ja nicht am Include liegen als Bsp: Deine Seite wird aufgerufen, die Session verarbeitet und danach wird ein Header mit einer Locationangabe gesenden, der als Ziel die gleiche Seite hat (So was wie ein Refresh). Dann kann Deine Seite 2 Mal aufgerufen werden. Wenn dann nicht sauber das Verarbeitungshandling ist, passiert genau das. Das würdest Du aber in den Logs des Server sehen, deswegen mein Tipp, schau da erst mal rein

ziehe ich auch vor!

ich kann euch auch die 2 seiten zu schicken, dann könnt ihr mal schauen.

wenn ihr zeit habt.

ist alles ohne template mit html und php gemixt (bin auf einer schulung und da wird das leider so gemacht)

Poste die Daten als Anhang ins Forum

Phil

Geschrieben

hier mein access.log

127.0.0.1 - - [16/Jun/2009:14:16:04 +0200] "GET /Abschlussprojekt/index.php HTTP/1.1" 200 5584

127.0.0.1 - - [16/Jun/2009:14:16:06 +0200] "GET /Abschlussprojekt/warenkorp.php?artnr=1&besch=Audi%20TT,%20Baujahr%202008,%20255%20PS&preis=29000.00 HTTP/1.1" 200 6510

127.0.0.1 - - [16/Jun/2009:14:16:06 +0200] "GET /Abschlussprojekt/warenkorp.php?artnr=1&besch=Audi%20TT,%20Baujahr%202008,%20255%20PS&preis=29000.00 HTTP/1.1" 200 7044

wird also 2 mal aufgerufen.

wie geht das mit dem hochladen?

wollte ein 7-zip datei und 2 php-dateien hochladen, dann sagt er mir ungültige datei.

Geschrieben

ok habe mein problem gefunden.

es lag beim auruf der seite

hatte ein link und in dem link -> <input type='image' src...>

wusste nicht, dass ding auch weiterleitet.

danke für die hilfe

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...