Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] MySQL information auslesen

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] MySQL information auslesen

    hi,

    ich hab mir ein login-system mit email aktivierung gebaut. das alles arbeitet mit mysql. bisher funktioniert auch (fast) alles, wie es soll. ich hab nur das problem, dass man sich schon einloggen kann, bevor der aktivierungslink der email angeklickt wurde.

    in meiner datenbank ist in der tabelle 'Aktivierung' ein feld 'Aktiviert' hier steht je nach dem ob der link angeklickt wurde Ja oder Nein.

    meine login.php sieht so aus
    PHP-Code:
    <?php
    session_start
    ();
    ?>

    <?php
    $verbindung 
    mysql_connect("****""*****" "******"
    or die(
    "Verbindung zur Datenbank konnte nicht hergestellt werden");
    mysql_select_db("*****") or die ("Datenbank konnte nicht ausgewählt werden");

    $username $_POST["usernamel"];
    $password md5($_POST["passwordl"]);

    $abfrage "SELECT username, password FROM Aktivierung WHERE username LIKE '$username' LIMIT 1";
    $ergebnis mysql_query($abfrage);
    $row mysql_fetch_object($ergebnis);

    /* HIER */

    if($row->password == $password){
        
    $_SESSION["username"] = $username;
        echo 
    "Login erfolgreich. <br> <a href=\"ingame.php\">Weiter</a>";
        
        }else{
        
        echo 
    "Benutzername und/oder Passwort waren falsch. <a href=\"index.php\">Login</a>";
        }
    ?>
    da wo das zitat steht, sollte eigentlich eine abfrage eingefügt werden, die das feld Aktiviert überprüft. mein falscher code sieht so aus

    PHP-Code:
    $hatzuklappen mysql_query("SELECT username FROM Aktivierung WHERE Aktiviert = 'Ja'"); 
    dann natürlich noch ne bedingung, aber das schaff ich selbst :P

    wenn ich das so einfüge klappt es nicht, könnt ihr mir bitte helfen ? wäre sau cool

    MFG gabsi

  • #2
    Hi.

    $abfrage = "SELECT username, password FROM Aktivierung WHERE username LIKE '$username' LIMIT 1";
    Warum verwendest Du hier LIKE und nicht WHERE username = '".$username."'?

    Zudem solltest du nach der Kombination aus Benutzernamen und Passwort und ist aktiviert prüfen, als Denkanstoß:

    PHP-Code:
    $sqlQuery "SELECT username, password, aktiviert FROM Aktivierung WHERE username = '".$username."' AND password = '".$password."' AND aktiviert = 'Ja'"
    ...soll jetzt nur als Beispiel dienen. Bitte auch mal den Punkt SQL Injection anschauen.

    mfg Wolf29

    P.S. Äh..sehe ich jetzt erst:

    PHP-Code:
    <?php
    session_start
    ();
    ?>

    <?php
    ziemlich überflüssig, php zu "starten", wieder zu "schließen" und dann wieder zu "öffnen"?!?

    Kommentar


    • #3
      Außerdem würde ich anstatt "Ja" und "Nein" 1 und 0 verwenden, sprich aktiviert = true/false.

      Kommentar


      • #4
        ok vielen dank wolf29

        @Trainmaster
        warum sollte das besser sein ? ich seh sowas in vielen scripts, aber wirklich verbessern tut das doch auch nichts - oder ?

        Kommentar


        • #5
          0/1 wäre ein tinyint(1 Byte) in der Datenbank und wurde von PHP bei einer if-abfrage vermutlich korrekt nach true/false gecastet werden.

          Ja/Nein ist ein verschiedenlanger String, der mindestens 4 Zeichen(varchar(4)(5 Byte) lang ist Und nicht direkt in PHP verwendet werden kann.
          Ja/Nein braucht 5-6x soviel Speicherplatz(ohne Gewähr), wie die true/false Variante und ist unpraktischer

          Wenn du das ergebnis nach bool castest, wird JA/Nein immer true, was wohl nicht Sinn der Sache ist)

          Bsp:
          PHP-Code:
          <?php
              $a
          ['stringNull'] =  (bool) "0";
              
          $a['stringEins'] =   (bool) "1";
              
          $a['intNull'] =   (bool)  0;
              
          $a['intEins'] =   (bool) 1;
              
          $a['Ja'] =   (bool) 'Ja';
              
          $a['Nein'] =   (bool) 'Nein';
              
          var_dump($a);
          ?>
          Ergebnis:
          Code:
          array
            'stringNull' => boolean false
            'stringEins' => boolean true
            'intNull' => boolean false
            'intEins' => boolean true
            'Ja' => boolean true
            'Nein' => boolean true
          edit: Sprachargument siehe Trainmasters Post

          Kommentar


          • #6
            Als aller Erstes der Speicherverbrauch: tinyint(1) = 1 Byte vs. varchar(2/4) = 2/4 Bytes. Bei einer entsprechend großen Tabelle macht das einen Unterschied. Zweitens passt zu dem Feld "aktiviert" der boolsche Datentyp sehr gut. Wieso also nicht verwenden? Und nicht zuletzt ist "Ja" und "Nein" sprachabhängig. Ein Programmierer, welcher nicht Deutsch spricht, versteht dies nicht. Hingegen versteht jeder, was mit 1 und 0 bzw. true und false gemeint ist.

            Edit: Einen Tick zu langsam

            Kommentar


            • #7
              Ok, vielen Dank für die Erklärungen.
              Ich werde das dann ändern.

              Kommentar


              • #8
                nunja .. zum Speicherverbrauch - wenn dein Feld wirklich nur ja / nein aufnimmt, dann spielt das auch in der Datenbank keine große Rolle, weil man natürllich ENUM-Typ nimmt.. der speichert einmal, was die Datenwerte bedeuten (also einmal "ja" einmal "nein" ) und arbeitet dann auch nur noch intern mit Binärwerten 0 / 1 -> also maximal ein tinyint bei 2 Werten

                Kommentar

                Lädt...
                X