Rolf B: probleme mit nested...

Beitrag lesen

Hallo liebewinter,

Programmstruktur meint die Art, wie die Logik im Programm angeordnet ist.

Konkret meine ich das hier. Das kann nicht funktionieren. $_POST["Name"] kann nicht gleichzeitig leer und gefüllt sein.

if (empty($_POST['Name'])) 
{
   if (isset($_POST['Name']))
   {
      // Datei schreiben
   }
}

Früher war da noch ein ELSE drin. Das fehlt hier. Aber auch dann ist es nicht richtig. Ich muss jetzt etwas Theorie machen.

empty und isset prüfen ähnliche Dinge:

isset($variable): Ist true wenn die Variable vorhanden ist. Egal was drin steht. empty($variable): Ist true wenn die Variable fehlt, ODER wenn ihr Wert gleich FALSE ist.

"Wenn ihr Wert gleich FALSE ist" - das ist in PHP auch nicht so einfach. Es gibt TRUE und FALSE als Wahrheitswerte. Aber einige andere Werte gelten in Vergleichen auch als FALSE: die Zahl 0, der leere String "" (aber nicht " "), und ein leeres Array.

Also: empty($_POST["Name"]) kann wahr sein, wenn:

  1. das Formular nicht mit POST gesendet wurde (das heißt: der erste Aufruf)
  2. das Formular kein <input name="Name"> enthält
  3. der Benutzer in diesem input nichts eingegeben hat. Aber ein Leerzeichen reicht schon, dann ist empty nicht mehr wahr.

Wenn man mit PHP ein Formular programmiert, dann gibt es drei Situationen

  • der erste Aufruf
  • ein POST mit richtigen Daten
  • ein POST mit falschen Daten

Du musst die Situationen erkennen, und du musst wissen, was dann passieren soll.

Erster Aufruf und POST unterscheidest Du mit isset($_POST['post']). Das ist der Name des Submit-Button. Er wird auch gepostet. Das ist beim ersten Aufruf FALSE, und wenn der Browser das Formular sendet ist es TRUE.

Mit isset($_POST['Name']) kannst Du ersten Aufruf und POST nicht unterscheiden. Wenn der Anwender nichts in den Namen schreibt, wird 'Name' nicht gesendet und isset($_POST['Name']) ist FALSE.

Richtige und falsche Daten sind schwieriger zu erkennen. Bei Dir ist es so, dass die Felder ausgefüllt sein müssen. Du kannst die Funktion trim benutzen, um unnötige Leerstellen zu entfernen. trim(" Hallo WELT ") wird zu "Hallo WELT".

Du hast eine Klasse gemacht, in der Name, Email und Message gespeichert werden. Das benutze auch! Wenn man es richtig macht, muss man zuerst die $_POST Daten lesen, bevor man das Form ausgibt. Das ist bei Dir nicht drin, das sollte man ändern.

In deiner HTML Seite schreibst Du das form so:

  <form name="form" id="form" method="post" action="" >
<?php
     $ProveContackt->GetPostData();
     $ProveContackt->Form();
     $ProveContackt->PostOk();
?>
  </form>

GetPostData ist neu und liest die Werte aus $_POST ein:

function GetPostData() 
{
   if (!isset($_POST['Name']))
      $this->Name = trim($_POST['Name']);
   // Übung: mache das für Email und Message auch so
}

Vorteil: Wenn es eine Fehlermeldung gibt, bleiben ausgefüllte Werte im Form stehen.

Das PHP in der Form-Funktion kann so bleiben. 

Die Funktion PostOk kann die Werte benutzen, die GetPostData gespeichert hat.

~~~php
function PostOk() 
{
   // Kein POST - nichts tun, gleich wieder raus.
   if (!isset($_POST['post'])
      return;

   if (empty($this->Name) ||  empty($this->Email) || empty($this->Message))
   {
      // Fehlermeldung schreiben - Please enter all required fields
   }
   else
   {
      // Datei schreiben
      // Datei wieder lesen
      // Ausgeben was Du gelesen hast.
   }
}

So - das ist jetzt nicht fertig und du musst schon selbst drüber nachdenken, wie Du das benutzen kannst :)

Rolf

--
sumpsi - posui - clusi