liebewinter: wie kann verhinder Bytes Nummer bekomme mit file_put_contents

Wie habe verstand , wenn benutze der Function file_put_contents ich bekomme die Nummer von Bytes die die Worten haben , Beispiel , auf meine code ich habe ,

file_put_contents($file, $data . "\n", FILE_APPEND|LOCK_EX);

ich habe meine Variable so , $file = "test.txt"; und das ist , wie wird auf meine test.txt gescriben…

a:4:{s:4:"name";s:4:"aaaa";s:5:"email";s:10:"aaa@web.de";s:7:"message"; s:27:"mmmmm";s:8:"datetime";s:22:"11/10/2018 10:45:02 pm";}

meine frage auf euch , wie kann verhindert diesen Zahlen zu bekommen ,ich möchte nur bekomme das Ergebnis ohne die Nummer…

Mein Ganze code:

<?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;
      private $DateTime;
      private $items; 

 
    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() 
    {
?>
      <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
    }
   
  
       
       
      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>";
        
                       }
               
                    }

                   

       
       }

}       
      
            
?>
  1. a:4:{s:4:"name";s:4:"aaaa";s:5:"email";s:10:"aaa@web.de";s:7:"message";

    s:27:"mmmmm";s:8:"datetime";s:22:"11/10/2018 10:45:02 pm";}

    meine frage auf euch , wie kann verhindert diesen Zahlen zu bekommen ,ich möchte nur bekomme das Ergebnis ohne die Nummer…

    Dein Skript benutzt serialisierte Daten. Falls Du das wirklich nicht willst musst Du sehr viel neu schreiben und Dir ein selbst sehr genau überlegen, wie Du die Daten speichern und lesen willst. Das ist viel Aufwand, erfordert viel Wissen und Sorgfalt. Außerdem musst Du sehr viel neu machen.

    Also: Auf das Serialisieren zu verzichten ist keine gute Idee.

    1. Danke für deinen Antwort !

      was würdest du mich emfehlt um eine "schönere" output haben...

      Also: Auf das Serialisieren zu verzichten ist keine gute Idee.

      kannst du Bitte mir sage , warum ?, nur um zu lernen , danke

      1. Hallo liebewinter,

        ich weiß, du musst viel lernen, aber viel von dem, was wir schreiben, liest Du gar nicht und dann funktioniert es nicht. Bitte lies alles, was wir schreiben. Auch in diesem Text, ich spreche vier Themen an!

        1. In PostOkT steht immer noch dies:
        $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);
        

        Dass musst Du nicht machen. Im Konstruktor werden alle POST-Werte ins Objekt übertragen. Die filter_input Zeilen sind unnötig. $data erzeugst Du dann so:

           $data = array("name" => $this->Name, "email" => $this->Email, "message" => $this->Message, "datetime" => $datetime);
        

        Vor $datetime steht kein $this, weil das eine Variable ist die Du erst an dieser Stelle erzeugst, die ist keine Variable des Objekts.

        2. Jetzt zu deiner Frage.

        Die Daten müssen nicht "schön" sein. Sie werden vom Computer geschrieben und gelesen, der kommt damit zurecht.

        file_put_contents hast Du falsch verstanden. Du schreibst:

        file_put_contents ich bekomme die Nummer von Bytes die die Worten haben

        Das ist die Anzahl der Bytes, die in die Datei geschrieben wurden. Aber dann sprichst Du von den Zahlen in

        a:4:{s:4:"name";s:4:"aaaa";s:5:"email";s:10:"aaa@web.de";s:7:"message"; s:27:"mmmmm";s:8:"datetime";s:22:"11/10/2018 10:45:02 pm";}

        Diese Zahlen kommen nicht von file_put_contents, sondern sie werden von serialize erzeugt. deserialize versteht das. Einträge wie a:4: oder s:4: beschreiben, was da gespeichert ist: a:4 ist ein Array mit 4 Einträgen, s:8 ist ein String aus 8 Zeichen. Das hat sich vor vielen Jahren ein Programmierer der Sprache PHP ausgedacht.

        3. Es gibt aber ein Problem mit serialize! Deine Message steht in einer <textarea>, da kann es Zeilenumbrüche geben. Diese Zeilenumbrüche stehen dann auch in $this->Message und werden von file_put_contents in die Datei geschrieben.

        Die Konsequenz ist: Die file-Funktion, die die Datei liest, macht dann aus einer Zeile zwei. Oder mehr. Deswegen muss man Zeilenumbrüche verschlüsseln bevor man sie in die Datei schreibt. Deswegen möchte ich Dir vorschlagen, serialize nicht zu verwenden. Es gibt JSON. Das verwendet man in JavaScript, wenn man serialisieren möchte, und es verschlüsselt Zeilenumbrüche automatisch. JSON gibt es auch in PHP. Ersetze serialize durch json_encode und unserialize durch json_decode. Und dann lösche test.txt, weil die Zeilen darin, die mir serialize erzeugt wurden, von json_decode nicht verstanden werden.

        Wenn man deinen Beispiel mit json_encode serialisiert, sieht das so aus:

        {"name":"aaaa","email":"aaa@web.de","message":"mmmmm","datetime":"11/10/2018 10:45:02 pm"}

        4. json_decode ist etwas anders als unserialize. Von unserialize bekommst Du ein Array. Aber json_decode erzeugt ein Objekt. Du musst beim Ausgeben $data["name"] ersetzen durch $data->Name, und das auch bei Email und Message tun.

        Rolf

        --
        sumpsi - posui - clusi
        1. Erste, viellllll danke für deine Geduld ! ☺️

          ich weiß, du musst viel lernen, aber viel von dem, was wir schreiben, liest Du gar nicht und dann funktioniert es nicht. Bitte lies alles, was wir schreiben.

          hast du Recht ,meine "Probleme" ist das ich ein hyperaktiv Person bin... als ich Kind war , in der Schule habe ich auf einigen Fächer Unterstürtz bekomme ,Beispiel bei Mathematik , bei andere Fächer , Beispiel Gesichte und Geographie war ich Besser...

          Für mich Hyperaktiv ist andere als wie viele denken , ist keine Krankeheit ,ist nur andere zu sein..., ist die Gesellschaft Moral was entscheidet wer "Normal" oder "nicht Normal" ist ...

          Eines mal habe gelesen ein Schöne Zitat von einem Hyperaktiv Person der Gut Beschreibt die unterschied zwischen Hyperaktiv und nicht Hyperaktiv Menschen ,auf nicht Hyperaktiv Menschen das Gehirn funzioniert mit Windows als Betriebssysteme , auf uns , Linux ☺️

          so , zurück auf meine Probleme...

          Du musst beim Ausgeben $data["name"] ersetzen durch $data->Name, und das auch bei Email und Message tun.

          ich habe gemacht wie du sagst , aber bekomme dieser Fehler beim Webformular;

          Notice: Trying to get property 'Name' of non-object in /var/www/html/ClassProveContakt3.php on line 110

          Notice: Undefined index: 11/12/2018 02:29:58 pm in /var/www/html/ClassProveContakt3.php on line 111

          Notice: Trying to get property 'Email' of non-object in /var/www/html/ClassProveContakt3.php on line 112

          Notice: Trying to get property 'Message' of non-object in /var/www/html/ClassProveContakt3.php on line 113

          Villeicht auf der Grund wie hier sagt (das Erste Antwort..) und wenn ich mache wie er sagt :

          htmlspecialchars( $data["name"])

          bekomme alles Gut....

          Meine code jetz:

          <?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;
                private $DateTime;
                private $items; 
          
           
              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() 
              {
          ?>
                <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
              }
             
            
                 
                 
                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"; 
                                 
                                 
                                 
                                 $datetime = date('m/d/Y h:i:s a', time());
                                 $data = array("name" => $this->Name, "email" => $this->Email, "message" => $this->Message, "datetime" => $datetime);
                                 
              	   
              			           $data = json_encode($data);
              		              file_put_contents($file, $data . "\n", FILE_APPEND|LOCK_EX);
                                 
                                 
                                 $messages = file($file);
                                
              		              foreach ($messages as $value) {
              		                $data = json_decode($value, true);
              				                  
                  
                                            
                                            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>";
                  
                                 }
                         
                              }
          
                             
          
                 
                 }
          
          }       
                
                      
          ?>
          
          

          und auf meine test.txt Datei , bekomme wie du sagst…

          {"name":"aaaa","email":"aaa@web.de","message":"mmmmmmmmmmmmmmmmmmmmmmmmmmm","datetime":"11/12/2018 01:33:52 pm"}

          ich wünsche dir einen Schöne Start in die Woche !

    2. Dateien sind immer das Ergebnis einer Serialisierung!