Patrick Hartwig: PHP - $_SESSION verändert sich aufeinmal

Beitrag lesen

Hallo,

Ich habe einen alten Code von mir einmal ausgegraben (ich weiß, ist nicht sonderlich gut programmiert) und bin dort gerade gerade auf der Fehlersuche:

// Erst auf Änderungen über POST überprüfen  
if(isset($_POST['date']) and is_numeric($_POST['date'])) {  
	// Wenn ein Eintrag gelöscht wird  
	$day = $_POST['date'];  
	mysql_query("DELETE FROM calender WHERE day = '$day' AND month = '$month' AND year = '$year'");  
}  
elseif(isset($_POST['date2']) and isset($_POST['name']) and !empty($_POST['name'])) {  
	echo "<br><br>";  
	// Wenn ein neuer Eintrag geschrieben wird  
	$name = htmlentities($_POST['name'], ENT_QUOTES);  
	$date = $_POST['date2'];  
	$date = explode(";",$date);  
	$inputday =  $date[0];  
	$inputmonth = $date[1];  
	$inputyear = $date[2];  
  
	mysql_query("INSERT INTO calender (day,month,year,name) VALUES ('$inputday','$inputmonth','$inputyear','$name')");  
}  
  
// Daten des Calenders aus der Datenbank holen  
$result = mysql_query("SELECT users FROM permissions WHERE permission = 'calender'");  
while($row = mysql_fetch_assoc($result)) {  
	$users = explode(";",$row['users']);  
}  
  
$result = mysql_query("SELECT day,name FROM calender WHERE month = '$month' AND year = '$year'");  
  
$dates = array();  
$db_days = array();  
$db_names = array();  
  
while($row = mysql_fetch_assoc($result)) {  
	array_push($db_days,$row['day']);  
	array_push($db_names,$row['name']);  
}  
  
$dates["day"] = $db_days;  
$dates["name"] = $db_names;  
  
// Kalenderanzeige  
echo "<table id='calender'>";  
echo "<tr><td>Montag</td><td>Dienstag</td><td>Mittwoch</td><td>Donnerstag</td><td>Freitag</td><td>Samstag</td><td>Sonntag</td></tr>";  
while($finished == false) {  
	echo "<tr>";  
	for($i=0;$i<7;$i++) {  
		// Gibt eine neue Wochenzeile aus  
		if($started == true) {  
		     // Wenn die Monatsausgabe angefangen hat  
			if($k > 0) {  
				// Wenn noch Monatstage auszugeben sind  
				$k -= 1;  
				$current = $k_old - $k;  
				$position = array_search($current,$dates["day"]);  
				if($position !== false) {  
			          // Wenn was auf diesem Feld eingetragen wurde  
				     if(isset($_SESSION['name']) and in_array($_SESSION['name'],$users)) {  
				          // Eingeloggt und Berechtigung zum ändern  
					     echo '<form action="index.php?s=calender" method="post">';  
						echo "<td>" . $current . "<br>" . $dates["name"][$position] . "<br><input type=\"hidden\" name=\"date\" value=\"$current\"/><input type=\"submit\" value=\"Löschen\"/></td>";  
				          echo '</form>';  
					}  
                         elseif(isset($_SESSION['name']) and !in_array($_SESSION['name'],$users)) {  
				          // Eingeloggt und keine Berechtigung zum ändern  
						echo "<td>" . $current . "<br>" . $dates["name"][$position] . "</td>";  
					}  
					else {  
					     // Nicht eingeloggt, oder keine Berechtigungen zum ändern des Kalenders  
						echo '<td>' . $current . '<br>belegt</td>';  
					}  
				}  
				else {  
				     // Dieses Datum ist noch frei  
				     if(isset($_SESSION['name']) and in_array($_SESSION['name'],$users)) {  
				          // Eingeloggt und Berechtigung zum ändern  
						echo '<form action="index.php?s=calender" method="post">';  
						echo "<td>" . $current . "<br><input type=\"text\" name=\"name\"/ maxlength=\"20\"><input type=\"hidden\" name=\"date2\" value=\"$current;$month;$year\"/><input type=\"submit\" value=\"eintragen\"></td>";  
						echo '</form>';  
					}  
					else {  
						echo '<td>' . $current . '<br>frei</td>';  
					}  
				}  
			}  
			else {  
				// Nach der Monatsausgabe  
				$finished = true;  
				echo "<td> - </td>";  
			}  
		}  
		else {  
		     // Wenn die Monatsausgabe noch nicht angefangen hat  
		     if(($i+1) > 6 or ($i+1) == $starttag) {  
		          // Anpassung wegen mktime und dem Parameter w, wo Sonntag = 0 gilt bzw.  
			     // Wenn der gewählte Monat angefangen hat  
				$started = true;  
				$k -= 1;  
				$current = $k_old - $k;  
    				$position = array_search($current,$dates["day"]);  
				if($position !== false) {  
				     // Wenn was auf diesem Feld eingetragen wurde  
				     if(isset($_SESSION['name']) and in_array($_SESSION['name'],$users)) {  
				          // Eingeloggt und Berechtigung zum ändern  
						echo '<form action="index.php?s=calender" method="post">';  
						echo "<td>" . $current . "<br>" . $dates["name"][$position] . "<br><input type=\"hidden\" name=\"date\" value=\"$current\"/><input type=\"submit\" value=\"Löschen\"/></td>";  
						echo '</form>';  
					}  
					else {  
					     // Nicht eingeloggt, oder keine Berechtigungen zum ändern des Kalenders  
						echo '<td>' . $current . '<br>belegt</td>';  
					}  
				}  
				else {  
				     // Dieses Datum ist noch frei  
				     if(isset($_SESSION['name']) and in_array($_SESSION['name'],$users)) {  
				          // Eingeloggt und Berechtigung zum ändern  
						echo '<form action="index.php?s=calender" method="post">';  
						echo "<td>" . $current . "<br><input type=\"text\" name=\"name\" maxlength=\"20\"/><input type=\"hidden\" name=\"date2\" value=\"$current;$month;$year\"/><input type=\"submit\" value=\"Eintragen\"/></td>";  
						echo '</form>';  
					}  
                         elseif(isset($_SESSION['name']) and !in_array($_SESSION['name'],$users)) {  
				          // Eingeloggt und keine Berechtigung zum ändern  
						echo "<td>" . $current . "<br>" . $dates["name"][$position] . "</td>";  
					}  
					else {  
						echo '<td>' . $current . '<br>frei</td>';  
					}  
				}  
			}  
			else {  
				// Wenn die Monatsausgabe noch nicht angefangen hat  
				echo "<td> - </td>";  
			}  
		}  
	}  
	echo "</tr>";  
}  
echo "<table><br>";

Das ganze ist ein Kalender in PHP, den ich selber geschrieben habe, wo man sich in den Kalender Dinge eintragen kann, die gespeichert werden, wenn man die benötigten Rechte hat. So weit so gut. Allerdings tritt ein Fehler auf, bei dessen Suche ich auf etwas sehr komisches gestoßen bin. Während beim Laden der Seite überprüft wird, ob Änderungen am Kalender vorgenommen werden müsse (also als $_POST[date] und $_POST[date2] überprüft werden beim oberen Teil des Scripts, ist in $_SESSION['name'] der richtige eingeloggte User gespeichert. Weiter unten, wenn wir zum Kalenderteil kommen, ist in $_SESSION['name']allerdings aufeinmal der Inhalt des jeweiligen Kalendertages, in $_SESSION['name'] gespeichert. Daraufhin bin ich meinen gesamten Code Stück für Stück durchgegangen und habe nach einer Stelle gesucht wo ich aus Versehen $_SESSION['name'] den Wert des aktuellen Kalendertages (aktuell = der Kalendertag in dessen Schleifendurchlauf wir gerade sind) zuorden - diese Stelle existiert aber nicht! Die einzigen male, dass $_SESSION['name']in meinem Code vorkommt, sind die, wo ich mit if überprüfe, ob man eingeloggt ist, etc. Das heißt in meinem Code ändere ich also überhaupt nicht den Inhalt von $_SESSION['name']!!!

Wie kann es nun aber sein, dass wenn ich zweimal var_dump($_SESSION['name']); einfüge - einmal weiter oben im Code und einmal weiter unten bei der Monatsausgabe, dass zwei unterschiedliche Werte rauskommen, wodurch der eigentliche Fehler produziert wird?

Vielen Dank - ich stehe da gerade auf dem Schlauch!