Rolf B: wie kann verhinder Bytes Nummer bekomme mit file_put_contents

Beitrag lesen

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