[PHP]MYSQL Login

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

      [PHP]MYSQL Login

      2.5 von 5 mit 2 Stimmen
      Hi,
      da wir in der Schule zurzeit ein Projekt am laufen haben brauche ich mal eure Hilfe unzwar schreibe ich zurzeit ein Loginscript und würde gerne wissen was man verbessern kann und ob es so überhaupt funktioniert , die andere eigentliche Frage ist dann noch die ich weiß nicht wieso mir das Script keine Meldung gibt wenn der Benutzer garnicht in der Datenbank ist !

      PHP-Quellcode

      1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
      2. "http://www.w3.org/TR/html4/loose.dtd">
      3. <?php
      4. $db = @new mysqli("localhost", "root", "" , "Webshop");
      5. if (mysqli_connect_errno())
      6. {
      7. die('Datenbankfehler: '.mysqli_connect_error());
      8. }
      9. else
      10. {
      11. ?>
      12. Status:<font color="#00FF00">Online</font>
      13. <?php
      14. }
      15. ?>
      16. <html>
      17. <head>
      18. <h1><center><div id="top">Webshop v.1</div></center></h1>
      19. <link rel="stylesheet" type="text/css" href="css/style.css">
      20. </head>
      21. <body>
      22. <form method="POST" action="login.php">
      23. <div id="midun">
      24. Username:
      25. <br>
      26. <input type="text" name="username" value="" size="25">
      27. <br>
      28. </div>
      29. <div id="midpw">
      30. Passwort:
      31. <br>
      32. <input type="text" name="passwort" value="" size="25">
      33. <br>
      34. </div>
      35. <div id="midbt">
      36. <input type="submit" name="submit" value="Submit">
      37. <input type="reset" name="reset" value="Reset">
      38. <br>
      39. <a href="register.php">Registrieren</a>
      40. </div>
      41. <?php
      42. if(isset($_POST['username']) && isset($_POST['passwort']))
      43. {
      44. $username = mysql_real_escape_string($_POST['username']);
      45. $passwort = md5(mysql_real_escape_string($_POST['passwort']));
      46. $query = "SELECT login, passwd FROM kunden WHERE login LIKE '$username' LIMIT 1";
      47. $result = $db->query($query);
      48. if (!$result)
      49. {
      50. die('Datenbankfehler: '.$db->error);
      51. };
      52. while ($row = $result->fetch_assoc())
      53. {
      54. if ($row['passwd'] == $passwort && $row['login'] == $username)
      55. {
      56. ?>
      57. <center>
      58. <?php
      59. echo "Erfolgreich eingeloggt!";
      60. ?>
      61. </center>
      62. <?php
      63. }
      64. else if(empty($row))
      65. {
      66. ?>
      67. <center>
      68. <?php
      69. die('Der Benutzer exestiert nicht');
      70. ?>
      71. </center>
      72. <?php
      73. }
      74. else
      75. {
      76. ?>
      77. <center>
      78. <?php
      79. die('Einloggen Fehlgeschlagen!');
      80. ?>
      81. </center>
      82. <?php
      83. }
      84. }
      85. }
      86. ?>
      87. </form>
      88. </body>
      89. </html>
      Alles anzeigen


      Edit: Sessions habe ich nochnicht drinne kommt aber noch !
      ]
      Kleiner Tip, verwende anstatt der IF-Anweisung or die. Is viel cooler und übersichtlicher. Und wenn du ein echo "<center>"; echo"</center>"; machst, musst du php nicht immer schliessen und aufmachen.





      Robijasi Zenica 88


      Ich leb den Tag und denk seit Jahren über gestern nicht mehr nach.
      Ich zähl mal alles auf, was mir noch so auffällt ...

      - Wenn du vom Passwort eh den MD5-Hash berechnest, brauchst du das nicht durch escape-string quetschen. (Solange du den MD5-Hash per PHP berechnest. Wenn du das per SQL regelst, musst es es escapen).
      - LIKE ist für einen direkten Vergleich ungeeignet. LIKE ist für Suchvorgänge da. Verwende lieber WHERE login = '$username'

      Logischerweise sollte ein Username nur ein einziges mal vorkommen. Das Result des Querys sollte deshalb auch nur eine einzige Zeile sein (oder keine, wenn der Username nicht existiert)
      Daher macht hier eine while-Schleife prinzipell keinen Sinn. Außerdem brauchst du den Usernamen des Results nicht nochmal prüfen (außer du vertraust dem SQL-Server nicht).

      Besser (ungetestet) :

      PHP-Quellcode

      1. $result = $db->query($query);
      2. if(!$result)
      3. {
      4. // Query fehlgeschlagen
      5. }
      6. else
      7. {
      8. $row = $result->fetch_assoc()
      9. if ($row != NULL)
      10. {
      11. if ($row['passwd'] == $passwort)
      12. {
      13. // Login Ok
      14. }
      15. else
      16. {
      17. // Passwort falsch
      18. }
      19. }
      20. else
      21. {
      22. // Username existiert nicht
      23. }
      24. }
      Alles anzeigen


      Gruß
      florian0

      Coban schrieb:

      Kleiner Tip, verwende anstatt der IF-Anweisung or die. Is viel cooler und übersichtlicher.

      Das bitte gleich vergessen, das ist nämlich Schwachsinn. die() und exit() sollte man nur dann benutzen, wenn es irgendwie Sinn ergibt, aber das ist so gut wie nie der Fall und so schon gar nicht. Man bricht damit nämlich die gesamte restliche Verarbeitung des Skriptes ab. Der Output ergibt keinen Sinn, eventuell müssen Ressourcen freigegeben werden, Aufräumarbeiten, etc. Mit solchen blödsinnigen Aktionen hat man dann so tolle Darstellungsprobleme, wie auf vielen Seiten und man sieht sowas auch immer wieder in Tutorials.

      Fehler sollte man abfangen und sauber abarbeiten, Fehlermeldungen generieren und in einen Output-Buffer werfen und erst am Ende alles ausgeben lassen. So hat man eine saubere Homepage, selbst im Fehlerfall, der User ist nicht verwirrt, es sieht professioneller aus und der Code ist vor allem auch viel besser strukturiert als mit diesen sprunghaften Anweisungen.
      Erstmal nen Lob das du an das escapen der Strings mit mysql_real_escape_string gedacht hast ;)

      Dann kann ich nur sagend as ich dir empfehlen kann die PHP logik oben zu machen und unten nur alles auszugeben.
      Sprich DB Connection erstellen, Variablen vorbereiten, Query abfeuern, Validieren und eine user Variable erstellen.
      Im HTML püfste dann den erwarteten Wert und gibst das entsprechende html aus.
      Logik im HTML ist total unsauber und hässlich.

      Zudem benötigst du kein while ($row = $result->fetch_assoc()).
      Da du nur einen User überprüfen willst bzw nur ein User zulässig ist reicht $user = $result->fetch_assoc()

      Wie schon gesagt wurde kannst du das PW matching bei einem einfachen MD5 hash auch in der Query vornehmen.
      SELECT * FROM user WHERE username = $username AND password = MD5($password)

      Die Zeile ist auch überflüssig da du ja ohne ein übereinstimmenden eintrag in der Datenbank eh kein ergebnis zurück bekommst.
      if ($row['passwd'] == $passwort && $row['login'] == $username)


      Ich hoffe das hat geholfen.
      Gruß Sick^

      hangman schrieb:

      Wenn es bei der deutschen Sprache eine Syntax Prüfung gäbe, wären so einige Menschen stumm