[PHP/MySQL] Login
-
Bin gerade dabei ein Forum zu scripten. Und für den Login habe ich folgende Abfrage gescriptet:
<?php $db = mysql_connect(); $weiter=1; $sql="SELECT * FROM user"; $res=mysql_query($sql, $db); while ($ligne = mysql_fetch_object ($res)) { if ($name = $ligne->name) { print ("Benutzername OK...<br>"); } else { print ("Falscher Benutzername!<br>"); $weiter = 0; } if ($passwort = $ligne->passwort) { print ("Passwort OK...<br>"); } else { print ("Passwort falsch!<br>"); $weiter = 0; } } if ( $weiter == 1) { print ("Sie sind jetzt eingeloggt! <br><br> <a href=forum.php>Zum Forum</a>"); } else { print ("<a href=login.htm>Zurück</a>"); } ?>
Da zeigt der mir aber nur jedesmal, egal was ich eingebe, an:
Benutzername Ok
Passwort Ok
Sie sind eingeloggtund das so oft, wie ich Accounts in der Datenbank habe... Also kann mir jemand mit de Source-Code helfen?
[edit]Code-Tags eingefügt[/edit]
[ Dieser Beitrag wurde am 23.04.2003 um 19:16 Uhr von flenders editiert. ]
-
== - Operator! Das ist mir beim ersten überlesen aufgefallen....
-
ich hab das while durch if ersetzt, jetzt schreibt der das nur einmal, aber der nimmt nur den ersten User an und gar kein Passwort...
-
$sql="SELECT * FROM user";
macht man nicht wenn man nicht alle felder braucht. Und auch wenn man sie braucht schreibt man die felder in die SELECT da ja Felder dazukommen können
Abfrage ob Login correct mitselect id from user where userid = usereingabe AND passwort = passworteingabe
wenn kein Datensatz zurückkommt dann gibt es den user mit passwort nicht.[ Dieser Beitrag wurde am 23.04.2003 um 16:57 Uhr von Unix-Tom editiert. ]
-
Hi!
Ich weiß nicht ob es an jendem liegt was ich dir jetzt sage..
Also du hast auf jedenfall einen Denkfehler drinnen.du fragst erst ab, ob der Benutzername ok ist, und dann ob das Password falsch ist. Du musst die PAssword abfrage aner in die Benutzerabfrage intengieren. Also zb.
while( XX ) { if( $sql_name == $eingabe_name ) { if( $sql_password == $eingabe_password ) { echo "Login ok."; break; } else { echo "Password nicht richig."; break; } } else { echo "Diesen Benutzername kennen wir nicht"; } }// while
Weil sonst wird ja das Password von einem anderen überprüft.
Aber ich würde die sql abfrage anders machen. zb.
$sql="SELECT * FROM user WHERE name='$eingabe_name'"; $res=mysql_query($sql, $db);
Und dann den folgenden Code wie ich oben gepostet habe.
Am Besten du setzt den PrimeryKey auf das Feld 'name' bei vielen einträgen ist das die Mysql Routine super Schnell.So ich hoffe ich habe dich ein bisschen weitergebracht..
bye
-
jepp bei den if - abfragen weist du mit dem operator = nur der variablen nen neuen wert zu,m und da das im normalfalle immer funktioniert ist das true -> Er geht in die If - abfrage mit korrekt rein.
Deshalb solltest du den operator auf das vergleichen abändern: "==" (siehe cenetrix)
mfg
-
ich würde unix-tom's methode vorziehen. aus sicherheitsgründen ist es meines erachtens bei anmeldungen jeder art übrigens besser, bei einem fehler nur ein "login incorrect" (o.ä.) auszugeben, statt detailliert: falscher nutzer oder falsches passwort. z.b. in diesem forum ist benutzername nicht umbedingt angezeigter name -> wenn dich jemand hacken will, hat ers mit der 2. ausgabe leichter
-
hey Leute, thx für die Hilfe
-
Hi!
@Korbinian:
Dann würde ich den PrimaryKey auch für das Feld password setzten sonst dauert das bei vielen Einträgen viel zu lange.Außderdem hast du den Nachteil, dass du nicht testen kannst, ob der User überhaupt Exitstiert. UNd das ist oft schlecht.
Wenn zb. Jemand sich vor langer Zeit sich bei einem Service angemeldet hat und nicht mehr weiß ob er sich angemeldet hat, kann er nicht einmal schaune, ob sein Benutzername in der Datenbank vorhanden ist, da du ja nur "RICHTIG" bzw. "FALSCH" zurück geben kannst.
Aus diesen Gründen finde ich meine Lösung besser.
Aber das empfindet jeder anders.Bye
-
@Cenetix: bei deiner Lösung zeigt der, wenn der Login korrekt, ist alles richtig an, auch wenn das PW falsch ist, aber wenn der Name falsch ist zeigt der nix an...
[ Dieser Beitrag wurde am 23.04.2003 um 23:37 Uhr von MasterDeath editiert. ]
-
Ich dachte das soll ein login. Von einem bestimmten User von einer Liste einzuloggen. Und wenn ein Benutzername nicht Existiert muss er doch auch nicht das Password überprüfen oder nicht ?
Und wie ich schon als BSP erwähnt habe ist es normal, dass eine Login-Routine dem User mitteilen sollte ob jetzt das Password falsch ist und der Benutzername nicht bekannt ist.
UNd genau das macht meine Login-Routine.
Bye
-
eingabe_name'";
Gleicher Fehler wie MasterDeath.
Warum wollt ihr Felder abfragen die nicht nötig sind.
Insebsonders im WEB sollte man dies unterlassen da man auch damit rechnen muss, daß 1000de USER gleichzeit diese Abfrage machen.
Und jetzt kann man sich ausrechen wieviel Rechenzeit man verschenkt hat.
-
also du meinst:
$sql="SELECT name AND passwort FORM user WHERE name='$name'";
hab ich das richtig verstanden?
-
Wenn dann
$sql="SELECT name, passwort FORM user WHERE name='$name'";
eigentlich sollte aber auch
$sql="SELECT passwort FORM user WHERE name='$name'";
reichen, oder?
-
nee, das 2.te tut's nicht und das erste auch nicht... wieso kommt bei mir nichts,wenn ich einen falschen benutzernamen eingebe? so sieht mein script aus:
<?php $db = mysql_connect(); $sql="SELECT name, passwort FROM user WHERE name='$name'"; $res=mysql_query($sql, $db); while ($ligne = mysql_fetch_object ($res)) { if ($name == $ligne->name) { if ($passwort == $ligne->passwort) { print ("Sie sind eingeloggt!<br><br><a href=forum.php>Zum Forum</a>"); break; } else { print ("Passwort falsch!<br><br><a href=login.htm>Zurück</a>"); break; } } else { print ("Benutzer existiert nicht...<br><br><a href=login.htm>Zurück</a> )"; } } ?>
[ Dieser Beitrag wurde am 24.04.2003 um 13:37 Uhr von MasterDeath editiert. ]
-
Warum nicht
-
du kriegst bei einem falschen namen natürlich nichts, da du ja einen datensatz abfragst, der nicht existiert... (WHERE user='irgewas')
-
Wenn du keinen Datensatz zurückgeliefert bekommst (weil der Username falsch ist) kommst du gar nicht in deine while Schleife!
-> 1. Überprüfe einfach zuerst mit mysql_num_rows, ob du ein Ergebnis hast
-> 2. "SELECT passwort FROM user WHERE name='name'" reciht aus! -\> 3\. if (name == $ligne->name) kannst du dir sparen (ist ja schon im SQL-Befehl). Um zu überprüfen, ob der User vorhanden ist (siehe 1.)
-
ich hab einfach eine 2. if-Abfrage eingebaut:
<?php $db = mysql_connect(); $sql="SELECT name, passwort FROM user WHERE name='$name'"; $res=mysql_query($sql, $db); $weiter=1; while ($ligne = mysql_fetch_object ($res)) { if ($name == $ligne->name) { if ($passwort == $ligne->passwort) { print ("Sie sind eingeloggt!<br><br><a href=forum.php>Zum Forum</a>"); $weiter=0; break; } else { print ("Passwort falsch!<br><br><a href=login.htm>Zurück</a>"); $weiter=0; break; } } } if ($weiter == 1) { print ("Benutzername existiert nicht!<br><br><a href=login.htm>Zurück</a>"); } ?>
Das funzt jetzt auch
-
Warum nur so kompliziert
aber wenn du nicht auf mich hören willst