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

#1
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...
PHP:
<?php

$nm = mysql_real_escape_string($_GET["name"]);
$pw = mysql_real_escape_string($_GET["pass"]);


//echo "<b> Benutzereingabe_Name: </b>";
//echo $nm;
//echo "<BR>";
//echo "<b> Benutzereingabe_Passwort: </b>";
//echo $pw;
//echo "<BR>";
//echo "<BR>";

$db = mysqli_connect("localhost", "root", "",  "test");

if (!$db)
    {
    exit("Verbindungsaufbau fehlgeschlagen: ".mysqli_connect_error());
    }
   
if($db)
    {
        echo "<b>Erfolgreich mit Datenbank verbunden! </b><br />";
        echo "<BR>";
    }

mysql_select_db("test") or die(mysql_error());

$SQL =" SELECT benutzername, passwort FROM login WHERE passwort='". $pw ."' AND beutzername='". $nm ."'";

$result = mysql_query($SQL);


//while($row = mysql_fetch_array($result, MYSQL_ASSOC)) 
//{
    //echo "<b>Benutzername_Datenbank: </b> ";
    //echo $row["benutzername"] . "<br />";
    //echo "<BR>";
    //echo "<b>Passwort_Datenbank: </b>";
    //echo $row["passwort"] . "<br />";
    //echo "<BR>";
       
//}

//if ($dbpw == $pw && $dbnm == $nm)
//{ 
    //echo "Eingabe erfolgreich!";
//}
//else
//{
    //echo "Falsche Eingabe";
//}
//mysql_free_result($result);   

//while($row = mysqli_fetch_object($dbn))
//{
  //echo $row->benutzername;
//}
// https://www.administrator.de/frage/php-vergleich-daten-formular-datenbank-schl%C3%A4gt-fehl-221805.html
//    if ($row[1] === $_GET["name"])
    //  {
    //     verbinde mit Auswahl;
    //  }


//$db_erg = mysqli_query( $db, $SQL );

//if (! $db_erg)
//{
    //  die("Ungültige Abfrage: " . mysqli_error());
//}


?>
Das Auskommentierte waren Ideen, welche mir aber auch nicht weiter geholfen haben...
 
#2
Zuerst einmal allgemein
mysql_* ist veraltet. Du solltest mysqli_* verwenden

Was hat an der Version mit mysql_fetch_array() nicht funktioniert?
 
#3
@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
Eben mal so schnell geschrieben. Nicht genau auf Fehler geachtet, sollte aber klappen.
Sind abere andere Daten (Datenbank usw) als Du verwendest.
PHP:
    $db = new mysqli("localhost", "", "", "test");

    if (mysqli_connect_errno()) {
        printf("Connect failed: %s\n", mysqli_connect_error());
        exit();
    }

    if(isset($_GET['name'])) $nm = $db->real_escape_string($_GET["name"]); else $nm = "";
    if(isset($_GET['pass'])) $pw = $db->real_escape_string($_GET["pass"]); else $pw = "";

    $SQL =" SELECT username, password FROM users WHERE password='". $pw ."' AND username='". $nm ."'";

    $result = $db->query($SQL);

    while($row = mysqli_fetch_array($result)){
        $dbpw = $row["password"];
        $dbnm = $row["username"];
    }

    if ($dbpw == $pw && $dbnm == $nm){
        echo "Eingabe erfolgreich!";
    }else{
        echo "Falsche Eingabe";
    }
    mysqli_free_result($result);
 
#5
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...
 
#8
Gerade wenig Zeit, aber hier mal eine überarbeitete Version:
PHP:
    if(isset($_GET['name']) && isset($_GET['pass'])){
      $nm = $db->real_escape_string($_GET["name"]);
      $pw = $db->real_escape_string($_GET["pass"]);

      $SQL =" SELECT username, password FROM users WHERE password='". $pw ."' AND username='". $nm ."'";

      if($result = $db->query($SQL)){
        $rowcount=mysqli_num_rows($result);
        if($rowcount == 1){
          while($row = mysqli_fetch_array($result)){
              $dbpw = $row["password"];
              $dbnm = $row["username"];
          }
          if ($dbpw == $pw && $dbnm == $nm){
              echo "Eingabe erfolgreich!";
          }
        }else{
            echo "Falsche Eingabe";
        }
      }
      mysqli_free_result($result);
    }else{
      echo "Bitte Name und Passwort eingeben!";
    }
 
#9
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
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:
#11
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:
    $dsn = "mysql:host=localhost;dbname=test;charset=utf8";
    $opt = array(
        PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
    );
    $db = new PDO($dsn,'root','root', $opt);


    if(isset($_GET['name']) && isset($_GET['pass'])){
      $nm = $_GET["name"];
      $pw = $_GET["pass"];
      $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.

      $pdo ="SELECT username, password FROM users WHERE password = :passwort AND username = :username";
      $statement = $db->prepare($pdo);
      $statement->execute(array(':passwort' => $pw, ':username' => $nm));

      $anzahl_user = $statement->rowCount();

      if($anzahl_user == 1){
        while($row = $statement->fetch()) {
           $dbpw = $row["password"];
           $dbnm = $row["username"];
        }
        if ($dbpw == $pw && $dbnm == $nm){
            echo "Username und Passwort stimmen überein!"; //Name und PW stimmen überein.
        }
      }else{
        echo "Username oder Passwort nicht vorhanden oder Falsch."; //Name oder PW nicht gefunden.
      }
    }else{
      echo "Bitte Name und Passwort eingeben!"; //Wenn kein GET vorhanden ist.
    }
 
#12
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
PHP:
<!doctype html>

<html lang="de">



  <head>
 
    <link href="designlogin.css" rel="stylesheet">
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Zentrale Terminvergabe und Telefonzentrale</title>
  </head>
  <body>

  <div id="starth1">
  <img id="startimg" width="5%" height="5%" align="right" src="bmw-logo1.png" alt="bmwlogo">
    <h1>Zentrale Terminvergabe und Telefonzentrale</h1>   
   
    </div>
    <center id="login">
    <h2> LogIn </h2>
    <form id="formular" action="loginpdo.php" method=get">
        <table>
            <tr>
                <td>Name:</td>
                <td><input type="text" name="name" /></td>
            </tr>
            <tr>
                <td>Passwort: </td>
                <td><input type="password"  name="pass" /></td>
            </tr>           
            <tr>
                <td></td>               
                <td>
                <input type="submit" value="anmelden" />
                </td>
            </tr>           
        </table>
    </form>
   
    </center>

  </body>

</html>
So würde btw mein HTML script aussehen..
 
#14
@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.
 
#16
@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
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
Hallo @Thoma,

ich Zitiere mal aus meinen Post:
PHP:
  $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.
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
Mit Post wäre es folgendes:
HTML:
<form id="formular" action="loginpdo.php" method="POST">
und:
PHP:
$dsn = "mysql:host=localhost;dbname=test;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$db = new PDO($dsn,'root','root', $opt);


if(isset($_POST['name']) && isset($_POST['pass'])){
  $nm = $_POST["name"];
  $pw = $_POST["pass"];
  $pw = password_hash($pw, PASSWORD_DEFAULT); //Das eingegebene Passwort wird verschlüßelt. Da dies auch verschlüßelt in der DB liegen sollte.

  $pdo ="SELECT username, password FROM users WHERE password = :passwort AND username = :username";
  $statement = $db->prepare($pdo);
  $statement->execute(array(':passwort' => $pw, ':username' => $nm));

  $anzahl_user = $statement->rowCount();

  if($anzahl_user == 1){
    while($row = $statement->fetch()) {
       $dbpw = $row["password"];
       $dbnm = $row["username"];
    }
    if ($dbpw == $pw && $dbnm == $nm){
        echo "Username und Passwort stimmen überein!"; //Name und PW stimmen überein.
    }
  }else{
    echo "Username oder Passwort nicht vorhanden oder Falsch."; //Name oder PW nicht gefunden.
  }
}else{
  echo "Bitte Name und Passwort eingeben!"; //Wenn kein POST vorhanden ist.
}
Sollte nichts vergessen haben
 
#20
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?