Dennis Knabe: Problem beim Datenbankconnect

Problem beim Datenbankconnect

<html>
    
    <head>
        <title>Briefmarkensammlungen</title>
    </head>
    <body>
        <form method="post" action="">
            <table border = 3>
                <tr><td colspan = 2 align = center>Anmeldung</td></tr>
                <tr><td>Nachname</td><td><input type="text" name="nachname"></td></tr>
                <tr><td>Vorname</td><td><input type="text" name="vorname"></td></tr>
                <tr><td>Passwort</td><td><input type="passwort" name="passwort"></td></tr>
                <tr><td><input type="submit" name="submit" value="login"></td></tr>
            </table>
        </form>
        <?php
        if(isset($_POST["submit"])){

            $nachname=$_POST['nachname'];
            $vorname=$_POST['vorname'];
            $passwort=$_POST['passwort'];

       $verbindung = mysqli_connect('localhost', 'root', '') or die("Serververbindung fehlgeschlagen");
    
            $db = mysqli_select_db($verbindung,"php_sql");
            
            if($db == TRUE) //Verbindung wird überprüft
            {
                if(!empty($nachname) && !empty($vorname)) 
                {
                                 
                    $sql = "SELECT Vorname, Nachname, Passwort
                            FROM logindaten
                            WHERE Vorname = '$vorname'
                            AND Nachname = '$nachname'
                            AND Passwort = '$passwort';";
                  
                    $abfrage = mysqli_query($verbindung, $sql);
                                                       
                    $daten = mysqli_fetch_array($abfrage);
            
                    if($daten == NULL)
                    {
                        echo "falsche Daten";
                    }
                    
                    else
                    {
                        echo "Weiter";
                    }}}}
             
    ?>    
  1. Hallo

    Problem beim Datenbankconnect

    An welcher Stelle scheitert die Verbindungsaufnahme? Erscheint die Fehlermeldung „Serververbindung fehlgeschlagen“ oder eine andere oder keine Meldung?

           $verbindung = mysqli_connect('localhost', 'root', '') or die("Serververbindung fehlgeschlagen");
        
                $db = mysqli_select_db($verbindung,"php_sql");
    

    Diese beiden Schritte lassen sich in der Funktion mysqli_connect zusammenfassen (siehe prozuderales Beispiel).

                if($db == TRUE) //Verbindung wird überprüft
                {
                    if(!empty($nachname) && !empty($vorname)) 
                    {
                                     
                        $sql = "SELECT Vorname, Nachname, Passwort
                                FROM logindaten
                                WHERE Vorname = '$vorname'
                                AND Nachname = '$nachname'
                                AND Passwort = '$passwort';";
                      
                        $abfrage = mysqli_query($verbindung, $sql);
                                                           
                        $daten = mysqli_fetch_array($abfrage);
                
                        if($daten == NULL)
                        {
                            echo "falsche Daten";
                        }
                        
                        else
                        {
                            echo "Weiter";
                        }}}}
                 
        ?>    
    
    • Warum gibt es – zumindest während der Entwicklung – für if($db == TRUE) keinen else-Zweig mit einer passenden Meldung?
    • Warum wechselst du von der Verbindungskennung in $verbindung zu $db?
    • Die Funktion mysqli_fetch_array existiert nicht.

    Tschö, Auge

    PS: Begrüßungen werden hier gern gesehen.

    --
    Wo wir Mängel selbst aufdecken, kann sich kein Gegner einnisten.
    Wolfgang Schneidewind *prust*
  2. Hallo Dennis,

    versuche doch dein Problem mithilfe von Sessions zu lösen!

    Deklariere dazu zunächst im php Teil deines Scripts die Verwendung von Sessions durch eingabe von: sessions_start();

    Nun solltest du mit $_SESSION['name'] = "wert"; eine Sessionvariable festlegen können (Auf welche dann später zugegriffen werden kann)

    1. Moin,

      versuche doch dein Problem mithilfe von Sessions zu lösen!

      Deklariere dazu zunächst im php Teil deines Scripts die Verwendung von Sessions durch eingabe von: sessions_start();

      Nun solltest du mit $_SESSION['name'] = "wert"; eine Sessionvariable festlegen können (Auf welche dann später zugegriffen werden kann)

      So wie das aussieht wird das ein Login script, dass heißt wahrscheinlich will er dann, wenn Name und Password übereinstimmen die $_SESSION Variable setzen.

      Und die $_SESSION hat ja nichts damit zutun ob eine Verbindung zur DB besteht.

      Gruß Jo

  3. Hallo Dennis Knabe,

    Problem beim Datenbankconnect

    Gibts auch ne Frage dazu?

    Hier ein paar Hinweise, die nichts mit dem Connect zu tun haben:

    <html>
    

    Möglicherweise fehlt der Doctype sowie einige weitere Angaben, siehe HTML-Grundgerüst.

            <form method="post" action="">
    

    Wenn du die Formulardaten an die Seite selbst schicken möchtest, kann das action-Attribut entfallen.

                <table border = 3>
                    <tr><td colspan = 2 align = center>Anmeldung</td></tr>
    

    Tabellenlayout? Ernsthaft? Für die Daten selbst könnte ich mit der Semantik als Tabelle durchaus noch mitgehen, aber die Überschrift und der Absendebutton gehört definitiv nicht in eine Tabelle.

    Es gehört zum guten Stil, Attributwerte in Anführungszeichen zu setzen, auch wenn das nicht notwendig ist. Wenn du dir angewöhnst, immer Anführungszeichen zu verwenden, stolperst du nicht an Stellen, wo sie notwendig werden.

    align ist ein missbilligtes Attribut. Verwende die CSS-Eigenschaft textalign.

                    <tr><td>Nachname</td><td><input type="text" name="nachname"></td></tr>
                    <tr><td>Vorname</td><td><input type="text" name="vorname"></td></tr>
                    <tr><td>Passwort</td><td><input type="passwort" name="passwort"></td></tr>
    

    Das Formular ist für Menschen, die auf assistive Technologien angewiesen sind, nicht benutzbar. Es fehlen label-Elemente.

    type = text ist der Defaultwert, kann also weg.

    <tr><td><label for="nachname">Nachname</label></td><td><input id="nachname" name="nachname"></td></tr>
    
                    <tr><td><input type="submit" name="submit" value="login"></td></tr>
    

    type = submit ist der defaultwert, kann also weg.

    Für konkretere Hilfe siehe das brandneue Tutorial Formulargestaltung in unserem Wiki.

                $nachname=$_POST['nachname'];
                $vorname=$_POST['vorname'];
                $passwort=$_POST['passwort'];
    

    Das Umkopieren ist nicht notwendig.

           or die("Serververbindung fehlgeschlagen");
    

    Wenn dieser Fehler auftritt, kann der Nutzer in aller Regel nichts dafür und auch nichts dagegen tun. Deshalb sollte man ihn mit dieser Information verschonen. Viel wichtiger ist, dass du eine Info bekommst.

                        $sql = "SELECT Vorname, Nachname, Passwort
                                FROM logindaten
                                WHERE Vorname = '$vorname'
                                AND Nachname = '$nachname'
                                AND Passwort = '$passwort';";
    

    Hier werden Eingabedaten ungefiltert an die DB weiter gereicht. Was, wenn ein böswilliger Mensch als Passwort einen SQL-Befehl verwendet, der ihm uneingeschränkten Zugriff erlaubt? Beachte den Kontextwechsel.

    PDO ist ggf. auch der Nutzung von mysqli_ vorzuziehen, aber dazu können andere mehr sagen.

    Bis demnächst
    Matthias

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. Guten Abend,

      Problem beim Datenbankconnect

      Gibts auch ne Frage dazu?

      anscheinend nicht ...

                  <table border = 3>
                      <tr><td colspan = 2 align = center>Anmeldung</td></tr>
      

      Es gehört zum guten Stil, Attributwerte in Anführungszeichen zu setzen, auch wenn das nicht notwendig ist. Wenn du dir angewöhnst, immer Anführungszeichen zu verwenden, stolperst du nicht an Stellen, wo sie notwendig werden.

      Außerdem ist es nicht üblich, Leerzeichen vor und hinter dem '=' zu setzen. Das reißt die Attribut-Wert-Pärchen optisch auseinander.

      align ist ein missbilligtes Attribut. Verwende die CSS-Eigenschaft textalign.

      Aber mit Bindestrich: text-align

                      <tr><td><input type="submit" name="submit" value="login"></td></tr>
      

      type = submit ist der defaultwert, kann also weg.

      Nein, type="text" ist der Defaultwert, hast du ein paar Zeilen weiter oben selbst gesagt. Außer man tauscht das input-Element gegen ein button-Element aus.

                  $nachname=$_POST['nachname'];
                  $vorname=$_POST['vorname'];
                  $passwort=$_POST['passwort'];
      

      Das Umkopieren ist nicht notwendig.

      ACK. Aber sowas von.

      So long,
       Martin

      --
      Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
      - Douglas Adams, The Hitchhiker's Guide To The Galaxy
      1. Hallo Der Martin,

        type = submit ist der defaultwert, kann also weg.

        Nein, type="text" ist der Defaultwert, hast du ein paar Zeilen weiter oben selbst gesagt. Außer man tauscht das input-Element gegen ein button-Element aus.

        Da hab ich doch glatt „button“ gelesen ;-)

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    2. Lieber Matthias,

      ergänzend zu Deinen richtigen Anmerkungen hier noch der Verweis auf das Formular-Tutorial im hiesigen Wiki.

      Liebe Grüße,

      Felix Riesterer.

      1. Hallo Felix Riesterer,

        ergänzend zu Deinen richtigen Anmerkungen hier noch der Verweis auf das Formular-Tutorial im hiesigen Wiki.

        Es war etwas versteckt:

        Für konkretere Hilfe siehe das brandneue Tutorial Formulargestaltungin unserem Wiki.

        Bis demnächst
        Matthias

        --
        Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
        1. Lieber Matthias,

          Es war etwas versteckt:

          my bad. sorry.

          Liebe Grüße,

          Felix Riesterer.

  4. Moin, Zu dem HTML Teil sag ich mal nichts, da hast du von Matthias ja schon gute Tipps bzw Hinweise bekommen.

    Side Info: Hier sieht man dass die Funktion mysqli_connect() gleich mit 4 Parameter umgehen kann. Nämlich den host hier localhost , den usernamen hier root , das passwort für die Datenbank hier keins und die Datenbank hier php_sql. Somit sparst du dir das mysqli_select_db(), außer du möchtest später prüfen ob es die Datenbank gibt und falls nicht, sie neu anlegen willst, aber das wohl erst im späteren lern Verlauf.

                        $daten = mysqli_fetch_array($abfrage);
    

    Wie Matthias schon gesagt hat gibt es diese Funktion in mysqli nicht, aber man kann es sich hier recht einfach machen, da du mit mysqli_connect() ein Object erzeugst auf das du direkt zugreifen kannst. Und zwar mit:

    $abfrage=$db->query("$sql");
    $daten=$abfrage->fetch_assoc();
    

    Gruß Jo

  5. Lieber Dennis,

                $nachname=$_POST['nachname'];
                $vorname=$_POST['vorname'];
                $passwort=$_POST['passwort'];
    [...]
                        $sql = "SELECT Vorname, Nachname, Passwort
                                FROM logindaten
                                WHERE Vorname = '$vorname'
                                AND Nachname = '$nachname'
                                AND Passwort = '$passwort';";
    

    Du machst hier sehr gefährliche Sachen! Das wurde hier an anderer Stelle bereits ausführlich besprochen: /self/2016/may/6/update-einer-chatfunktion/1666704#m1666704

    Liebe Grüße,

    Felix Riesterer.

    1. Moin,

                  $nachname=$_POST['nachname'];
                  $vorname=$_POST['vorname'];
                  $passwort=$_POST['passwort'];
      [...]
                          $sql = "SELECT Vorname, Nachname, Passwort
                                  FROM logindaten
                                  WHERE Vorname = '$vorname'
                                  AND Nachname = '$nachname'
                                  AND Passwort = '$passwort';";
      

      Du machst hier sehr gefährliche Sachen! Das wurde hier an anderer Stelle bereits ausführlich besprochen: /self/2016/may/6/update-einer-chatfunktion/1666704#m1666704

      Das hätte ich wahrscheinlich an späterer stelle auch noch angesprochen. Aber es scheint mir als ob er gerade noch am Anfang ist und ich wollte ihn nicht gleich auf Alles aufmerksam machen. Step-by-step würd ich hier vorschlagen.

      Gruß
      Jo