Array in Session verliert Werte

boykottke

Mitglied
Ja, ich glaube, diese Frage wird schon öfter gekommen sein, aber in der Suche hab ich jetzt nichts gefunden,w as mir wietergeholfen hätte.

Folgender Code macht Ärger:

Ein- und Austragen des Angebotes in das SESSION-Array:

PHP:
if(!isset($_SESSION["marker"]) OR !is_array($_SESSION["marker"]))
{
$_SESSION['marker'] = array();
}

if($_GET["marker"]== "1" AND !in_array( $inserat_nr, $_SESSION["marker"]))
{
array_push($_SESSION["marker"], $inserat_nr);
}
if($_GET["marker"]== "2" AND in_array( $inserat_nr, $_SESSION["marker"]))
{
$key = array_search($inserat_nr, $_SESSION["marker"]);
unset($_SESSION["marker"][$key]);
}

echo ' <div class="sendform">
<div class="sendform_header">Zu Markern hinzuf&uuml;gen/entfernen</div>';

if( in_array( $inserat_nr, $_SESSION["marker"]))
{
echo '<form action="index.php?kategorie=4&inseratnr='.$inserat_nr.'&profile_site='.$profile_site.'&marker=2" method="POST" target="">
<p><input type="Submit" name="" value="Marker entfernen" id="login_buttons2"></p>
</form>';
}
else
{
echo '<form action="index.php?kategorie=4&inseratnr='.$inserat_nr.'&profile_site='.$profile_site.'&marker=1" method="POST" target="">
<p><input type="Submit" name="" value="Marker setzen" id="login_buttons2"></p>
</form>';
}
echo '</div>';

Anzeigen der Array-Daten der SESSION:

PHP:
if(!empty($_SESSION["marker"]) AND is_array($_SESSION["marker"]))
{ 
$select = 'SELECT A.*, B.Bezeichnung, D.main_bild FROM inserat AS A LEFT JOIN rassen AS B ON A.Rasse = B.Nummer LEFT JOIN inserateignung AS C ON A.Inseratnr= C.Inseratnr LEFT JOIN medbilder AS D ON A.Inseratnr = D.inseratnr WHERE ';

$i= '0';
foreach ($_SESSION["marker"] as $marker) {
if ($i>'0')
{
$select.= 'OR ';
}
$select.= 'A.Inseratnr="'.$marker.'" ';
$i++;
}

$select .= 'AND A.sichtbar = 1 AND A.Enddatum>="'.$actuell_day.'" GROUP BY A.Inseratnr ORDER BY A.Top DESC, A.Startdatum ASC'; 
echo '<div id="treffer_header">Ihre Marker:</div>';

$siudb->sqlcommand($select);


while($data = $siudb->sql_data())
{

$angebot_nr = $data["Inseratnr"];
$angebot_titel = $data["Titel"];
$angebot_preiskat = $data["Preiskat"];
$angebot_preis = $data["Preis"];
$angebot_rasse = $data["Bezeichnung"];
$angebot_rasseid = $data["Rasse"];
$angebot_ort = $data["PLZStandort"].' '.$data["Standort"];
$angebot_bundesland = $data["Bundesland"];
$angebot_top = $data["Top"];
$angebot_main_bild = $data["main_bild"];
$angebot_highlight = $data["Highlight"];

echo '<div ';
if($angebot_highlight == 1) { echo 'class="search_results_1_highlight" ';} else { echo 'class="search_results_1" ';}
if ($angebot_top== 1) { echo 'id="top'; if ($angebot_highlight== 1) {echo '_highlight';} echo '"'; }
echo '">';
echo '<table><tr><td valign="top">'; if (!empty($angebot_main_bild)) { echo '<img src="./media/main_pictures/MAIN'.$angebot_main_bild.'" width="120" height="90" border="0" alt="">'; } echo '</td><td valign="top">';
echo '<h1><a href="index.php?kategorie=4&inseratnr='.$angebot_nr.'">'.$angebot_titel.'</a></h1><p>';
echo '<b>Preis: &euro; '.$angebot_preis.' '.$angebot_preiskat.'</b><br><br>';
echo '<b>Rasse:</b> '.$angebot_rasse;
echo ' - <b>Standort:</b> '.$angebot_ort.' / '.$angebot_bundesland;
echo '</p></td></tr></table>';

echo '</div>';
} 
}


So, und nun wird es lustig. Mein Server liest die Daten normal aus dem Array in der SESSION, schreibt sie in der vorgegebenen Struktur aus und zeigt sie an. Der Server, auf dem Das Script laufen soll gibt folgenden Fehler aus:

Warning: Invalid argument supplied for foreach() in /srv/www/xxx/marker.php on line 21

Das Array $_SESSION["marker"] ist also letztlich kein Array mehr. Daher funktioniert die WHILE-Schleife nicht mehr. Also, nun meine Frage: Was muss ich am Code, was am Server ändern, damit es funktioniert.

Leider ist es auch keine Alternative, das Ganze in einer Datenbank zu speichern, nur, um der Frage vorzubeugen.

Danke und LG,

Thomas
 
Zuletzt bearbeitet:
session_register speichert keinen Arrays soweit ich weiß sondern legt für jedes Argument des Array eine eigen Variable an.

lass dir mit print_r($_SESSION) deine Session anzeigen das weißt du was du iterieren musst

gruß

kato
 
Hi,

wo verwendet er denn session_register? Finde ich nicht...

@boykottke:

Bist Du sicher, dass Du den richtigen Code-Ausschnitt zeigst? Die einzige foreach-Schleife, die ich sehe, befindet sich innerhalb der Bedingung

PHP:
if(!empty($_SESSION["marker"]) AND is_array($_SESSION["marker"]))

Wenn $_SESSION["marker"] kein Array ist, wird der Zweig mit der Schleife also gar nicht ausgeführt.

LG

PS.: Es wäre vielleicht hilfreich, wenn Du den Code einrückst, das Klammern zählen ist ziemlich anstrengend...
 
Array ( [marker] => Array ( [0] => 137 ) )
Warning: Invalid argument supplied for foreach() in


Das ist die Originalausgabe... es sieht so aus, als sei marker ein Array.

Scheint ebenso, dass er das array nach

PHP:
if(!empty($_SESSION["marker"]) AND is_array($_SESSION["marker"]))

verliert, da es ja dort noch erfolgreich als Array geprüft wird...
 
Hi,

Scheint ebenso, dass er das array nach

PHP-Code:
if(!empty($_SESSION["marker"]) AND is_array($_SESSION["marker"]))
verliert, da es ja dort noch erfolgreich als Array geprüft wird...

PHP "verliert" nicht von alleine von einer Zeile zur nächsten ein Array. So, wie der Code da steht, kann der Fehler nicht durch diese foreach-Schleife ausgelöst werden. Prüf' noch mal, ob das auch wirklich Zeile 21 der Datei marker.php ist.
Wo genau hattest Du das print_r($_SESSION) überhaupt eingebaut?

LG
 
Ja, ich dachte bisher auch immer, dass er ein ARRAY nicht einfach so verlieren kann. Der richtige Codeausschnitt ist es. session_start steht in der übergeordneten index.php, eine session_register gibt es nicht, da die Variable $_SESSION["marker"] durch direkte Registrierung unter diesem Namen gespeichert wird, was laut PHP-Manual ab Version 4.1 auch ohne weiteres möglich ist. Gleichzeitig sind auf dem Server die register_globals deaktiviert. Dementsprechend würde der Code mit session_register nicht funktionieren.

Ansonsten: Das ist tatsächlich die einzige for-Schleife im Code. Wie gesagt, erst überprüft er, ob es das ARRAY auch wirklich gibt, dann soll er das ARRAY auslesen und da kommt dann die Fehlermeldung.

print_r($_SESSION) habe ich direkt über der IF-Bedingung ausgeben lassen. Deshalb meine Verwunderung.

Ach so,d er Code war formatiert, als ich ihn eingegeben habe. Nach der Bearbeitung allerdings ist die Formatierung verloren gegangen, keine Ahnung Warum. Sorry...
 
Zuletzt bearbeitet:
Ich werde nachher mal die essentiellen Dateien hochladen... Hab sie allerdings nicht hier vor Ort, da ich grad auf Arbeit bin.

Die Frage, die ich mir haltd erzeit stelle, ist die, warum das auf meinem Server geht, auf dem Kundenserver jedoch nicht...
 
Okay, die entscheidenden Dateien sind schon oben... eingebunden werden sie durch die Index, die folgendermaßen aussieht:

PHP:
<?php
include('./conf/conf_source.php');
include('./func/func.db.php');


session_start ();

$kategorie = $_GET["kategorie"];
if (!isset($_GET["kategorie"]))
{
$kategorie = 3;
}

$post_index = $_GET["post_index"];

if (!isset($_GET["post_index"]) OR $_GET["post_index"]<0)
{
$post_index = 0;
}

$datum = getdate();
$timestamp_global = time();
$actuell_day = date("Y-m-d", $timestamp_global);

// skin wird eingefügt
include('./skin/pferdekauf_header.php');
include('./skin/pferdekauf_menu.php');

// an dieser stelle wird der hauptteil gestartet

echo '&nbsp;';


//kategorien werden geladen
switch ($kategorie) {

case 3:
include('./vars/home.php');
break;
case 4:
include('./vars/buy_horse.php');
break;
case 5:
include('./vars/sell_horse.php');
break;
case 6:
include('./vars/marker.php');
break;
case 7:
include('./vars/faq.php');
break;
case 8:
include('./vars/search.php');
break;

default:
echo 'Keine Kategorie geladen';
break;
}
// askin footer wird eingefügt
include('./skin/pferdekauf_footer.php');
?>

PS: Scheinbar übergibt Eclipse keine Formatierung. Sorry.
 
Zurück