Formular 2 mal abgeschickt, danach keine PHP-Funktion mehr

TheBodo

Erfahrenes Mitglied
Hi Leute, ich hab ein kleines großes Problemchen.

Ich baue ein Speisenverwaltungsystem, und da soll man ja Speisen eingeben und ändern können. und beim ändern knirscht es. Ich kann zwar die Speise ändern, aber nur ein mal, sobald ich dass Formular zum zweiten mal abeschicke (es ruft sich danach selbst wieder auf) habe ich keine PHP-Funktion mehr, bis zum nächsten Login, dann geht weider alles!

Woran kann das liegen? Hier mal das Script:

PHP:
<?php
echo "<h2>Woche bearbeiten: Woche $_GET[week]</h2>";


$weekdays = array("", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag", "Sonntag");
$sql = "SELECT * FROM mensen WHERE id='$_SESSION[id]' LIMIT 1";
$result = mysql_query($sql) or die(mysql_error());
$mensa = mysql_fetch_assoc($result);

$tabelle = $mensa[mensaname] . "_db";
if ($mensa[andmensa]) {
	$tabelle = $mensa[tablename];
}

$anzahl = $_POST[anzahl];

if(isset($_POST[send])) {
	for($i = 1; $i <= $mensa[tage]; $i++) {
		$anz = $anzahl[$i];
		for($o = 0; $o < $anz; $o++) {
			$numbers = $i . "-" . $o;
			$woche = "woche".$numbers;
			$tag = "tag".$numbers;
			$zeit = "zeit".$numbers;
			$art = "art".$numbers;
			$bez = "bez".$numbers;
			$essen = "essen".$numbers;
			$inhalt = "inhalt".$numbers;
			$vegetarisch = "vegetarisch".$numbers;
			$aktiv = "aktiv".$numbers;
			$preis = "preis".$numbers;
			$preis_bed = "preis_bed".$numbers;
			$preis_gast = "preis_gast".$numbers;
			$id = "id".$numbers;
			$sql = "UPDATE $tabelle SET woche='$_POST[$woche]', tag='$_POST[$tag]', zeit='$_POST[$zeit]', art='$_POST[$art]', bez='$_POST[$bez]', essen='$_POST[$essen]', inhalt='$_POST[$inhalt]', vegetarisch='$_POST[$vegetarisch]', aktiv='$_POST[$aktiv]', preis='$_POST[$preis]', preis_bed='$_POST[$preis_bed]', preis_gast='$_POST[$preis_gast]' WHERE id='$_POST[$id]'";
			mysql_query($sql) or die(mysql_error());
		}
	}

}


extract($_GET);

echo "<br /><br /><table><tr>";
for($i = 1; $i <= $mensa[tage]; $i++) {
	echo "<td><a href=\"#$weekdays[$i]\">$weekdays[$i]</a></td>";
}
echo "</tr></table><br /><br />";
for($i = 1; $i <= $mensa[tage]; $i++) {
	echo "<fieldset><legend><a name=\"$weekdays[$i]\">Tag $i - $weekdays[$i]</a></legend>";
	$sql = "SELECT * FROM $tabelle WHERE woche='$week' AND tag='$i' ORDER BY zeit, art";
	$result = mysql_query($sql) or die(mysql_error());
	echo "<form action=\"index.php?page=editweek&week=$week\" method=\"post\">";
	echo "<input type=\"hidden\" name=\"send[$i]\" value=\"a\" /><tr><td><table><tr ><td>Woche</td><td>Tage</td><td>&Ouml;-Zeit</td><td>Art</td><td>Bez.</td><td>Beschreibung</td><td>Inhalt</td><td>veget.</td><td>aktiv</td><td>S-Preis</td><td>B-Preis</td><td>G-Preis</td></tr>";
	$aktzeitzahl = 0;
	$c = 0;
	while($data = mysql_fetch_assoc($result)) {
		//if($aktzeitzahl != $data[zeit]) {

		//}


		echo "<tr>";
		echo "<input type=\"hidden\" name=\"id$i-$c\" value=\"$data[id]\" />";
		echo "<td align=\"center\"><select name=\"woche$i-$c\" size=\"1\">";

		for($o = 1; $o <= $mensa[wochen]; $o++) {
			if ($data[woche] == $o) echo "<option selected=\"selected\" value=\"$o\">$o</option>";
			else	echo "<option value=\"$o\">$o</option>";
		}
		echo "</select></td>";

		echo "<td align=\"center\"><select name=\"tag$i-$c\" size=\"1\">";
		for($o = 1; $o <= $mensa[tage]; $o++) {
			if ($data[tag] == $o) echo "<option selected=\"selected\" value=\"$o\">$o</option>";
			else	echo "<option value=\"$o\">$o</option>";
		}
		echo "</select></td>";

		echo "<td align=\"center\"><select name=\"zeit$i-$c\" size=\"1\">";
		$sel[1] = "";
		$sel[2] = "";
		$sel[3] = "";
		$sel[$data[zeit]] = "selected=\"selected\"";
		if($mensa[zeit1]) echo "<option $sel value=\"1\">1 - $mensa[name1]</option>";
		if($mensa[zeit2]) echo "<option $sel value=\"2\">2 - $mensa[name2]</option>";
		if($mensa[zeit3]) echo "<option $sel value=\"3\">3 - $mensa[name3]</option>";
		echo "</select></td>";


		echo "<td align=\"center\"><select name=\"art$i-$c\" size=\"1\">";
		$sel[1] = "";
		$sel[2] = "";
		$sel[3] = "";
		$sel[$data[art]] = "selected=\"selected\"";
		echo "<option $sel[1] value=\"1\">Sonderessen</option>";
		echo "<option $sel[2] value=\"2\">Hauptkomponente</option>";
		echo "<option $sel[3] value=\"3\">Beilage</option>";
		echo "</select></td>";

		echo "<td align=\"center\"><input type=\"text\" name=\"bez$i-$c\" size=\"4\" value=\"$data[bez]\" / ></td>";

		echo "<td align=\"center\"><input type=\"text\" name=\"essen$i-$c\" size=\"25\" maxlength=\"60\" value=\"$data[essen]\" /></td>";

		echo "<td align=\"center\"><input type=\"text\" name=\"inhalt$i-$c\" size=\"4\" value=\"$data[inhalt]\" / ></td>";

		if ($data[vegetarisch]) $checked = "checked=\"checked\""; else $checked="";
		echo "<td align=\"center\"><input type=\"checkbox\" name=\"vegetarisch$i-$c\" value=\"1\" $checked / ></td>";

		if ($data[aktiv]) $checked = "checked=\"checked\""; else $checked="";
		echo "<td align=\"center\"><input type=\"checkbox\" name=\"aktiv$i-$c\" value=\"1\" $checked / ></td>";

		echo "<td align=\"center\"><input type=\"text\" name=\"preis$i-$c\" size=\"4\" value=\"$data[preis]\" / ></td>";

		echo "<td align=\"center\"><input type=\"text\" name=\"preis_bed$i-$c\" size=\"4\" value=\"$data[preis_bed]\" / ></td>";

		echo "<td align=\"center\"><input type=\"text\" name=\"preis_gast$i-$c\" size=\"4\" value=\"$data[preis_gast]\" / ></td>";

		echo "</tr>";
		$c++;
	}
	echo "<input type=\"hidden\" name=\"anzahl[$i]\" value=\"$c\" />";
	echo "</table><div align=\"right\"><input type=\"submit\" name=\"$i-$c\" value=\"speichern\"></div></form></fieldset><br /><br />";
}
?>

Danke schonmal für eure Hilfe!
 
Überprüfe doch einfach mal mit print_r($_POST); was wann, wo übergeben wird und arbeite dich so Schleife für Schleife vorwärts :rolleyes: soetwas nennt man Fehlereingrenzung und Behebung ;) dafür hättest du eigentlich keinen Thread eröffnen brauchen...
übrigens hast du schon einmal etwas von MySQL-Injection gehört? scheinbar nicht, dazu solltest du dir unbedingt mal den Wikipedia-Eintrag durchlesen ;) -> damit du in zukunft htmlentities(), mysql_real_escape_string() u.ä. verwendest! Denn sonnst ist deine Seite im nullkommanichts gehackt :rolleyes:

EDIT: Übrigens wären Kommentare im Quellcode ganz nett und vielleicht hier und dort eine Zeile mehr eingerückt (aber das mit dem Einrücken ist meine subjektive Empfindung ;) )

EDIT2: Außerdem solltest du UNBEDINGT register_globals in der php.ini auf off setzten bzw. wenn sie an ist, sollte PHP evtl. mal aktualisiert werden! register_globals=on ist in der heutigen Zeit eine Schwachstelle und ist bei neueren PHP-Versionen automatisch off (register_globals sorgt dafür, dass übergabe-Werte sofort als Variablen verwendet werden können. Wenn register_globals=off ist, kannst du sie nur noch mit $_POST['name'] bzw. $_GET['name'] holen

Zum Thema Sicherheit, schaue am besten mal in den ersten Thread dieser Kategorie ;)
 
Zuletzt bearbeitet:
Moinsen,

danke erstmal für deine Antwort!
Aber ein bisschen beschweren muss ich mich auch.

1. register_globals ist aus, aber ich extrahiere die Variablen extra, damit ich sie nutzen kann, dabei handelt es sich nur um die $_GET Variablen, die $_POST Variablen spreche ich nur über $_POST[name] an! Außerdem hab ich mir schon alles ausgeben lassen, Variablen sind alle da! Außerdem läuft das System lokal, und ist dafür da Speisepläne zu verwalten, die im Internet nur abgerufen werden können. Und es wird nur von den Küchenchefs und dem Gesamtleiter bearbeitet, und hat ein Loggingsystem, damit man weiß wer sich wann eingeloggt und was geändert hat! SICHERHEIT wird also groß geschrieben, und HTML sogar teilweise eingesetzt!

2. Die Einrückungen sollten dem gültigen Standard entsprechen, eingerückt ist immer in Funktionen und irgendwelchen Klammern (if, for, while etc.)

Und jetzt zum Problem, ich habe den Quellcode der Seite nach dem Absenden auch noch einmal gecheckt, is alles noch richtig! Nur das zweite Absenden schlägt fehl.
Und auch das Fehlereingrenzen mit auskommentieren etc. hab ich schon gemacht, Sonst würde das ding ja gar nich laufen.
Kleiner Hinweise noch, er zeigt danach keine Funktion mehr, auch wenn ich auf ne andere Seite gehe, sobald php kommt (abgesehen von include) bricht er ab!

Ich bin eigentlich sehr erfahren in PHP und möchte nur noch einmal betonen, dass ich nicht Arbeit abgeben möchte sondern wirklich nicht weiterkomme. Trotzdem danke für eure Beiträge!
 
Zuletzt bearbeitet:
Hi!
Was heißt du "keine PHP-Funktion mehr"?
Dein Formular wird ja zum Beispiel auch durch ein echo erzeugt... Wird dir eine weiße Seite angezeigt? Kannst du nicht auf den Submit-Button drücken? Wenn doch - was passiert wenn du drauf drückst?

Was mit jetzt so spontan aufgefallen ist:
- Code ist schön eingerückt nur leider unkommentiert (was ich aber bei diesem kleinen Script nicht so tragisch finde :) )
- Bei deinen Request-Arrays fehlen die Anführungsstriche der Keys. Kein großes Problem, aber auch nicht sehr stilschön :) (Bsp. $_POST[send] sollte $_POST["send"] sein).
- Du verwendest die PHP Session um einen MySQL Eintrag zu selecten - session_start() taucht aber nirgendwo auf. Verwendest du session.auto_start oder könnte da vielleicht dein Fehler stecken? Erhälst du beim 2ten Anzeigen des Formulars leere Inputfelder oder stehen die geänderten Einträge noch/schon drin?
- Dein Formular schickt ja über ein hidden input die ID deines SQL-Eintrages mit. Der Name der Variablen ist aber nicht konstant (name=\"id$i-$c\"). Ändert sich vielleicht das Array oder die Syntax (in dem Falle $i oder $c) nachdem du das Formular abgeschickt hast so dass beim zweiten Abschicken kein passender SQL Eintrag gefunden wird?
 
Hi,

keine PHP-Funktion heißt in der Tat dass ich ne weiße Seite habe, das ganze ist ein System in dem man eingeloggt ist, die Seite selbst wird nur per require() eingebunden, die Session wird also in der globalen Seite, die alle anderen einbindet, aufgerufen.

So und ich sehe alles auch noch! Auch das was von PHP erzeugt wird, außer wenn er auf die DB zugreifen will... dann bricht er sofort ab, auch wenn ich eine andere Seite aufrufe. Ich habe ein Skript wo das Formular HTML ist, und das PHP per shorttags die Inhalte einfügt, die Inhalt kommen da auch aus der DB, die DB funktioniert auch noch, ich kann nur in der Session nicht mehr auf die Datenbank zugreifen. Er schreibt also auch in diesem zweiten Skript die Werte nicht rein, dass Formular is aber da, nur halt ohne Inhalt.

Wenn ich mich aber aus dem System auslogge und neu einlogge funktioniert alles wieder, auch DBzugriff, jedenfalls bis ich dieses eine Formular 2 mal abschicke! Es ist übrigens egal wie lange ich zwischen dem 1sten und dem 2ten mal warte...

Zu den Kommentaren: Ich arbeite nur auf 12 h pro Woche Basis, was heißt, dass ich, wenn ich das Ding schnell fertig kriegen will (und dass muss ich bei der sonst noch anstehenden Arbeit), auf Kommentare verzichten muss, und dann wenn es weniger zu tun gibt (z.B. Semesterferien) diese nachholen kann...

Und zu den "" im Array, es mag vlt nicht dem normalen Stil entsprechen, aber es erspart ". ." in Strings wie SQL-Befehlen, und dass ist, bei so einem System sehr viel Code...
 
Zuletzt bearbeitet:
Zurück