liebewinter: Tabelle wird nicht geschrieben

hallo , ich habe das probleme die Tabelle wird nicht gebaut , auch bekomme keine Name , Email und Message auf meine datei ClassProveContakt2.php , der screenshot was auf dieser datei bekomme..

Der Code von ClassProveContakt2.php ;

<?php
require_once 'ClassProveContakt3.php';
error_reporting(E_ALL);

$mella = new ClassProveContakt3();


$mella -> ShowData();  
   

Die Datei ClassProveContakt3.php wo meine ganze Code habe ;

<?php

header('Content-Type: text/html; Charset=utf-8');
mb_internal_encoding('UTF-8');
date_default_timezone_set('Europe/Berlin');
error_reporting(E_ALL);


class ClassProveContakt3 
{

      private $Name;
      private $Email;
      private $Message;
      private $PostOK = false;
      private $DateTime = false;
      private $items = false; 

 
    function __construct() 
    {

 
         $this -> DateTime = date('m/d/Y h:i:s a');  
         $this -> items = ['Name', 'Email', 'Message']; 
          
         $flag = true;
         foreach ( $this -> items as $key ) {  
			           if ( empty ( $_POST[$key] ) )  {
			             $flag = false;    
			           } else {    
			             $this -> $key = trim( filter_var( $_POST[$key], FILTER_SANITIZE_STRING ) );
			            }    
		   }	    
         $this -> PostOk = $flag; 
    }

 
    

  
    function ShowForm() 
     {

     


        echo ('<form method="POST">');

 
                    echo('<label for="name">Name </label>');

 

                    echo('<input type="text" name="Name" value="'.$this->Name.'">');

 

                    echo('<label for="email"> E-mail </label>');

 

                    echo('<input type="email" value="'.$this->Email.'" name="Email" ');

 

 

              echo('<tr>');

 

                 echo('<td>');

                     echo('<br><br>');

                     echo('<label> Message: <br><textarea cols="45" rows="6" name="Message">'.$this->Message.'</textarea></label>');

                     echo('<br><br>');

                     echo('<input  type="submit" name="post" value="POST COMMENT" id="comment">');

 

                 echo('</td>');

 

               echo('</tr>');

 

         echo('</form>');

 
      }

   
  
       
       
      function PostOkT() 
      {

     
              
        

 
               if ($this -> PostOK) 
               {
              
                  return;
               } 
                   if (empty($this->Name) ||  empty($this->Email) || empty($this->Message))
                   {
                   
                       echo "<br>" . "<b>" . "<h3>*** Please enter all required fields ***</h3>" . "</b>";  
               
                  
                   }

          
                   else 
                   {
                   
                   	
                      
                       
                       $file = "test.txt"; 
                       
                       
                       $name = filter_input( INPUT_POST, 'Name', FILTER_SANITIZE_STRING);
                       $email = filter_input(INPUT_POST, 'Email', FILTER_SANITIZE_STRING);
                       $message = filter_input(INPUT_POST, 'Message', FILTER_SANITIZE_STRING);
                       $datetime = date('m/d/Y h:i:s a', time());
                       
                       $data = array("name" => $name, "email" => $email, "message" => $message, "datetime" => $datetime);
    	   
    			           $data = serialize($data);
    		              file_put_contents($file, $data . "\n", FILE_APPEND|LOCK_EX);
                       
                       
                       $messages = file($file);
                      
    		              foreach ($messages as $value) {
    		                $data = unserialize($value);
    				                  
        
                                  
                                  echo "<br>"

                                      . "<b>From: </b>" . htmlspecialchars( $data["name"])
                                      . "<b> at: </b>" . htmlspecialchars( $data["datetime"])
                                      . "<br><br>" . htmlspecialchars( $data["email"])                                     
                                      . "<br><br>" . htmlspecialchars( $data["message"])
                                      . "<br><hr>";
        
                       }
               
                    }

       }
       

       function ShowData() {
      
          
         
          
             $ShowItems = $this -> items; 
             array_unshift( $ShowItems, 'DateTime' ); 
             
             echo "<table><tr>";
             foreach ( $ShowItems as $ColName ) {
                 echo"<th>" . htmlspecialchars( $ColName ) . "</th>"; 
             echo "</tr><tr>";
             }
             foreach ( $ShowItems as $ColName ) {
    			      echo"<td>" . htmlspecialchars( $this -> $ColName ) . "</td>"; 
    	       }
             echo "</tr></table>";
                    
               
       
       }
       

}       
      
            
?>


Auf meine Webformular Seite bekomme alles in Ordnung , wie der Screenhot zeigt...

  1. 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. ↩︎

    1. Erste danke für deinen bemüht !

      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.

      ich habe gemacht wie du sagst ,aber bekomme alles gleich... .

      ich weiss das mein deutsch schwieriger zu verstande ist , aber versuche dich zu erklärt was ich möchte...

      ich möchte wenn jemand auf dem Webform schreibt (Name, Email und Mesage), Später auf diesem Webform wird gezeigt NUR Date Time, Name und Message , nicht der Email... ich möchte eine extra Datei bauen um Verwalter die Webform ... Beispiel wenn jemand schreibt etwas die mir nicht gefällt , ich kann es löschen...

      1. Hallo ,

        ich habe gemacht wie du sagst ,aber bekomme alles gleich... .

        Merkwürdig. Die Aufrufe von

        $mella -> ShowForm();
        $mella -> PostOkT();

        hast Du eingebaut? Du müsstest dann auf jeden Fall das Eingabeformular sehen.

        Oder willst Du das Formular gar nicht sehen? Dann musst Du Dir überlegen, woher ShowData seine Daten bekommen soll. Die Variablen $this->Name, $this->Email und $this->Message werden nur gefüllt wenn ein POST empfangen wird.

        Rolf

        --
        sumpsi - posui - clusi
    2. In dem teil wo du sagst ..

      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
          }
      

      aber wenn ich das mache , das Ende von dem Class , wird nicht geschlossen ?

      1. Hallo ,

        das Ende von dem Class , wird nicht geschlossen ?

        Ich weiß nicht was Du meinst. Ich habe es gerade probiert, mein Code ist nicht falsch. Bekommst Du eine Fehlermeldung? Welche?

        Wenn Du eine dieser beiden Fehlermeldungen bekommst, hast Du ein } zu viel oder zu wenig.

        Parse error: syntax error, unexpected '}', expecting end of file in ... on line ...

        Parse error: syntax error, unexpected end of file, expecting function (T_FUNCTION) or const (T_CONST) in ... on line ...

        Rolf

        --
        sumpsi - posui - clusi
        1. Ich weiß nicht was Du meinst. Ich habe es gerade probiert, mein Code ist nicht falsch. Bekommst Du eine Fehlermeldung? Welche?

          bekomme keine Fehler , alles funzioniert Gut , aber ich habe gedacht wenn schreibe ?> das bedeutet dass der class ClassProveContakt3 wird auch geschloßen...

          Hast du meine andere Frage verstande…

          ich möchte wenn jemand auf dem Webform schreibt (Name, Email und Mesage), Später auf diesem Webform wird gezeigt NUR Date Time, Name und Message , nicht der Email... ich möchte eine extra Datei bauen um Verwalter die Webform ... Beispiel wenn jemand schreibt etwas die mir nicht gefällt , ich kann es löschen...

          1. Hallo ,

            gedacht wenn schreibe ?> das bedeutet dass der class ClassProveContakt3 wird auch geschloßen…

            Deswegen habe ich die Beispiele gemacht. Das PHP Programm ist zu Ende, wenn die .php Datei zu Ende ist. Alles, was nicht zwischen <?php und ?> steht, wird wie eine Ausgabe mit echo behandelt.

            Hast du meine andere Frage verstande…

            Ja, aber was soll ich darauf antworten? Möchtest Du, dass ich ausführlich beschreibe, wie man das macht? Das wird mir jetzt zu viel Arbeit. Du hast aber schon viele Bausteine dafür:

            • Eingeben von Kommentaren mit einem Form
            • Schreiben von Kommentaren in eine Datei
            • Lesen der Datei und Ausgeben

            Jetzt brauchst Du noch eine Anmeldung für den Verwalter, es soll ja nicht jeder löschen dürfen. Und eine Session, damit PHP sich merken kann dass jemand angemeldet ist. Das ist alles noch viel Arbeit und viel zu lernen. Hast Du ein Buch über PHP, das in deiner Muttersprache geschrieben ist?

            Rolf

            --
            sumpsi - posui - clusi
            1. Hast Du ein Buch über PHP

              Ja , ich habe diesen , Einstieg in PHP 7 und MySQL.pdf

            2. kennst du jemand wegen Geld , könnte mir hilfe ...

              1. Hallo ,

                Tut mir leid, nein.

                Rolf

                --
                sumpsi - posui - clusi
                1. aber kennst du jemand der machen kann ? , oder mir helfen kann ?

                  ich habe nicht viel Zeit weil ich arbeite ,ich bin auch kein Person der möchte alles in den Mund geben ☺️ , ich bin seit zwei Monate die eine Lösung suche auf diesen Probleme...und ich muss mehr lernen (Sicherheit ,Artikel schreibe ,....) .Ich weiss das ich nicht viel über PHP kenne.. deshalb ich bedanke mich euch alle weil danke eure Hilfe ,PHP lerne , mehr einfacher geworden sei , auch ich weiss das ich muss viellllll mehr Lernen.…

                  Tut mir leid, nein.

                  Es mir gefällt ☺️ , in dieser Zeit , wo vielllll Menschen denken , jeden hat ein Preis ,deine Würdigkeit es mir gefällt....

        2. Auf meine ClassProveContakt2.php bekomme nur der Zeit , wie der Screensot zeigt..