dedlfix: Loginscript funktioniert nicht... wieso?

Beitrag lesen

echo $begrüßung;

Ich habe ien Loginscript. Wenn ich dort meinen Namen und Pw eingebe erscheint immer fehler.php obwohl das pw und der name _richtig 100%__nicht falsch__ _ eingegeben wurde.

Solche Fehler sucht man, indem man sich die Inhalte der Variablen ausgibt. Ebenso kann man sich die Ergebnisse von Ausdrücken ausgeben lassen. Geeignete Funktionen sind neben echo und print() vor allem var_dump(). var_dump() gibt neben dem Wert auch noch den Typ aus und ist bei der Anzeige boolscher Werte genauer (true/false statt 1/nix). Für Arrays und Objekte ist auch noch print_r() geeignet.

Ansonsten vermisse ich das Reagieren auf Fehlerzustände in deinem Script.

$c=mysql_connect($host,$user,$pw);
mysql_select_db('xxx',$c);

Wenn der Connect misslingt (falsche Logindaten, Datenbank hat grad Pause, ...) gibt mysql_connect() keine Ressourcenkennung sondern false zurück. Das wiederum mag weder mysql_select_db() noch mögen es die anderen mysql_*-Funktionen als Parameter haben. PHP quittiert das dann mit einer "not a valid argument"-Fehlermeldung.

$query="SELECT user FROM xxx1 WHERE user='$name' OR userid='$name' AND pwd='$pwd'";
$sql=mysql_query($query);
if(mysql_num_rows($sql)==1){

Ebenso ist es bei mysql_query().

Den OR-Ausdruck willst du sicherlich in Klammern setzen. Da das AND eine höhere Priorität hat als das OR, wird zuerst userid und pwd ausgewertet und das Ergebnis dessen anschließend noch mit dem user-Vergleich "geORt". Wenn user gleich $name ist, wird damit dein Ausdruck schon wahr.

Nehmen wir mal an, dass du nun die Klammern richtig gesetzt hast. Was passiert eigentlich mit deinem Loginvorgang, wenn jemand in dein Passwortfeld ' OR 1 OR ' (inklusive der ' ) eingibt?

Wenn das steht if($akt1=1&&$akt2=1&&$akt3=1) {Anweisung},
dann heißt das doch das _nur_ wenn
$akt1 _und_ $akt2 _und_ $akt3 den Wert 1 haben, die Anweisung passiert oder?

Nein, heißt es nicht. Du solltest dir nochmal den Unterschied zwischen Zuweisungs- und Vergleichsoperatoren unter PHP anschauen.

Es gibt einen kleinen Trick, wie man den Parser nutzen kann, einem solche Fehler zu zeigen. Wenn man den konstanten Ausdruck links vom versehentlich verwendeten Zuweisungsoperator notiert und die Variable rechts davon ergibt das eine ungültige Zuweisung, die der Parser ankreidet. Aber wenn man schon daran denkt, das so zu notieren, denkt man sicher auch daran, den richtigen Operator zu verwenden.

echo "$verabschiedung $name";