1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen

"Zellen" aus Datenbank für LogIn rauslesen //PhP

Dieses Thema im Forum "PHP" wurde erstellt von Thoma, 30. Dezember 2016.

  1. Thoma

    Thoma Mitglied

    Hallo erstmal, ich habe mich gerade eben wegen diesem Thema registriert.
    Und zwar ist meine Frage: Wie kann ich (wie schon oben erwähnt) "Zellen" aus einer MySQL-Datenbank herauslesen, um sie dann mit den Eingaben des Benutzers zu vergleichen?
    Oder gibt es eine andere, viel leichtere Methode?
    Hier mein Script... ich weiß nicht, ob ihr damit viel anfangen könnt...
    Code (PHP):
    1. <?php
    2.  
    3. $nm = mysql_real_escape_string($_GET["name"]);
    4. $pw = mysql_real_escape_string($_GET["pass"]);
    5.  
    6.  
    7. //echo "<b> Benutzereingabe_Name: </b>";
    8. //echo $nm;
    9. //echo "<BR>";
    10. //echo "<b> Benutzereingabe_Passwort: </b>";
    11. //echo $pw;
    12. //echo "<BR>";
    13. //echo "<BR>";
    14.  
    15. $db = mysqli_connect("localhost", "root", "",  "test");
    16.  
    17. if (!$db)
    18.     {
    19.     exit("Verbindungsaufbau fehlgeschlagen: ".mysqli_connect_error());
    20.     }
    21.    
    22. if($db)
    23.     {
    24.         echo "<b>Erfolgreich mit Datenbank verbunden! </b><br />";
    25.         echo "<BR>";
    26.     }
    27.  
    28.  
    29. $SQL =" SELECT benutzername, passwort FROM login WHERE passwort='". $pw ."' AND beutzername='". $nm ."'";
    30.  
    31. $result = mysql_query($SQL);
    32.  
    33.  
    34. //while($row = mysql_fetch_array($result, MYSQL_ASSOC))
    35. //{
    36.     //echo "<b>Benutzername_Datenbank: </b> ";
    37.     //echo $row["benutzername"] . "<br />";
    38.     //echo "<BR>";
    39.     //echo "<b>Passwort_Datenbank: </b>";
    40.     //echo $row["passwort"] . "<br />";
    41.     //echo "<BR>";
    42.        
    43. //}
    44.  
    45. //if ($dbpw == $pw && $dbnm == $nm)
    46. //{
    47.     //echo "Eingabe erfolgreich!";
    48. //}
    49. //else
    50. //{
    51.     //echo "Falsche Eingabe";
    52. //}
    53. //mysql_free_result($result);  
    54.  
    55. //while($row = mysqli_fetch_object($dbn))
    56. //{
    57.   //echo $row->benutzername;
    58. //}
    59. // https://www.administrator.de/frage/php-vergleich-daten-formular-datenbank-schl%C3%A4gt-fehl-221805.html
    60. //    if ($row[1] === $_GET["name"])
    61.     //  {
    62.     //     verbinde mit Auswahl;
    63.     //  }
    64.  
    65.  
    66. //$db_erg = mysqli_query( $db, $SQL );
    67.  
    68. //if (! $db_erg)
    69. //{
    70.     //  die("Ungültige Abfrage: " . mysqli_error());
    71. //}
    72.  
    73.  
    74. ?>
    Das Auskommentierte waren Ideen, welche mir aber auch nicht weiter geholfen haben...
     
  2. Yaslaw

    Yaslaw n/a Moderator

    Zuerst einmal allgemein
    mysql_* ist veraltet. Du solltest mysqli_* verwenden

    Was hat an der Version mit mysql_fetch_array() nicht funktioniert?
     
  3. Thoma

    Thoma Mitglied

    @Yaslaw
    Durch die while-Schleife mit dem array bekomme Ich ja nur die Daten ausgegeben, ich möchte aber den Datenbankinhalt so herausbekommen, dass ich Ihn mit den Eingaben vergleichen kann.

    Hättest du da vielleicht eine Lösung?

    Habe keine Ahnung wie ich weitermachen soll...

    LG Thoma
     
  4. DerKleene1

    DerKleene1 Mitglied

    Eben mal so schnell geschrieben. Nicht genau auf Fehler geachtet, sollte aber klappen.
    Sind abere andere Daten (Datenbank usw) als Du verwendest.
    PHP:
    1.     $db = new mysqli("localhost", "", "", "test");
    2.  
    3.     if (mysqli_connect_errno()) {
    4.         printf("Connect failed: %s\n", mysqli_connect_error());
    5.         exit();
    6.     }
    7.  
    8.     if(isset($_GET['name'])) $nm = $db->real_escape_string($_GET["name"]); else $nm = "";
    9.     if(isset($_GET['pass'])) $pw = $db->real_escape_string($_GET["pass"]); else $pw = "";
    10.  
    11.     $SQL =" SELECT username, password FROM users WHERE password='". $pw ."' AND username='". $nm ."'";
    12.  
    13.     $result = $db->query($SQL);
    14.  
    15.     while($row = mysqli_fetch_array($result)){
    16.         $dbpw = $row["password"];
    17.         $dbnm = $row["username"];
    18.     }
    19.  
    20.     if ($dbpw == $pw && $dbnm == $nm){
    21.         echo "Eingabe erfolgreich!";
    22.     }else{
    23.         echo "Falsche Eingabe";
    24.     }
    25.     mysqli_free_result($result);
     
  5. Thoma

    Thoma Mitglied

    Vielen Dank für deine Antwort @DerKleene1 !
    Nur kommen bei mir noch ein Paar Fehlermeldungen:
    Zum einem:
    mysqli_fetch_array() expects parameter 1 to be mysqli_result, boolean given bei diesem Statement $result = $db->query($SQL);

    Dann noch :
    Undefined variable: dbpw hier if ($dbpw == $pw && $dbnm == $nm){

    Und noch :
    mysqli_free_result() expects parameter 1 to be mysqli_result, boolean given bei dem Statement: mysqli_free_result($result);

    Ich hoffe, du kannst mir helfen...
     
  6. Thoma

    Thoma Mitglied

    Ok, kurzes Update!

    Es kommt nur noch ein Fehler:
    Undefined variable: dbpw hier if ($dbpw == $pw && $dbnm == $nm){
     
  7. Thoma

    Thoma Mitglied

    Diese Fehlermeldung kommt nur, wenn die Eingabe falsch ist.
    Sprich bei dem else
     
  8. DerKleene1

    DerKleene1 Mitglied

    Gerade wenig Zeit, aber hier mal eine überarbeitete Version:
    PHP:
    1.     if(isset($_GET['name']) && isset($_GET['pass'])){
    2.       $nm = $db->real_escape_string($_GET["name"]);
    3.       $pw = $db->real_escape_string($_GET["pass"]);
    4.  
    5.       $SQL =" SELECT username, password FROM users WHERE password='". $pw ."' AND username='". $nm ."'";
    6.  
    7.       if($result = $db->query($SQL)){
    8.         $rowcount=mysqli_num_rows($result);
    9.         if($rowcount == 1){
    10.           while($row = mysqli_fetch_array($result)){
    11.               $dbpw = $row["password"];
    12.               $dbnm = $row["username"];
    13.           }
    14.           if ($dbpw == $pw && $dbnm == $nm){
    15.               echo "Eingabe erfolgreich!";
    16.           }
    17.         }else{
    18.             echo "Falsche Eingabe";
    19.         }
    20.       }
    21.       mysqli_free_result($result);
    22.     }else{
    23.       echo "Bitte Name und Passwort eingeben!";
    24.     }
     
  9. Thoma

    Thoma Mitglied

    Vielen Dank!! Es funktioniert!
    2 Fragen hätte ich dennoch:
    1. Für was steht dieses Statement
    1. else{
    2. echo "Bitte Name und Passwort eingeben!";
    3. }
    2. Wie würde ich das Ganze jetzt verschlüsseln? (Mit md5 am besten)
     
  10. sheel

    sheel I love Asm Administrator

    Hi

    falls du gerade irgendein PHP-Buch/Tutorial/sonstwas liest, das dir die Sachen so erklärt, bitte gleich entsorgen. (Es gibt leider sehr viele schlechte und/oder veraltete Anleitungen zu PHP).

    Dass es die mysql_ - Funktionen, die du vorher verwendet hast, gar nicht mehr gibt, hat dir ja schon jemand gesagt. Sie wurden entfernt, nachdem man mehrere Jahre schon gewusst hat, dass sie am Ende sind. Mit anderen Worten, Code damit funktioniert einfach nicht mehr. Die letzte PHP-Version, die sie noch hatte, ist auch nicht mehr supported.

    Der nächste Problempunkt ist, dass MD5 seit 20 Jahren (!) nicht mehr so sicher ist, wie es ein sollte. Nimm bcrypt (http://php.net/manual/de/function.password-hash.php) (Außerdem ist MD5 keine Verschlüsselung, war es auch nie).
     
    Zuletzt bearbeitet: 31. Dezember 2016
  11. DerKleene1

    DerKleene1 Mitglied

    Habe das ganze auch mal als PDO gemacht.
    Stehen auch Kommentare drin.
    Und danke @sheel Du hast vollkommen recht. Ich würde dies auch ganz anders aufbauen, aber wenn er erst mal so lernen kann, sollte dies ausreichen. Man weiß ja auch nicht wie das ganze drumherum aussieht. Aber ich denke er sollte nun genug Vorschläge haben.
    PHP:
    1.     $dsn = "mysql:host=localhost;dbname=test;charset=utf8";
    2.     $opt = array(
    3.         PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    4.         PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    5.     );
    6.     $db = new PDO($dsn,'root','root', $opt);
    7.  
    8.  
    9.     if(isset($_GET['name']) && isset($_GET['pass'])){
    10.       $nm = $_GET["name"];
    11.       $pw = $_GET["pass"];
    12.       $pw = password_hash($pw, PASSWORD_DEFAULT); //Das eingegebene Passwort wird verschlüßelt. Da dies auch verschlüßelt in der DB liegen sollte. Würde dies aber eher per $_POST machen.
    13.  
    14.       $pdo ="SELECT username, password FROM users WHERE password = :passwort AND username = :username";
    15.       $statement = $db->prepare($pdo);
    16.       $statement->execute(array(':passwort' => $pw, ':username' => $nm));
    17.  
    18.       $anzahl_user = $statement->rowCount();
    19.  
    20.       if($anzahl_user == 1){
    21.         while($row = $statement->fetch()) {
    22.            $dbpw = $row["password"];
    23.            $dbnm = $row["username"];
    24.         }
    25.         if ($dbpw == $pw && $dbnm == $nm){
    26.             echo "Username und Passwort stimmen überein!"; //Name und PW stimmen überein.
    27.         }
    28.       }else{
    29.         echo "Username oder Passwort nicht vorhanden oder Falsch."; //Name oder PW nicht gefunden.
    30.       }
    31.     }else{
    32.       echo "Bitte Name und Passwort eingeben!"; //Wenn kein GET vorhanden ist.
    33.     }
     
  12. Thoma

    Thoma Mitglied

    Ok, vielen Dank für eure Antworten!
    Aber.. Was ist eine PDO ? (Es ist wahrscheinlich offensichtlich, nur kenne ich nicht diesen Begriff)
    Wegen dem Mysql und md5.. Ich musste mich in das Thema ganz neu hineinarbeiten.
     
  13. Thoma

    Thoma Mitglied

    Code (PHP):
    1. <!doctype html>
    2.  
    3. <html lang="de">
    4.  
    5.  
    6.  
    7.   <head>
    8.  
    9.     <link href="designlogin.css" rel="stylesheet">
    10.     <meta charset="utf-8">
    11.     <meta name="viewport" content="width=device-width, initial-scale=1.0">
    12.     <title>Zentrale Terminvergabe und Telefonzentrale</title>
    13.   </head>
    14.   <body>
    15.  
    16.   <div id="starth1">
    17.   <img id="startimg" width="5%" height="5%" align="right" src="bmw-logo1.png" alt="bmwlogo">
    18.     <h1>Zentrale Terminvergabe und Telefonzentrale</h1>  
    19.    
    20.     </div>
    21.     <center id="login">
    22.     <h2> LogIn </h2>
    23.     <form id="formular" action="loginpdo.php" method=get">
    24.        <table>
    25.            <tr>
    26.                <td>Name:</td>
    27.                <td><input type="text" name="name" /></td>
    28.            </tr>
    29.            <tr>
    30.                <td>Passwort: </td>
    31.                <td><input type="password"  name="pass" /></td>
    32.            </tr>          
    33.            <tr>
    34.                <td></td>              
    35.                <td>
    36.                <input type="submit" value="anmelden" />
    37.                </td>
    38.            </tr>          
    39.        </table>
    40.    </form>
    41.  
    42.    </center>
    43.  
    44.  </body>
    45.  
    46. </html>
    So würde btw mein HTML script aussehen..
     
  14. sheel

    sheel I love Asm Administrator

    @derkleene Dein Code ist doch in Ordnung...? Was nicht mehr verwendet werden sollte usw. war eher an Thoma gerichtet, alle anderen hier wissen es ja offensichtlich schon.

    @Thoma
    Ich weiß, etwas umsonst gelernt zu haben ist sehr ärgerlich. Aber in dem Fall ist es das eben. Funktionen zu verwenden, die es nicht mehr gibt, hilft niemandem.

    PDO und Mysqli sind einfach gesagt zwei Funktionensammlungen, die beide die alten Mysql-Funktionen ersetzen. Man braucht nur eine davon.
     
  15. Thoma

    Thoma Mitglied

    Ok... Und kann ich dein Quelltext, welcher mir @DerKleene1 geschickt hat einfach übernehmen? @sheel
     
  16. EuroCent

    EuroCent KlappStuhl 2.0

    @Thoma
    Wenn du dich nicht in PDO einarbeiten möchtest, dann empfehle Ich dir MySQLi :)

    Ansonsten gibt es sicherlich genug Tutorials bei YT, die Ich dir empfehlen kann :)
    Bei mysqli sind manche Parameter vertauscht, beispielsweise beim mysqli_query(parameter, sql-state) da muss er st der RessourceID und erst dann kommt der Statement. :)
     
  17. Thoma

    Thoma Mitglied

    Hallo ich bins nochmal!
    Ich habe mich jetzt ein wenig erkundigt und habe den Quelltext von @DerKleene1 übernommen!(Danke nochmal dafür).
    Nur wird bei mir in allen Fällen Username oder Passwort nicht vorhanden oder Falsch. ausgegeben!
    Könnt ihr mir dabei helfen?
    Und heißt das, dass ich in der Datenbank das Passwort schon verschlüsselt eingeben muss?

    MfG Thoma
     
  18. DerKleene1

    DerKleene1 Mitglied

    Hallo @Thoma,

    ich Zitiere mal aus meinen Post:
    Ein Passwort sollte niemals unverschlüsselt in einer DB gespeichert werden.
    Informationen zum password_hash findest Du hier: http://php.net/manual/de/function.password-hash.php

    Zum testen ob das Script ohne Verschlüsselung funktioniert, kannst Du diese Zeile ja mal auskommentieren,
    dann sollte es mit Klartext Passwort gehen.

    Und wie gesagt überlege Dir ob du das FORM nicht lieber mit der Methode POST anstatt GET machen willst, damit keiner den Username und Passwort in der Adresszeile mitlesen kann.
    Infos dazu findet man genug bei Google, hier mal ein Beispiel:
    http://foobarblog.net/blog/get-und-post-unterschiede-und-anwendungen-11/
     
  19. DerKleene1

    DerKleene1 Mitglied

    Mit Post wäre es folgendes:
    HTML:
    1. <form id="formular" action="loginpdo.php" method="POST">
    und:
    PHP:
    1. $dsn = "mysql:host=localhost;dbname=test;charset=utf8";
    2. $opt = array(
    3.     PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    4.     PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    5. );
    6. $db = new PDO($dsn,'root','root', $opt);
    7.  
    8.  
    9. if(isset($_POST['name']) && isset($_POST['pass'])){
    10.   $nm = $_POST["name"];
    11.   $pw = $_POST["pass"];
    12.   $pw = password_hash($pw, PASSWORD_DEFAULT); //Das eingegebene Passwort wird verschlüßelt. Da dies auch verschlüßelt in der DB liegen sollte.
    13.  
    14.   $pdo ="SELECT username, password FROM users WHERE password = :passwort AND username = :username";
    15.   $statement = $db->prepare($pdo);
    16.   $statement->execute(array(':passwort' => $pw, ':username' => $nm));
    17.  
    18.   $anzahl_user = $statement->rowCount();
    19.  
    20.   if($anzahl_user == 1){
    21.     while($row = $statement->fetch()) {
    22.        $dbpw = $row["password"];
    23.        $dbnm = $row["username"];
    24.     }
    25.     if ($dbpw == $pw && $dbnm == $nm){
    26.         echo "Username und Passwort stimmen überein!"; //Name und PW stimmen überein.
    27.     }
    28.   }else{
    29.     echo "Username oder Passwort nicht vorhanden oder Falsch."; //Name oder PW nicht gefunden.
    30.   }
    31. }else{
    32.   echo "Bitte Name und Passwort eingeben!"; //Wenn kein POST vorhanden ist.
    33. }
    Sollte nichts vergessen haben
     
  20. Thoma

    Thoma Mitglied

    Dankeschön!
    Ich habe das Ganze jetzt mit POST versucht und auch die Zeile auskommentiert, nur kommt immer noch das Gleiche...

    Ich habe auch seit neuestem das Problem, dass mein LogIn Formular schon ausgefüllt ist (gelblicher Hintergrund).

    Könnte das das Problem sein?
     
Die Seite wird geladen...