Rolf B: Tabelle wird nicht geschrieben

Beitrag lesen

Hallo,

da kann ja auch nichts kommen. Du hast localhost/classProveContakt2.php in den Browser eingegeben. Der macht damit einen GET Request an den Server. Von einem GET Request wird $_POST nicht gefüllt. Was dein Code dann macht, ist dies:

$mella = new ClassProveContakt3();

Damit erzeugst Du das Objekt und VERSUCHST, Werte aus dem Form einzulesen. Es gibt aber keine (weil es ein GET Request war).

$mella -> ShowData();

Gib die Werte aus, die aus dem Form gekommen sind.

Problem: Du zeigst das Form nicht an. Es muss einen POST Zugriff auf deine Seite geben (ein submit Button auf einem <form method="POST"> macht das), der Name, EMail und Message als POST-Daten mitbringt.

$mella = new ClassProveContakt3();
$mella -> ShowForm();
$mella -> PostOkT();
$mella -> ShowData();

Dann bekommst Du das Form, kannst etwas eingeben, POST COMMENT drücken und DANN wird ShowData etwas anzeigen.

Aber ich glaube, das ist nicht das, was Du willst. Du schreibst in der PostOkT Methode eine Datei. Möchtest Du anzeigen, was in dieser Datei gespeichert ist? Dann musst Du sie in ShowData zuerst lesen und für jede Zeile darin die Tabelle ausgeben.

Hinweis: Das HTML in deinem <form> ist falsch. Es sieht so aus (wo Du mit PHP Daten einsetzt, habe ich ... geschrieben):

<form method="POST">
  <label for="name">Name </label>
  <input type="text" name="Name" value="...">
  <label for="email"> E-mail </label>
  <input type="email" value="..." name="Email" 
  <tr>
    <td>
      <br><br>
      <label> Message: <br><textarea cols="45" rows="6" name="Message">...</textarea></label>'
      <br><br>
      <input  type="submit" name="post" value="POST COMMENT" id="comment">
    </td>
  </tr>
</form>
  1. Bei input name="Email" fehlt am Ende ein >
  2. Die Labels von Name und Email funktionieren nicht. Das for-Attribut eines label bezieht sich auf das id-Attribut eines Form-Elements (also zum Beispiel input oder textarea). Eine id gibt es bei Dir nicht. Möglichkeit 1: gib den input Elementen eine id. Möglichkeit 2: Mache es wie bei der textarea, die hast Du in das Label hinein gesetzt. Dann braucht man kein for und kein id.
  3. Dein submit-Button hat eine id. Der braucht aber keine. Wenn du ihn klickst, findest Du in $_POST['post'] den Wert 'POST COMMENT'.
  4. Du verwendest <tr> und <td>, aber es gibt kein <table>. Das ist nicht erlaubt.
  5. Eine Table mit einer Zeile und einer Spalte braucht man nicht. Lass <tr> und <td> (und </td> und </tr>) einfach weg. Warum sind die drin?
  6. Eine Table, um das Layout der Seite zu steuern, ist seit vielen Jahren kein gutes HTML mehr. Das macht man anders. Dafür gibt es die CSS Techniken float, Flexbox und Grid.

Eine verbesserte Version deines Form sieht so aus:

<form method="POST">
  <label for="name">Name </label>
  <input type="text" id="name" name="Name" value="...">
  <label for="email">E-mail </label>
  <input type="email" id="email" name="Email" value="...">
  <br><br>
  <label> Message: <br><textarea cols="45" rows="6" name="Message">...</textarea></label>
  <br><br>
  <input  type="submit" name="post" value="POST COMMENT" id="comment">
</form>

Du gibst das alles mit echo aus. Das kann man machen, aber es ist mühsam. Es kann einfacher sein, die PHP Umgebung zu verlassen und das HTML als einen Block auszugeben. Wo Werte aus PHP gebraucht werden, kehrt man nach PHP zurück. Um "schnell einmal" einen Wert zu holen, kann man das "Short Echo" von PHP verwenden:
<?= $variable ?>. Die ShowForm Methode könnte so aussehen:

    function ShowForm() 
    {
?>
      <form method="POST">
        <label for="name">Name </label>
        <input type="text" id="name" name="Name" value="<?= $this->Name ?>">
        <label for="email">E-mail </label>
        <input type="email" id="email" name="Email" value="<?= $this->Email ?>">
        <br><br>
        <label> Message: <br>
           <textarea cols="45" rows="6" name="Message"><?= $this->Message ?></textarea>      
        </label>
        <br><br>
        <input  type="submit" name="post" value="POST COMMENT" id="comment">
      </form>
<?php
    }

Warum funktioniert das? Alles, was nicht zwischen <?php und ?> steht, wird von PHP einfach mit echo ausgegeben. Die drei folgenden Programme sind für PHP alle gleich[1]:

<?php
   $welt = "World";
   echo "<h1>Hello ".$welt."</h1>";
?>
<p>Willkommen bei PHP</P>
<?php
   $welt = "World";
?>
<h1>Hello <?= $welt ?></h1>
<p>Willkommen bei PHP</p>
<?php
   $welt = "World";
?>
<h1>Hello <?= $welt ?></h1>
<?php
   echo "<p>Willkommen bei PHP</p>";

Rolf

--
sumpsi - posui - clusi

  1. Okay, nicht GENAU gleich. Bei Beispiel 3 wird am Ende kein NewLine-Zeichen ausgegeben - aber für HTML ist das egal. ↩︎