Ankündigung

Einklappen
Keine Ankündigung bisher.

Datensätze auslesen

Einklappen

Neue Werbung 2019

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

  • Datensätze auslesen

    Hey PHP-Pros!

    Ich habe bei meinem Projekt schon zweimal Daten auslesen müssen aus meiner MySQL Datenbank. Einmal bei der Registrierung, da prüfe ich ob Name und E-Mail schon vergeben sind. Das zweite Mal beim Login, wenn ich den Namen in der Tabelle suche, finde und dann die Passwörter vergleiche. Ich habe mehrere Vorgehensweisen gefunden, eine in einem Buch und eine im Internet. Bei meinem Buch habe ich den Verdacht, dass es nicht so ganz auf dem aktuellen Stand ist, so meine Erfahrung.

    PHP-Code:
    // Datenbankverbindung aufbauen
                    
    include("db.inc.php");

                    
    // Auslesung der registrierten Nutzer in der Datenbank
                    
    $sql "SELECT name, email FROM users";
                    
    $db_erg mysqli_query($db$sql);
                    if ( ! 
    $db_erg )
                    {
                          die(
    'Ungültige Abfrage: ' mysqli_error());
                    }

                    
    $isNameAvail true;
                    
    $isEmailAvail true;
                    
    $name $_POST["name"]; 
                    
    $email $_POST["email"];
                    
    $password $_POST["password"];

                    
    // Jeder Datensatz wird darauf geprüft, ob er den selben NAMEN oder die selbe EMAIL hat, wie der der sich gerade versucht anzumelden
                    
    while ($dsatz mysqli_fetch_array($db_ergMYSQL_ASSOC))
                    {
                        
    // Ist der Name schon vergeben?
                        
    if ($name == $dsatz['name'])
                        {
                            
    $isNameAvail false;
                            echo 
    "<span style=\"color:#FF0000;\"><b>Dieser Name ist bereits vergeben.</b></span><br />";  
                        }

                        
    // Ist die E-Mail Adresse bereits registriert?
                        
    if ($email == $dsatz['email'])
                        {
                            
    $isEmailAvail false;
                            echo 
    "<span style=\"color:#FF0000;\"><b>Diese E-Mail ist bereits registriert.</b></span><br />";  
                        }
                    } 
    PHP-Code:
    // Datenbankverbindung aufbauen
                        
    include("db.inc.php");
                        
    // Name und Passwort des Logins in Variablen speichern
                        
    $name $_POST["name"];
                        
    $pw $_POST["pw"];
                        
    // Suche in der Datenbank nach diesem User
                        
    $sql "SELECT name, password, id FROM users WHERE name LIKE '$name'";
                        
    $db_erg mysqli_query($db$sql);
                        if ( ! 
    $db_erg )
                        {
                            die(
    'Ungültige Abfrage: ' mysqli_error());
                        }
                        
    $row mysqli_fetch_object($db_erg);

                        
    // Wenn der Name in der Datenbank gefunden wurde
                        
    if ($row == true)
                        {
                            
    // Ist das Passwort korrekt?
                            
    if ($row->password == $pw)
                            {
                                
    $id $row->id;
                                
    $_SESSION["id"] = $id;
                                
    header 'Location: game.php' );
                            }
                            else
                            {
                                echo 
    "Passwort falsch.";
                            }
                        }
                        else
                        {
                            
    $name "";
                            echo 
    "Account nicht gefunden.";
                        } 
    Ich bin noch nicht sehr erfahren mit PHP und möchte es deshalb nicht falsch lernen, bzw. gleich den besten Weg lernen um Daten mit Daten aus einer Db Tabelle zu vergleichen, denn ich werde es bei meinem Projekt noch sehr häufig machen müssen.

    Vielen lieben Dank.


  • #2
    Keine der beiden Lösungen ist in der derzeitigen Form wirklich empfehlenswert.

    Zur 1. Die Schleife ist unnötig, deine Datenbank kann den Vergleich performanter ausführen. Wenn deine Datenbank größer wird, kommst du in der jetzigen Form in Teufels Küche. Du iterierst über alle Nutzer in der Datenbank, anstatt nach dem ersten Fund eines gleichen Namens abzubrechen (es kann nur einen geben).

    2. Anfällig für SQL-Injections (Sicherheitsrisiko). Außerdem willst du vermutlich nicht vergleichen, ob ein Name einem anderen ähnlich ist, sondern ob der Name(und genau dieser und nicht einer, der diesem nur ähnlich ist) bereits existiert. ('LIKE' vs '=')


    Du benutzt außerdem in beiden Beispielen $_POST ohne zu überprüfen, ob der entsprechende Schlüssel überhaupt existiert. (siehe isset und !empty):

    http://php-de.github.io/jumpto/form/ (Abschnitt "Vorhergehende Existenz-Prüfung")

    MySQLi unterstützt prepared statements.

    Escape Nutzereingaben, oder besser, verwende Prepared statements, wenn vom Nutzer generierte Daten verwendet werden.

    Bei einer Existenzprüfung reicht i.d.R. ein direkter Vergleich auf die Existenz der Daten inklusive eines Abbruchs nach dem ersten Fund ('LIMIT 1' und keine Schleife im PHP-Code)

    http://php-de.github.io/jumpto/sql-injection/
    http://php.net/manual/de/mysqli.prepare.php
    Zitat von nikosch
    Naja, anscheinend spricht die Steckdose kein HTTP. LOL

    Kommentar


    • #3
      Hallo,

      was die Registrierung angeht würde ich gleich in die SELECT ein WHERE benutzen.

      PHP-Code:
      $sql "SELECT name, email FROM users WHERE name = '$name' OR email = $email";

      if (
      mysql_num_rows($sql)==1)){
       echo 
      "Email oder Name schon vorhanden. Passwort vergessen?";
      }else{
       echo 
      "Alles gut!";

      was ich mich grad frage ist wofür wohl $isNameAvail ist

      und das Login mit LIKE im SELECT paast auch nicht. Das sollte schon Eindeutig sein.

      PHP-Code:
      $sql "SELECT name, password FROM users WHERE name = '$name'"
      PHP-Code:
      $sql "SELECT name, password FROM users WHERE name = '$name' AND password = §password"
      und $_POST oder $_GET immer mit isset prüfen.

      Kommentar


      • #4
        Zitat von sync2014 Beitrag anzeigen
        was ich mich grad frage ist wofür wohl $isNameAvail ist
        if $isNameAvail
        echo "Name vergeben"

        if $isEmailAvail
        echo "E-Mail bereits registriert"

        Kommentar


        • #5
          Das klingt aber unlogisch, dann müssten die eigentlich $isNotNameAvail und $isNotEmailAvail.
          Competence-Center -> Enjoy the Informatrix
          PHProcks!Einsteiger freundliche TutorialsPreComposed Packages

          Kommentar


          • #6
            Zitat von String Beitrag anzeigen
            if $isNameAvail
            echo "Name vergeben"

            if $isEmailAvail
            echo "E-Mail bereits registriert"
            PHP-Code:
            $isNameAvail true
            if (
            $name == $dsatz['name']){ 
                     
            $isNameAvail false
                     echo 
            "<span style=\"color:#FF0000;\"><b>Dieser Name ist bereits vergeben.</b></span><br />";   

            Steht aber nicht da. das steht $isNameAvail ist true und wenn name vorhanden ist $isNameAvail FALSE. Aber ok your script.

            Kommentar


            • #7
              Zitat von sync2014 Beitrag anzeigen
              PHP-Code:
              $isNameAvail true
              if (
              $name == $dsatz['name']){ 
                       
              $isNameAvail false
                       echo 
              "<span style=\"color:#FF0000;\"><b>Dieser Name ist bereits vergeben.</b></span><br />";   

              Steht aber nicht da. das steht $isNameAvail ist true und wenn name vorhanden ist $isNameAvail FALSE. Aber ok your script.
              Das kommt danach. Aber das... war irrelevant für mein Problem. Die passende Fehlermeldung wird später ermittelt anhand von mehrere Faktoren..

              Vielen Dank jedenfalls, ich hab's jetzt verstanden und es ist viel unkomplizierter als ich dachte

              Kommentar

              Lädt...
              X