Rolf B: Probleme Data in Date-Bank zu einsetzen

Beitrag lesen

Hallo Joseba,

du musst ein weiteres SQL Statement ausführen, um die mela Tabelle zu lesen. Das kann zum Beispiel so aussehen:

SELECT name, email, message, datetime
FROM mela
ORDER BY datetime DESC

um die gespeicherten Nachrichten zu lesen, die neueste zuerst.

Ich habe hier kein PHP mit MYSQL zur Verfügung und alles, was ich jetzt schreibe, kann ich nicht testen. Hoffentlich funktioniert es 😉

Mit PDO kann man das so machen:

      function getMessages()
      {
          $db = $this->getConnection();
          if (!$db) return false;

          $sql = "SELECT name, email, message, datetime FROM mela ORDER BY datetime DESC";
          $statement = $db->query($sql);
          if (!$statement)
          {
             $this->reportPDOError("Cannot create query", $sql, $db);
             return false;
          }
          $result = $statement->fetchAll(PDO::FETCH_ASSOC)

          if ($result === FALSE)
             $this->reportPDOError("fetchAll(ASSOC) failed", $sql, $statement);

          return $result;
      }

      private function getConnection()
      {
          // Establish connection with MYSQL Server
          try
          {
             return new PDO("mysql:host=localhost;dbname=meine", "root", "pass");
          }
          catch (PDOException $pe)
          {
             echo "<br>Cannot connect to database: " . $pe->getMessage();
             return false;
          }
      }

      private function reportPDOError($message, $sql, $pdo)
      {
         $info = $pdo->errorInfo();

         echo "<div style='color:red'><b>Error in SQL Access: $message</b>";
         echo "<br>SQL-Statement: $sql";
         echo "<br>PDO SQLSTATE: $info[0]";
         echo "<br>MySQL error code: $info[1]";
         echo "<br>MySQL error message: $info[2]</div>";
      }

Die Methode reportPDOError kannst Du an vielen Stellen verwenden. Du übergibst ihr eine kurze Fehlernachricht, das SQL Statement das zum Fehler führte, und das Objekt aus PDO, das zum Fehler führte. Das kann das PDO-Objekt sein oder das PDOStatement Objekt, beide haben eine erorInfo-Methode.

Die Methode getConnection kannst Du in der INSERT-Funktion wiederverwenden. Auf diese Weise musst Du die Zugangsdaten zur Datenbank nur ein einer Stelle eintragen. Wenn Du irgendwann viele Klassen mit SQL Zugriffen hast, musst Du Dir aber noch etwas anderes überlegen. Eine PHP Application muss so gebaut sein, dass die Zugangsdaten zur Datenbank an GENAU einer Stelle stehen und nur dort geändert werden. Meistens macht man dafür eine include-Datei und definiert dort Konstanten mit DB-Name, DB-User und DB-Passwort.

Die getMessages-Funktion erzeugt eine Datenbankverbindung und verwendet dann die query-Methode des PDO-Objekts. Von query() wird ein PDOStatement Objekt zurückgegeben, in dem das Ergebnis der Abfrage steht.

Für den INSERT Befehl haben wir prepare() und execute() verwendet. Das ist hier nicht nötig, weil das SQL Statement keine Parameter braucht.

Es gibt viele Möglichkeiten, ein Abfrage-Ergebnis aus einem PDOStatement zu holen. Die einfachste ist fetchAll(PDO::FETCH_ASSOC). Das Ergebnis ist ein Array. Jeder Eintrag im Array ist eine Zeile aus der Datenbank. Und jeder Eintrag ist wieder ein Array, mit den Spaltennamen als Key. Den Wert der Spalte name aus der dritten Zeile der Datenbank bekommst Du mit $result[2]['name'].

getMessages gibt dieses Array einfach zurück. Danach endet die Funktion, und PHP löscht die PDO-Objekte $db und $statement. Dadurch wird die Datenbankverbindung wieder freigegeben.

Deine PostOkT Funktion könnte nun so aussehen:

      function PostOkT() 
      {
         if (! $this -> PostOK)
         {
            echo "<br><b><h3>*** Please enter all required fields ***</h3></b>";  
         } 
         else 
         {
             $this->writeCommentToDatabase(); 

             $messages = $this->getMessages();

             foreach ($messages as $message) :
?>
<article>
   <h2>Message from <?= htmlspecialchars($message['name']) ?> (<?= htmlspecialchars($message['name'])?>)</h2>
   <p>Created <?= $message['datetime'] ?></p>
   <p><?= $message['message'] ?></p>
</article>
<?php
             endfor;
         }
     } 

Dem article-Element kannst Du mit CSS noch ein schönes Aussehen geben. Die IP-Adresse gebe ich nicht aus. Wie Du siehst, habe ich für die Ausgabe der Werte PHP verlassen und habe HTML hingeschrieben. Das liest sich besser als viele ECHOs.

Beachte, dass Du auf einer richtigen Webseite die Abfrage der Nachrichten auf eine eigene Seite legen musst, und das muss durch ein Passwort geschützt sein. Jemand, der eine Nachricht schreibt, soll nicht sofort alle Nachrichten lesen können. Das ist jetzt eine Übung für Dich: schreibe eine eigene Seite, die NUR die gespeicherten Nachrichten anzeigt.

Beachte auch, dass dieses Beispiel GANZ einfach ist. Wenn du 1000 Nachrichten hast, werden 1000 Nachrichten ausgegeben. Man würde dann nur 30 oder 50 Nachrichten lesen und Buttons zum Blättern einbauen. Das ist dann die nächste Lernstufe für Dich :)

Rolf

--
sumpsi - posui - clusi
0 53

Probleme Data in Date-Bank zu einsetzen

liebewinter
  • datenbank
  • php
  1. 1
    Rolf B
    1. 0
      liebewinter
    2. 0
      dedlfix
  2. 0
    pl
    1. 1
      Rolf B
      1. 0
        liebewinter
        1. 0
          Rolf B
          1. 0
            liebewinter
      2. 0
        liebewinter
        1. 0
          Rolf B
          1. 0
            liebewinter
            1. 0
              liebewinter
              1. 0
                liebewinter
                1. 0
                  Rolf B
                  1. 0
                    Wallpappe
                  2. 0
                    dedlfix
                    1. 0
                      Rolf B
                      1. 0
                        dedlfix
                        1. 0
                          Rolf B
                          1. 0
                            liebewinter
                            1. 0
                              Rolf B
                              1. 0
                                liebewinter
                                1. 0
                                  Rolf B
                                  1. 0
                                    liebewinter
                                    1. 0
                                      Rolf B
                                      1. 0
                                        liebewinter
                                        1. 0
                                          Rolf B
                                          1. 0
                                            liebewinter
                                            1. 0
                                              liebewinter
                                            2. 0
                                              Rolf B
                                              1. 0
                                                Tabellenkalk
                                                1. 0
                                                  Rolf B
                                              2. 0
                                                liebewinter
                                              3. 0
                                                liebewinter
                                                1. 0
                                                  Rolf B
                                                  1. 0
                                                    liebewinter
                                                    1. 0
                                                      liebewinter
                                                    2. 0
                                                      Rolf B
                                                      1. 0
                                                        liebewinter
                                                        1. 0
                                                          Rolf B
                                                          1. 0
                                                            liebewinter
                                                            1. 0
                                                              liebewinter
                                                          2. 0
                                                            liebewinter
                                                            1. 0
                                                              liebewinter
                                                              1. 0
                                                                Rolf B
                                                                1. 0
                                                                  liebewinter
                              2. 0
                                liebewinter
                                1. 0
                                  Rolf B
                                  1. 0
                                    Matthias Apsel
                                    1. 0
                                      Rolf B
                  3. 0
                    liebewinter
    2. 0
      pl