PHP Formular mit Passwortübergabe will nicht so recht

CitroenDsVier

Lt. Commander
Registriert
Dez. 2013
Beiträge
1.896
Hallo zusammen,

bin langsam am Verzweifeln hier, bin jetzt eigentlich der Meinung dass der Fehler im Browser liegt :freak:

es geht um ein simples Formular, das zwei Parameter ("album" und "password" im Typ hidden und password) an eine passwort.php per POST übergeben soll.

HTML:
<form id="password-form" action="password.php" method="POST">
	<input type="hidden" name="album" value="<?php echo $album; ?>" />
	<input type="password" name="password" placeholder="Passwort" />
	<input type="submit" value="Senden" />
</form>

PHP:
if(isset($_POST["password"]) and isset($_POST["album"])) {
	if($_POST["password"]!="" and $_POST["album"]!="") {
		$password = $_POST["password"];
		$album = $_POST["album"];
		switch($album) {
			case "abc":
				$correct_password = "1";
			case "def":
				$correct_password = "2";
			default:
				$correct_password = "";
		}
		if($password == $correct_password) {
			// erstelle Session
			$_SESSION["$album"] = true;
			header("Location:?album=$album");
		} else {
			// verlinke auf index.php/album
			// übergebe, dass Passwort falsch
			header("Location:?album=$album&incorrect_password");
		}
	} else {
		header("Location:?album=$album&empty_password");
	}
} else {
	// something-went-wrong
	header("Location:?album=$album&something_went_wrong");
}

Aus mir unbeschreiblichen Gründen erkennt er aber $_POST["password"] und $_POST["album"] als nicht gesetzt an und geht in die "something-went-wrong"-Abeteilung.

Kann mir Jemand helfen?

MfG, V40

Nachtrag: Firefox meldet dann gleichzeitig, dass die Seite die Umfrage so umleiten würde, dass sie nicht beendet werden könne. Verstehe ich auch nicht, von der index.php wird nirgendwohin geleitet.
 
Zuletzt bearbeitet:
Hier stand Schwachsinn.

Ergänzung: Sorry verschlafen, sehe gerade das der das an password.php weitergibt.
 
Zuletzt bearbeitet:
Moin,

gleich mehrere Fehler:

PHP:
//1. Vorschlag:
print_r($_POST);
​die();
if (isset($_POST["password"]) and isset($_POST["album"])) {
    if ($_POST["password"] != "" and $_POST["album"] != "") {
        $password = $_POST["password"];
        $album = $_POST["album"];
        switch ($album) {
            case "abc":
                $correct_password = "1";
            break;//Nötig, da der Interpreter ansonsten alle Fälle in switch - case durchwandert, bis ein break gefunden wurde
            case "def":
                $correct_password = "2";
            break;
            default:
                $correct_password = "";
            break;
        }
        if ($password == $correct_password) {
            // erstelle Session
            $_SESSION["$album"] = true;//Soll da wirklich der INhalt von $album als Name des Schlüssels verwendet werden?
            header("Location:?album=$album");
        } else {
            // verlinke auf index.php/album
            // übergebe, dass Passwort falsch
            header("Location:?album=$album&incorrect_password");
        }
    } else {
        header("Location:?album=$album&empty_password");
    }
} else {
    // something-went-wrong -- Woher kommt $album, wenn es laut isset nicht gesetzt wurde?
    header("Location:?album=$album&something_went_wrong");
}

Viele Grüße,
ichthys :-)
 
Code:
if (isset($_POST["password"]) and isset($_POST["album"])) {

Bitte so:

Code:
if (isset($_POST["password"]) && isset($_POST["album"])) {

Sonst bringst du jeden Coder zum weinen :)

Nein Spaß, es ist einfach unkonventionell und Sprachenübergreifend etabliert && für AND und || für OR zu verwenden.
 
SoapWater schrieb:
Nein Spaß, es ist einfach unkonventionell und Sprachenübergreifend etabliert && für AND und || für OR zu verwenden.

Und hat noch einen weiteren Vorteil: bei den beiden "Kurzschreibweisen" wird überprüft, ob der Rest der Anweisung überhaupt noch durchlaufen werden muss. Wenn also $_POST["password"] ohnehin nicht gesetzt ist, wird bereits in den Else-Block gesprungen.
 
Naimless schrieb:
Und hat noch einen weiteren Vorteil: bei den beiden "Kurzschreibweisen" wird überprüft, ob der Rest der Anweisung überhaupt noch durchlaufen werden muss.
Das gilt nicht für PHP, in dieser hinsicht sind beide Schreibweisen identisch.
Das Problem ist eher die Rangfolge, and/or sind da noch unter =. Also lieber &&/|| benutzen, es sei denn man weis was man tut (in dem Beispiel hier ist es aber nochmal gut gegangen).

$album ungeprüft/unbearbeitet in den Header zu knallen halte ich auch nicht für ideal.

@Ichthys: Was mach das die() in deinem Code? Edit: Ach ja, damit man auch mal die Ausgabe sieht, wegen dem Location Header.
 
Zuletzt bearbeitet:
So richtig sehe ich erstmal auch keinen grundlegenden Fehler der das verhindern sollte.
Da kann man dann erstmal nur schrittweise vorgehen und forschen:

Abgesendeten HTTP Request kontrollieren, am einfachsten mit dem Wireshark.

Prüfen ob nicht der Server die Anfrage in irgend einer Weise verbiegt, v.a. die Rewriter spucken da gern mal in die Suppe. Läuft dein Skript auf einem eigenen Server oder ist der von einem Hoster? Ggf. einfach mal auf einem eigenen ausprobieren.
 
@Ichthys: Danke für Deine Antwort! Heute morgen ist mir unterwegs plötzlich eingefallen "break!!". Den Fehler hab ich inzwischen erkannt :)

Der Inhalt von $album soll deshalb als Name des Schlüssels verwendet werden, weil es verschiedene Alben mit verschiedenen Passwörtern geben wird. Dann kann easy kontrolliert werden, ob eine Session für das entsprechende Album existiert. Würde ich $album in den Wert des Session-Schlüssels schreiben, könnte immer nur für ein Album das gültige Passwort gesetzt sein.

Und $album kann natürlich nicht in den Verweis auf die index.php gepackt werden, wenn es nicht gesetzt ist. Logisch :-)

ein weiterer Fehler war, dass ich beim Verweisen auf die index.php (deren Name ich aus optischen Gründen nicht schreiben wollte) wenigstens einen "." vor das Fragezeichen der GET-Parameter setzen muss:

PHP:
header("Location:?getparameter1=wert&getparameter2=wert2") //verlinkt nicht auf die index.php
header("Location:.?getparameter1=wert&getparameter2=wert2") //verlinkt auf die index.php

@Soapwater: Ich hatte es auch am Anfang mit && für and und || für or, bis ich an mir selbst gezweifelt habe und in der php-Dokumentation gelesen habe, dass "and" und "or" auch akzeptiert werden. Musste dann natürlich ausprobieren, ob das am Fehler etwas ändert.
Ich denke Nachts um 12 bin ich einfach nicht mehr auf dem geistigen Stand wie morgens...
 
Zuletzt bearbeitet:
Hier noch mal ein kleines Beispiel wie man den IF-Salat aufloesen kann :)
Anstelle des Switch-Blocks habe ich ein Array zur Hand benommen. Man koennte die Alben-Passwoerter spaeter aus einer Datenbank holen anstatt jedesmal das Switch zu aendern.

Code:
<?php
// direkt abbrechen wenn wenn password und album nicht gesetzt sind
if(!isset($_POST['password'])
    || !isset($_POST['album'])
    || empty($_POST['password'])
    || empty($_POST['album'])) {

    // something-went-wrong
    header("Location:.?album=$album&something_went_wrong"); // $album ist hier noch gar nicht gesetzt
}

$password = $_POST['password'];
$album = $_POST['album'];

// koennte zum Beispiel aus einer Datenbank kommen
$album_passwords = array(
    'abc' => '1',
    'def' => '2',
);

if(isset($album_passwords[$album] && $album_passwords[$album] === $password) {
    // erstelle Session
    $_SESSION[$album] = true;
    header("Location:.?album=$album");
} else {
    // verlinke auf index.php/album
    // übergebe, dass Passwort falsch
    header("Location:.?album=$album&incorrect_password");
}
 
Zurück
Oben