Ankündigung

Einklappen
Keine Ankündigung bisher.

SQL-Transaktionen...?

Einklappen

Neue Werbung 2019

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

  • SQL-Transaktionen...?

    Hallo ihr Lieben.

    Ich bin leider ein totaler PHP/mySQL-Anfänger und komme nun einfach nicht weiter...
    Ich soll für eine Prüfung ein Ernährungstagebuch programmieren. Davor würde ich gerne einen Login schalten, damit jeder Benutzer sein eigenes Tagebuch anlegen kann. Dafür hätte ich gern, dass beim Registrieren sich automatisch eine neue Tabelle in der DB anlegt, die so heißt wie der Benutzer und die das jeweilige Tagebuch dann enthält. Gleichzeitig brauche ich eine Tabelle in der DB mit den Nutzernamen und Kennwörtern. Dafür muss ich dann aber zwei SQL-Abfragen hintereinander schalten (create table $mUsername und insert into login($mUsername, $mPasswort)). Dafür hab ich nun versucht, mich in Transaktionen einzulesen. Das funktioniert soweit auch eigentlich einwandfrei, die Daten werden in die login-Tabelle geschrieben. ABER: Es wird keine neue Tabelle für den Benutzer erstellt. Ich weiß leider nicht mehr, was ich noch versuchen soll oder wo da der Fehler liegt. Ich hoffe, ihr könnt mir helfen.

    Hier der Code:
    PHP-Code:
    <?php

            
    // Datenbankverbindung herstellen
                
    $mServer="localhost";
                
    $mBenutzer "root";
                
    $mKennwort "x";
                
    $mDatenbank "Tagebuch";

                
    // $dbVerbindung ist ein Datenbankverbindungsobjekt der Klasse mysqli,
                // das auf die Datenbank zeigt
                
    $dbVerbindung = new mysqli($mServer$mBenutzer$mKennwort$mDatenbank);

                
    // Datenbankverbindung testen
                
    if(mysqli_connect_errno() == 0)
                    { 
    // Datenübernahme aus der Form
                        
    $mUsername $_POST['txtUsername'];
                        
    $mPasswort $_POST['txtPasswort'];



                        
    //SQL-Befehl erstellen
                        
    $mSQL "SELECT * FROM login
                        WHERE Username='
    $mUsername';";

                        
    // $abfrageErgebnis ist ein Ergebnistabellenobjket,
                        // das die ausgewaehlten Datensaetze aus der Datenbank enthaelt
                        
    $abfrageErgebnis $dbVerbindung->query($mSQL);
                        
    // ist abfrageErgebnis leer ?
                        
    if ($abfrageErgebnis->num_rows == 0)
                            {  
    // neuen Eintrag machen                        
                            
    $addtable     $dbVerbindung -> query("CREATE TABLE $mUsername(Datum date, Kohlenhydrate int, Eiweiß int, Fett int, Kalorien int"); //'hinmachen oder weglassen?
                            
    $addrow      $dbVerbindung -> query("INSERT INTO login (Username, Passwort) VALUES('$mUsername','$mPasswort');");
                            if (
    $addrow && $addtable)
                                {
    $dbVerbindung -> commit();
                                }
                            else
                                {
    $dbVerbindung -> rollback();
                                }


                            
    $mOK $dbVerbindung->query($mSQL);
                            if (
    $mOK)
                                {echo 
    "<h3>Sie haben sich erfolgreich registriert.</h3>";
                                echo 
    "<h3>Ihr Nutzername lautet: $mUsername</h3>";
                                }
                            else
                                {   echo 
    "<h3>Ihre Daten konnten nicht gespeichert werden.</h3>.";
                                }
                            }

                        else
                            {
    $aktuellerKunde $abfrageErgebnis->fetch_object();
                            echo 
    "<h3>Der Nutzername ist bereits vergeben.</h3>";
                            echo 
    '<h3>Hier geht es <a href="register.html" class=dark>zurück...</a></h3>';
                            }

                        
    // Datenbankobjekt schliessen
                        
    $dbVerbindung->close();
                        }

                    else
                    {  echo 
    "<h2>Keine Datenbankverbindung</h2>";
                        echo 
    "<p>Fehler: "mysqli_connect_error(), "</p>";
                    }

            
    ?>
    Danke schon Mal im Voraus!
    LG Flower

  • #2
    Leider hast du Datenbanken noch nicht durchdrungen, mein Tipp ließ dir das Skript an den entsprechenden Stellen dazu nochmal durch.

    Du legst NICHT für jeden Nutzer eine eigene Tabelle an, sondern es gibt eine Tabbelle "tagebuch" und dort referenzierst du mit einem Fremdschlüssel die Tabelle "nutzer".

    Kommentar


    • #3
      Hm. Ich versuche das zu verstehen. Meinst du, dass ich eine Tabelle Tagebuch anlegen soll und dort alles reinspeichern soll, was in die Tagebücher eingetragen wird von den Nutzern mit einer Spalte mit dem Nutzernamen? Sodass diese Spalte dann als Fremdschlüsel zu der Login-Tabelle führt? Die Idee ist mir ehrlich gesagt gar nicht gekommen. Dh auf der Seite bräuchte ich dann gar keine zwei Querys kann das sein? Erst bei der Abfrage des Tagebuchs eines Nutzers muss ich dann noch ein "where Username=$mNutzername" hinzufügen, oder? Oder versteh ich da was falsch?

      Kommentar


      • #4
        Ja. Mit kurzen Bemerkungen:
        [...]mit einer Spalte mit dem Nutzernamen
        Üblicherweise gibt man jeder Tabelle einen künstlichen Primärschlüssel "id" der integer ist und von der Datenbank automatisch hochgezählt wird (auto increment).
        Refrenzen baut man dann über die künstlichen Primärschlüssel auf, und nicht über Namen.
        Login-Tabelle
        Es it keine "Login-Tabelle" sondern eben eine Nutzer-Tabelle
        Erst bei der Abfrage des Tagebuchs eines Nutzers muss ich dann noch ein "where Username=$mNutzername" hinzufügen, oder?
        Ja, wobei du jeden Datensatz nicht als Tagebuch verstehen solltest, sondern als 1 Eintrag in das Tagebuch, d.h. bei der Abfrage erhälst du dann meistens mehr als ein Ergebnis und aus den Einträgen baust du dein Tagebuch zusammen.

        Kommentar


        • #5
          Okay klasse, vielen Dank!! Auf die Idee bin ich tatsächlich einfach nicht gekommen, das ist wahrscheinlich wesentlich einfacher so...und dann wird die DB auch nicht so riesig von den Tabellen her.
          Nur eine Frage hab ich dann noch...um den Nutzernamen in die Query einzubinden, brauch ich die Nutzername-Variable aus einer anderen Datei...kann ich die irgendwie übergeben?
          Ich hab grade schon gegooglet, und hab was mit include gefunden, aber damit bindet sich die komplette andere Datei ein. Und get scheint dafür nicht geeignet(?).

          Die Datei in der die Variable drin ist, ist eine html...und von php kann ich durch form action=xx method=post ja zugreifen. Bzw. wird ja in der html die Verbindung zur php hergestellt...aber ich kann ja nicht auf zwei php-Seiten verweisen...

          Oh man, ich bekomm langsam einen Knoten im Hirn. Weißt du vielleicht, wie ich diese eine Variable übergeben kann? Mir raucht der Kopf.

          Aber vielen Dank für die Hilfe!!

          Kommentar


          • #6
            Was ist das für eine Prüfung bzw. was lernst du?

            Die Information welcher Nutzer angemeldet ist, schleift du am einfachsten in einer Session mit. (https://www.php-einfach.de/php-tutorial/php-sessions/) Wenn sich der Benutzer erfolgreich anmeldet, speicherst du seinen Name in der Session und kannst dann auf allen anderen Seiten prüfen, ob der Benutzer angemeldet ist und hast auch die benötigeten Informationen für die Queries.

            PS: In der Regel arbeitet man nicht mit Benutzernamen sondern vergibt jeden Benutzer eine ID.

            Kommentar


            • #7
              Okay klasse, das Problem hab ich gelöst! Ich bin jetzt fast fertig, nur eine Sache funktioniert noch nicht so richtig...ich traue mich kaum zu fragen, weil die Lösung wahrscheinlich total einfach ist und ich einfach den Wald vor lauter Bäumen nicht mehr sehe. Ich bekomme auf einer php nun bei einigen Zeilen die Notice "trying to get property of non-object..." Wie fixe ich das? Hier der Code:
              PHP-Code:
              <?php
                          session_start
              ();

                      
              // Datenbankverbindung herstellen
                          
              $mServer="localhost";
                          
              $mBenutzer "root";
                          
              $mKennwort "x";
                          
              $mDatenbank "Tagebuch";

                          
              // $dbVerbindung ist ein Datenbankverbindungsobjekt der Klasse mysqli,
                          // das auf die Datenbank zeigt
                          
              $dbVerbindung = new mysqli($mServer$mBenutzer$mKennwort$mDatenbank);

                          
              // Datenbankverbindung testen
                          
              if(mysqli_connect_errno() == 0)
                              { 
              // Datenübernahme aus der Form
                                  
              $mDate $_POST['clDate'];
                                  
              $mUsername=$_SESSION['Username'];

                                  
              //SQL-Befehl für Kohlenhydrate
                                  
              $mSQL "SELECT SUM(Kohlenhydrate) AS GHydrate FROM admin
                                  WHERE Username='
              $mUsername'
                                  AND Datum='
              $mDate'
                                  GROUP BY Datum;"
              ;

                                  
              $abfrageErgebnis $dbVerbindung->query($mSQL);
                                  
              $mKohlenhydrate $abfrageErgebnis->fetch_object();
                                  
              $mKohlenhydrate $mKohlenhydrate->GHydrate;

                                  
              //SQL-Befehl für Eiweiß
                                  
              $mSQL "SELECT SUM(Eiweiß) AS GEiweiß FROM admin
                                  WHERE Username='
              $mUsername'
                                  AND Datum='
              $mDate'
                                  GROUP BY Datum;"
              ;

                                  
              $abfrageErgebnis $dbVerbindung->query($mSQL);
                                  
              $mEiweiß $abfrageErgebnis->fetch_object();
                                  
              $mEiweiß $mEiweiß->GEiweiß;

                                  
              //SQL-Befehl für Fett
                                  
              $mSQL "SELECT SUM(Fett) AS GFett FROM admin
                                  WHERE Username='
              $mUsername'
                                  AND Datum='
              $mDate'
                                  GROUP BY Datum;"
              ;

                                  
              $abfrageErgebnis $dbVerbindung->query($mSQL);
                                  
              $mFett $abfrageErgebnis->fetch_object();
                                  
              $mFett $mFett->GFett;

                                  
              //SQL-Befehl für Kalorien
                                  
              $mSQL "SELECT SUM(Kalorien) AS GKalorien FROM admin
                                  WHERE Username='
              $mUsername'
                                  AND Datum='
              $mDate'
                                  GROUP BY Datum;"
              ;

                                  
              $abfrageErgebnis $dbVerbindung->query($mSQL);
                                  
              $mKalorien $abfrageErgebnis->fetch_object();
                                  
              $mKalorien $mKalorien->GKalorien;

                                  echo 
              "<table> <tr> <td> Kohlenhydrate: </td>";
                                  echo 
              "<td> Eiweiß </td>";
                                  echo 
              "<td> Fett </td>";
                                  echo 
              "<td> Kalorien </td> </tr>";
                                  echo 
              "<tr> <td> $mKohlenhydrate </td>";
                                  echo 
              "<td> $mEiweiß </td>";
                                  echo 
              "<td> $mFett </td>";
                                  echo 
              "<td> $mKalorien </td> </tr> </table>";

                                  
              // Datenbankobjekt schliessen
                                  
              $dbVerbindung->close();
                                  }

                              else
                              {  echo 
              "<h2>Keine Datenbankverbindung</h2>";
                                  echo 
              "<p>Fehler: "mysqli_connect_error(), "</p>";
                              }

                      
              ?>
              Die Zeilen um die es sich handelt sind die $mKohlenhydrate = $mKohlenhydrate->GHydrate; etc., eben mit anderen Variablennamen, aber eben diese vier Zeilen. Gestern hatte ich schon das Problem in einer anderen Date, dass er die $mKohlenhydrate etc. nicht in int umwandeln konnte, weil es Objekte waren. Daher hab ich auch diese Zeilen, da waren sie die Lösung meines Problems. Ich bekomm die Fehlermeldung auch nicht mehr, wenn ich die Zeilen weg mache, aber die jeweilige Variable bleibt trotzdem leer und zeigt bei echo nichts an. Kann mir da vielleicht nochmal jemand helfen? Danke schonmal im Voraus!!

              LG Flower

              EDIT: Das ist mein mündliches Abitur...und das Thema geht ziemlich weit über den Lehrplan hinaus, deshalb stell ich mich wahrscheinlich so dämlich an. Tut mir leid!

              Kommentar


              • #8
                Die Ursache für die Meldung ist, dass deine Abfragen kein Ergebnis liefern. Die Methode fetch_object() holt den nächsten Datensatz, gibt es kein nächsten Datensatz, wird false zurückgegeben. False ist weder ein Objekt und noch hat es die Eigenschaft GKalorien und co.
                Lass dir den Query $mSQL ausgeben (var_dump($mSQL)) und schau ob der Query überhaupt so aussieht, wie du dir das vorstellst. Wenn das hinhaut, vergleich den Query mit den Daten in deiner Datenbank.

                PS: wenn du Zeichenketten in einen Query übernimmst, müssen diese escapt werden! $dbVerbindung->real_escape_string($eingabe)

                PS: Du kannst die Queries zusammenfassen:

                PHP-Code:
                 $mSQL "SELECT
                          SUM(Eiweiß) AS GEiweiß,
                          SUM(Fett) AS GFett,
                          SUM(Kalorien) AS GKalorien
                     FROM
                         admin
                        WHERE
                            Username='"
                .$dbVerbindung->real_escape_string($mUsername)."' AND
                            Datum='"
                .$dbVerbindung->real_escape_string($mDate)."'
                        GROUP BY Datum;"
                ;


                $abfrageErgebnis $dbVerbindung->query($mSQL);
                $row $abfrageErgebnis->fetch_object();


                echo 
                $row->GEiweiß;
                echo 
                $row->GFett;
                echo 
                $row->GKalorien

                Kommentar


                • #9
                  Ich hab den Fehler grade gefunden...der war einfach eine totale Dummheit von mir. Ich hab nachträglich der Datenbank noch eine Spalte mit dem Nutzernamen angelegt, so, wie ChromOxid mir das empfohlen hatte. Dementsprechend gab es noch keinen Datensatz, bei dem der Username eingetragen war, das war ja alles Null. Also - neuen Datesatz eingetragen, bei dem ein Nutzername eingetragen wird und voila. Schön blöd von mir. Aber wenigstens hab ich es jetzt, denke ich. Noch ein paar Details verändern...aber dann! Ich danke euch beiden, ChromOxid und erc ganz ganz herzlich für eure Hilfe. Ihr habt mich echt von so manchen Schläuchen runtergeholt, auf denen ich gestanden hab!
                  Lg Flower

                  Kommentar

                  Lädt...
                  X