Probleme mit $_SESSION - Abfrage
dave
- php
0 Sven Rautenberg0 Felix Riesterer0 dave
0 Felix Riesterer1 dedlfix
Hallo!
Folgendes gibt print_r($_SESSION['avail']) aus:
Array
(
[P01029700000A102F5] => 768|1158057289
)
Nun soll ein PHP-Script überprüfen ob eine bestimmte ID im Session-Array gespeichert ist, und deren Wert ausgeben.
Dazu habe ich folgendes Script:
//PHP
$ids = array('P01029700000A102F5','P01029800001500300','P000B7C00002700443','P000B7C00002500441');
for ($x=0; $x<sizeof($ids); $x++) {
//Überprüfe ob aktuelle ID in Session
if ($_SESSION['avail'][$ids[$x]]=='') {
echo "ID nicht in Session";
} else echo "ID in Session";
}
Nun zu meiner Frage:
Warum wird keine ID im Session-Array gefunden?
Wenn ich den Session-Array direkt abfrage durch
echo $_SESSION['avail']['P01029700000A102F5'];
erhalte ich die richtige Ausgabe (768|1158057289)
Vielen Dank für eure Hilfe...
Moin!
$ids = array('P01029700000A102F5','P01029800001500300','P000B7C00002700443','P000B7C00002500441');
for ($x=0; $x<sizeof($ids); $x++) {
//Überprüfe ob aktuelle ID in Session
if ($_SESSION['avail'][$ids[$x]]=='') {
echo "ID nicht in Session";
} else echo "ID in Session";
}
Dein Skript ist in vielen Punkten verbesserungswürdig. Zuallererst mal in der Logik: Wenn du für jedes Element suchst, ob es NICHT im Array enthalten ist, kriegst du die abstruse Situation, dass unter dem Strich in jedem Array etwas NICHT gefunden wird.
Außerdem hat PHP so viele schöne Arrayfunktionen, die durchsuchen, ob Dinge in Arrays enthalten sind - die solltest du hier anwenden.
~~~php
$ids = array('P01029700000A102F5','P01029800001500300','P000B7C00002700443','P000B7C00002500441');
foreach ($ids as $one_id) { // foreach anwenden macht Schleifen einfacher
if (array_key_exists($one_id,$_SESSION['avail']) {
echo "ID $one_id in Session, Wert: {$_SESSION['avail'][$one_id]}";
} else {
echo "ID $one_id nicht in Session";
}
}
- Sven Rautenberg
Lieber Sven,
if (array_key_exists($one_id,$_SESSION['avail'])
das ist natürlich noch schöner (weil simpler), als mein Vorschlag. :-)
Liebe Grüße aus Ellwangen,
Felix Riesterer.
Hallo Sven,
vielen Dank für deine rasche Antwort.
Dein Skript ist in vielen Punkten verbesserungswürdig. Zuallererst mal in der Logik: Wenn du für jedes Element suchst, ob es NICHT im Array enthalten ist, kriegst du die abstruse Situation, dass unter dem Strich in jedem Array etwas NICHT gefunden wird.
Ja, das ist klar. Mein Script sieht eigentlich anders aus:
Da die ID's (def. durch $ids) aus einem simpleXML-Objekt kommen, möchte ich die foreach-Schleife nicht anwenden.
Ich habe es auch schon mit der in_array-Funktion probiert, nur leider ohne Erfolg.
Mir ging es nur darum, dass ich einen Wert im assoziativen Array suchen möchte, und dies nicht funktioniert. Wenn ich jedoch das Array-Feld direkt anspreche, funktioniert es.
grüße
dave
Moin!
Ja, das ist klar. Mein Script sieht eigentlich anders aus:
Da die ID's (def. durch $ids) aus einem simpleXML-Objekt kommen, möchte ich die foreach-Schleife nicht anwenden.
Ich habe es auch schon mit der in_array-Funktion probiert, nur leider ohne Erfolg.
Wenn dein Skript anders aussieht, warum zeigst du es dann nicht? Ich kann nur Hilfe geben für das, was ich sehe.
Und vielleicht solltest du dann lieber eine andere Frage stellen, denn du sagst ja selbst:
Mir ging es nur darum, dass ich einen Wert im assoziativen Array suchen möchte, und dies nicht funktioniert. Wenn ich jedoch das Array-Feld direkt anspreche, funktioniert es.
Versuche nicht, um ein Problem herum eine Lösung zu bauen, und suche für diese Lösung im Problemfall eine neue Lösung - suche direkt für dein erstes Problem eine bessere Lösung.
- Sven Rautenberg
hallo
Wenn dein Skript anders aussieht, warum zeigst du es dann nicht? Ich kann nur Hilfe geben für das, was ich sehe.
Soll ich hier eine Klasse mit 655 Zeilen Code posten? Dazu kommt, dass diese Klasse wiederum 3 Klassen benötigt. Im Ernst, wer würde sich die Zeit nehmen und da einen Fehler suchen?
Und vielleicht solltest du dann lieber eine andere Frage stellen, denn du sagst ja selbst:
Mir ging es nur darum, dass ich einen Wert im assoziativen Array suchen möchte, und dies nicht funktioniert. Wenn ich jedoch das Array-Feld direkt anspreche, funktioniert es.
Naja gut, im Grunde steht im meinen ersten Post die selbe Frage (bzw. Problemstellung), oder? Aber du hast recht, ich habe mich undeutlich ausgedrückt.
Zur Lösung des Problems.
Im Grunde ist es egal (wenn man die "Schönheit" des Codes außer Acht lässt), ob man nun einen Array mittels for oder foreach durchläuft und die Werte mit if($wert==$wertimArray) oder if(array_key_exists(...)) abfrägt. Fakt ist, dass etwas mit den Werten nicht stimmen musste.
Daher habe ich folgendes probiert:
aktuelleId = ltrim(aktuelleID)
und siehe da, nun funkts.
Leider ist mir dies unverständlich, da beim direkten Aufrufen des Wertes, dieser kein Leerzeichen hat.
Vielen lieben Dank an alle, die sich die Mühe gemacht haben, mir zu helfen
Grüße
dave
Moin!
Zur Lösung des Problems.
Im Grunde ist es egal (wenn man die "Schönheit" des Codes außer Acht lässt), ob man nun einen Array mittels for oder foreach durchläuft und die Werte mit if($wert==$wertimArray) oder if(array_key_exists(...)) abfrägt. Fakt ist, dass etwas mit den Werten nicht stimmen musste.
Daher habe ich folgendes probiert:
aktuelleId = ltrim(aktuelleID)
und siehe da, nun funkts.Leider ist mir dies unverständlich, da beim direkten Aufrufen des Wertes, dieser kein Leerzeichen hat.
Woran siehst du das? Bedenke: Leerzeichen werden eliminiert, wenn du sie dir im Browser ansiehst.
Um Leerzeichen zu entdecken, schreibe immer ein Nicht-Leerzeichen davor und dahinter, und schau dir explizit den HTML-Quelltext an.
- Sven Rautenberg
echo $begrüßung;
Um Leerzeichen zu entdecken, schreibe immer ein Nicht-Leerzeichen davor und dahinter, und schau dir explizit den HTML-Quelltext an.
var_dump() ist auch immer eine gute Idee. Das rahmt Strings von ganz allein ein und schreibt auch noch deren Länge mit hin.
echo "$verabschiedung $name";
Lieber dave,
[ ] Du kennst array_keys()?
[ ] Du kennst die Funktion in_array()?
// ungetestet!
$ids = array(
'P01029700000A102F5',
'P01029800001500300',
'P000B7C00002700443',
'P000B7C00002500441'
);
$gefunden = array();
foreach ($ids as $id) {
if (in_array( $id, array_keys($_SESSION['avail'])))
$gefunden[] = $id;
}
if (count($gefunden) < 1)
echo "keine Werte gefunden!";
else {
echo "gefundene Werte: ";
print_r($gefunden);
}
Liebe Grüße aus Ellwangen,
Felix Riesterer.
echo $begrüßung;
Warum wird keine ID im Session-Array gefunden?
Debugging gehört zum Programmieren dazu wie die Pechmarie zum Märchen von Frau Holle. Vielleicht fehlt dir nur die passende Fehlersuchstrategie. Zwischen dem, was du dir vorstellst und dem, was wirklich ist, gibt es Differenzen, die zu solchen Fehlern führen. Deshalb ist es als erstes sinnvoll, zu überprüfen, was denn nun wirklich da ist. Dazu kann man sich die Inhalte der Variablen ausgeben lassen, wofür Tools wie echo, print_r(), var_dump() und Browsers Quelltextansicht hilfreich sind. Als nächstes kommen die Ausdrücke - auch in Teilen - dran, ob sie das gewünschte Ergebnis liefern. Ebenfalls ein wichtiges Element beim Entwickeln ist ein auf E_ALL gestelltes error_reporting.
Das/die Leerzeichen am Ende hättest du übrigens mit var_dump($ids[$x]) gesehen.
if ($_SESSION['avail'][$ids[$x]]=='')
Das ist typisch für PHP-Anfänger. Du machst hier einen Zugriff auf etwas, das möglicherweise gar nicht existiert und vergleichst das mit einem Leerstring. Dabei möchtest du gar nicht wissen, ob da ein Leerstring drin ist, sondern ob dieses Array-Element existiert oder nicht. Dafür ist isset() oder array_key_exists() zuständig. Beim Verwenden einer passenderen Funktionen kommt viel deutlicher deine eigentliche Intention zu Ausdruck als der Leerstring-Vergleich.
Wenn du dir außerdem mal ansiehst, dass bei einem var_dump($nichtexistent) als Ergebnis (neben der Notice-Meldung) ein "null" rauskommt, dann tritt die Unsinnigkeit des Vergleich mit einem Leerstring noch deutlicher zu Tage. Dass dieser Vergleich trotzdem funktioniert ist nur der automatischen Typumwandlung von PHP zu verdanken.
echo "$verabschiedung $name";