Alltimefriend: Login-Bereich mit MySQL

Hallo!

Folgendes: Ich hab ein Script geschrieben, mit dem man sich durch eingeben verschiedener Daten in meine MySQL-DB einträgt.
Da es sich um eine User-Registrierung handelt, sind natürlich die Felder nick und pwd dabei. Später werd ich das Passwort verschlüsselt eingeben, aber für den Anfang geht es auch so.

Nun zu meinem Problem: Ich hab Probleme beim Login-Verfahren. Und zwar möchte ich, dass er nur dann weitergeleitet wird, wenn nick und pwd in der Datenbank gefunden wurde.
Die Felder im Login-Formular nenne ich user und pass.

Folgende SQL-Abfrage müsste ja u.a. dazugehören:

$query = "SELECT * FROM user WHERE nick='$user' AND pwd='$pass'";

Ich mein, so durchsucht es ja die Datenbank und vergleicht jedes mit der Eingabe. Das Problem ist, dass $query hier den ganzen Satz wiedergibt.

Wie gehört die Zeile umgeändert, dass es mir true oder false in der Variable speichert?

Hoffe, dass mir jemand helfen kann.

Danke im voraus

Gruß, Jan

  1. Folgende SQL-Abfrage müsste ja u.a. dazugehören:

    $query = "SELECT * FROM user WHERE nick='$user' AND pwd='$pass'";

    Ich mein, so durchsucht es ja die Datenbank und vergleicht jedes mit der Eingabe. Das Problem ist, dass $query hier den ganzen Satz wiedergibt.

    Wie gehört die Zeile umgeändert, dass es mir true oder false in der Variable speichert?

    $abfrage="SELECT * FROM user WHERE nick='$user' AND pwd='$pass'";
    $ergebnis=mysql_query($abfrage,$dbref);
    $anzahl=mysql_num_rows($ergebnis);
    if($anzahl==1)
    {
    // User existiert
    }
    else
    {
    // User existiert nicht
    }

    Das SELECT * FROM kann sich natuerlich auch nur auf ein Feld beziehen.

    MfG, Thomas

    1. Folgende SQL-Abfrage müsste ja u.a. dazugehören:

      $query = "SELECT * FROM user WHERE nick='$user' AND pwd='$pass'";

      Besser wäre jedoch:
      $query = "SELECT COUNT(*) FROM user WHERE nick='$user' AND pwd='$pass'";

      $abfrage="SELECT * FROM user WHERE nick='$user' AND pwd='$pass'";
      $ergebnis=mysql_query($abfrage,$dbref);
      $anzahl=mysql_num_rows($ergebnis);
      if($anzahl==1)
      {
      // User existiert
      }
      else
      {
      // User existiert nicht
      }

      Somit würde dann der Code so aussehen:

      $abfrage="SELECT COUNT(*) FROM user WHERE nick='$user' AND pwd='$pass'";
      $ergebnis=mysql_query($abfrage,$dbref);
      if($ergebnis)
      {
      // User existiert
      }
      else
      {
      // User existiert nicht
      }

      lg webmonk

      p.s.: IMHO ist COUNT eine elegantere Lösung...

      1. $abfrage="SELECT COUNT(*) FROM user WHERE nick='$user' AND pwd='$pass'";
        $ergebnis=mysql_query($abfrage,$dbref);
        if($ergebnis)
        {
        // User existiert
        }
        else
        {
        // User existiert nicht
        }

        Das funktioniert zwar nun mit der Variable nick/user, aber wenn er prüft das Passwort nicht ab :o(
        D.h., wenn der User stimmt, geht er auf "User existiert", egal ob das Passwort korrekt ist, oder nicht.

        Deshalb hab ich folgendes geschrieben:

        $sql = "SELECT COUNT(*) FROM user WHERE nick='$benutzer' AND pwd='$pass'";
        $result = mysql_query($sql,$conn);
        $number = mysql_num_rows($result);
        if($number != 1) {
        echo "Benutzer $benutzer existiert nicht";
        } else {
        if($pwd != $pass) {
        echo "Das Passwort wurde falsch eingegeben";
        } else {
        echo "Benutzer $benutzer korrekt eingeloggt";
        }
        }

        Ich habe eben eine genau Überprüfung im Kopf, er soll nicht einfach prüfen, ob beides stimmt oder nicht ohne zu wissen, welches dann falsch ist.

        Da der obere Teil schön zurückgibt, ob der $nick auch wirklich mit $user ident ist, wollte ich das Passwort mit der if-Schleife überprüfen.
        Leider kommt immer die Meldung "Undefined variable: pwd in c:\programme\apache group\apache\htdocs\lubf\auth.php on line 10"

        Das ist die Zeile mit dem if($pwd !=$pass), doch die Variable wurde doch in der SQL-Abfrage definiert, oder irre ich mich da?

        Gruß, ATF

        1. servus,

          pwd ist keine php variable sondern ein mysql feld,
          du kannst mit mysql_fetch_array aus der antwortzeile
          ein array machen.

          $arrErgebnis = mysql_fetch_array($result);

          und mit $arrErgebnis["pwd"] zb auf das pwd feld zugreifen.

          bis dann
          FICHTL

          1. Hi!

            Nun hab ich diesen Code:

            $sql = "SELECT * FROM user WHERE nick='$benutzer' AND pwd='$pass'";
            $result = mysql_query($sql,$conn);
            $arrErgebnis = mysql_fetch_array($result);
            if($arrErgebnis["nick"] != "$benutzer") {
            echo "Benutzer $benutzer existiert nicht";
            } elseif($arrErgebnis["pwd"] != "$pass"){
            echo "Das Passwort ist nicht korrekt.";
            } else {
            echo "Hallo $benutzer";
            }

            Doch es scheint so, als ob er nur das Feld "nick" aus der DB holt und "pwd" sein lässt.
            Das Script prüft zwar den den Benutzer ab, aber auch mit falschem Passwort werde ich "eingeloggt".

            Gruß, ATF

            1. Jetzt bin ich total verwirrt, denn bis jetzt hatte ich überhaupt nur einen User in der Datenbank. Um es besser zu testen, habe ich noch 2 weitere angelegt, doch nur User Nr. 1 wird überhaupt gefunden :(

            2. seas,

              $sql = "SELECT * FROM user WHERE nick='$benutzer' AND pwd='$pass'";
              $result = mysql_query($sql,$conn);
              $arrErgebnis = mysql_fetch_array($result);
              if($arrErgebnis["nick"] != "$benutzer") {
              echo "Benutzer $benutzer existiert nicht";
              } elseif($arrErgebnis["pwd"] != "$pass"){
              echo "Das Passwort ist nicht korrekt.";
              } else {
              echo "Hallo $benutzer";
              }

              erstens ist das doppelte prüfung denn du bekommst sowieso nur
              die benutzer wo nick='$benutzer' UND pwd='$pass' sind, das heißt
              es kann gar keinen $arrErgebnis["nick"] != "$benutzer" geben weil
              du ja vorher schon sagst das du diese benutzer nicht selectieren
              willst.

              du möchtest wissen ob nick='$benutzer' ist und ob pwd='$pass'
              also ob es den benutzer gibt und ob das passwort richtig ist.
              von der security seite her ist das schlecht wenn jemand versucht
              einzubrechen dann sagst du ihm ganz klar was er falsch hat.

              entweder falscher benutzer oder falsches passwort wenn er also
              einen benutzer gefunden hat denn es gibt braucht er nur noch
              nach dem passwort suchen. darum habe ich dir die andere lösung
              gezeigt.

              wenn du das mit pass und nick wirklich so willst mußt du vorher
              alle benutzer selectieren und dann mittels if prüfen ungefär so

              $sql = "SELECT * FROM user";
              $result = mysql_query($sql,$conn);
              $arrErgebnis = mysql_fetch_array($result);

              if($arrErgebnis["nick"] == "$benutzer") {
                if ($arrErgebnis["pwd"] == "$pass") {
                  echo "Alles klar!!!";
                } else {
                  echo "Passwort falsch.";
                }
              } else {
                echo "Benutzer falsch.";
              }

              ich hoffe es ist jetzt etwas klarer geworden.

              grüße
              FICHTL

              1. Ich hatte es ja am Anfang auch komplett mit einer SELECT-Abfrage gemacht, nur ignorierte er mir immer die Passwortsequenz pwd='$pass'.

                Jetzt weiß ich auch wieso!

                Aus irgendeinem Grund mag PHP keine Variable $pass, ich hab sie in $pw umbenannt und schon klappte es vorzüglich :o)

                Gruß, ATF

      2. Folgende SQL-Abfrage müsste ja u.a. dazugehören:

        $query = "SELECT * FROM user WHERE nick='$user' AND pwd='$pass'";

        Besser wäre jedoch:
        $query = "SELECT COUNT(*) FROM user WHERE nick='$user' AND pwd='$pass'";

        $abfrage="SELECT * FROM user WHERE nick='$user' AND pwd='$pass'";
        $ergebnis=mysql_query($abfrage,$dbref);
        $anzahl=mysql_num_rows($ergebnis);
        if($anzahl==1)
        {
        // User existiert
        }
        else
        {
        // User existiert nicht
        }

        Somit würde dann der Code so aussehen:

        $abfrage="SELECT COUNT(*) FROM user WHERE nick='$user' AND pwd='$pass'";
        $ergebnis=mysql_query($abfrage,$dbref);
        if($ergebnis)
        {
        // User existiert
        }
        else
        {
        // User existiert nicht
        }

        Nicht ganz, weil in $ergebnis nur die Resource-ID steht, deshalb:

        $abfrage="SELECT COUNT(*) FROM user WHERE nick='$user' AND pwd='$pass'";
        $ergebnis=mysql_query($abfrage,$dbref);
        $ausgabe=mysql_fetch_row($ergebnis);
        $anzahl=$ausgabe[0];
        // usw.

        oder mittels

        $abfrage="SELECT COUNT(*) AS wert FROM user WHERE nick='$user' AND pwd='$pass'";
        $ergebnis=mysql_query($abfrage,$dbref);
        $ausgabe=mysql_fetch_array($ergebnis);
        $anzahl=$ausgabe[wert];
        // usw.

        MfG, Thomas

        1. ups, mein fehler, sorry, natürlich hast du vollkommen recht.

          lg webmonk

  2. servus,

    vielleicht auch mit einer funktion die ein
    array mit allen user daten zurück gibt.

    function getUser($user,$pass) {
     $user = mysql_query($query = "SELECT * FROM user WHERE nick='$user' AND pwd='$pass'");
     return mysql_fetch_array($user);
    }

    Abfrage dann mit:

    if ($arrUser = getUser($strInputNick,$strInputPass))
      echo "Willkommen ".$arrUser["nick"];
    else
      echo "Verpiss dich ".$strInputNick;

    schöne grüße
    FICHTL

    1. verdammtes copy-paste :-)

      function getUser($user,$pass) {
        $user = mysql_query("SELECT * FROM user WHERE nick='$user' AND pwd='$pass'");
        return mysql_fetch_array($user);
      }

      schöne grüße
      FICHTL