PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [PHP] LogIn system - Probleme bei der Ausgabe von Fehlermeldungen



Time Streamer
17.11.2006, 13:50
Moin.
Wie der Titel schon sagt, bin ich gerade dabei ein kleines LogIn System zusammenzubasteln, das wie folgt arbeitet:
In einem simplen html-Formular werden Nutzername und Passwort eingegeben, die dann mit <form method=post> an das nächste Dokument geschickt werden, wo die Daten dann überprüft werden und entsprechende Ausgaben erfolgen (sprich: Bei falschen LogIn Daten eine Fehlermeldung, ansonsten die eigentliche Seite.)
Dabei habe ich insgesamt 2 verschiedene Fehlermeldungen entworfen (eine die angezeigt wird wenn der Nutzername falsch ist und eine wenn der Nutzername stimmt, aber das Passwort falsch ist.)
Das Ding an sich funktioniert auch wie es soll: Wenn Name+Passwort korrekt sind, bekommt man das eigentliche Dokument angezeigt, ansonsten gibts ne Fehlermeldung.
Nur machen die Fehlermeldungen an sich wie folgt Probleme:
Wenn der eingegebene Nutzername und das Passwort korrekt sind, bekommt der User zwar die Seite angezeigt zu der er gelangen soll, allerdings auch die Fehlermeldung "Nutzername falsch".
Wenn Passwort und/oder Nutzername nicht stimmen, werden einfach stumpf beide Fehlermeldungen ausgegeben.

Der zugehörige php Code sieht wie folgt aus (ich hoffe dass die Kommentare deutlich genug beschreiben, was welche Funktion haben soll, ansonsten einfach fragen):

<?php
$user = $_POST["user"];
$passwort = $_POST["passwort"];

if (isset($_POST["user"],$_POST["passwort"]))
{
$ok = false;

$data = file("pw.txt"); //***Datei mit den Usernamen & Passwörtern***

foreach ($data as $line)
{$ok = false;
$ar = explode(",", $line); //***Trennzeichen zwischen Name und Passwort (hier: ,)***
$u = trim($ar[0]);
$p = trim($ar[1]);

//***Prüfen der LogIn Daten & Fehlermeldungen***

if ($u == $user) //***Wenn Nutzername stimmt***
{
if ($p == $passwort) //***Wenn auch passwort stimmt***
{$ok = true;} //***login-Variable auf "true" setzen -> Einloggen ermöglichen***

else
{echo "Falsches Passwort!<br><br>
Bitte Zurück-Funktion des Browsers benutzen.";} //***Wenn Passwort nicht stimmt, Fehlermeldung***
}
else
{echo "Benutzername nicht gefunden!<br><br>
Bitte Zurück-Funktion des Browsers benutzen.";} //***Wenn Nutzername nicht stimmt, Fehlermeldung***

}

//***Wenn Angaben alle korrekt***

if ($ok == true)
{ blablabla}
} ?>Wie gesagt, das LogIn System an sich läuft wie es soll, nur die Ausgabe der Fehlermeldungen stimmt nicht so ganz und ich bin grad zu dumm den Fehler zu finden ;)

Danke schonmal im vorraus für jede Hilfe.

mitaki
17.11.2006, 18:22
$user = $_POST["user"];
$passwort = $_POST["passwort"];
Wozu dieses sinnlose Variablenschaukeln? Effektivität im negativen Bereich.


isset($_POST["user"]) && isset($_POST["passwort"])
Es geht auch einfacher:

isset($_POST["user"],$_POST["passwort"])

Warum der von dir beschriebene Fehler auftritt ist mir leider unklar, zumal du alles richtig Verschachtelt hast (an der Einrückung kannst du aber noch arbeiten).

Ich nehme an, dass die foreach-Schleife mehrmals ausschlägt. Da innerhalb dieser kein $ok = false; am Anfang steht wird das $ok = true; vom ersten Durchlauf weiterhin verwendet, während die erneute Prüfung (hochwahrscheinlich eine Leerzeile o.ä. in der Textdatei) statt $ok = true; eben den Fehler ausgibt.

Time Streamer
18.11.2006, 22:21
Warum der von dir beschriebene Fehler auftritt ist mir leider unklar, zumal du alles richtig Verschachtelt hast (an der Einrückung kannst du aber noch arbeiten).

Ich nehme an, dass die foreach-Schleife mehrmals ausschlägt. Da innerhalb dieser kein $ok = false; am Anfang steht wird das $ok = true; vom ersten Durchlauf weiterhin verwendet, während die erneute Prüfung (hochwahrscheinlich eine Leerzeile o.ä. in der Textdatei) statt $ok = true; eben den Fehler ausgibt.

Es liegt tatsächlich daran, dass die Schleife mehrmals ausschlägt.
Ich habe in der Datei in der Namen und Kennwörter gespeichert sind insgesamt 2 User/Kennwörter gespeichert.
Wenn ich einen davon rausnehme, also nur noch 1 Nutzername/Kennwort vorhanden ist, dann funktioniert alles genauso wie es soll.
Da ich es aber schon ganz gerne hätte, dass es auch mit mehreren Nutzernamen/Kennwörtern klappt (wenn schon, dann richtig ;) ) will ich das als Lösung aber nicht unbedingt hinnehmen...
Allerdings fällt mir jetzt auch nichts ein was ich machen könnte um das zu verhindern dass die Schleife mehrmals durchläuft. Gibts da vielleicht einen Befehl bei php mit dem man einer Schleife sagen kann, dass sie nur so lange durchlaufen soll, bis der erste Treffer gelandet ist? Also praktisch "vergleiche so lange den Inhalt der Textdatei mit den eingegebenen LogIn Daten bis sie das erste mal übereinstimmen und dann breche ab"?
Ich beschäftige mich wohlbemerkt noch nicht allzu lange mit php, also sorry wenn diese Frage vielleicht ein wenig ... dumm klingt ;)

Die Lösung mit "$ok = false;" am Anfang des Anweisungsblocks hat leider nichts gebracht.
Wenn ich das da reinsetze, dann gibts für User 1 bei korrektem LogIn nur noch die Fehlermeldung "Nutzername falsch", man bekommt aber nicht mehr das angezeigt was man bei richtigem LogIn sehen soll.
Also im Grunde keine Veränderung, außer dass für User 1 kein korrekter LogIn mehr möglich ist.


Wozu dieses sinnlose Variablenschaukeln? Effektivität im negativen Bereich. Stimmt eigentlich ...

Hey, ich bin noch Anfänger, ich darf das ;)

mitaki
18.11.2006, 22:34
Wenn du auf eine allgemeine Fehlermeldung setzt könntest du das Problem verhindern.

Sprich: Schleife wird mit allen Prüfungen ausgeführt. Nach der Schleifen wird dann $ok überprüft, wenn true: Inhalte anzeigen, wenn false: eine allgemeine Fehlermeldung ausgeben. Etwa: Ungültiger Benutzername oder Passwort angegeben.

Manni
19.11.2006, 11:25
Allerdings fällt mir jetzt auch nichts ein was ich machen könnte um das zu verhindern dass die Schleife mehrmals durchläuft. Gibts da vielleicht einen Befehl bei php mit dem man einer Schleife sagen kann, dass sie nur so lange durchlaufen soll, bis der erste Treffer gelandet ist? Also praktisch "vergleiche so lange den Inhalt der Textdatei mit den eingegebenen LogIn Daten bis sie das erste mal übereinstimmen und dann breche ab"?

Der entsprechende PHP-Befehl nennt sich break (http://de2.php.net/break) ;)
Guck dir am besten einfach mal alle Kontrollstrukturen auf der linken Seite an.

Time Streamer
19.11.2006, 22:03
Erstmal danke für den tollen Link. ;)

mhh ... break ... klingt gut. Werds die Tage mal reinbasteln.

@mitaki: Hast wohl recht, wär fürs erste einfacher es mit einer allgemeinen Fehlermeldung zu versuchen. Werd das beim nächsten Versuch mal berücksichtigen ;)