Formularfelder auf Eingabe überprüfen

So müsste es gehen:

PHP:
<!-- Formular Darstellung --> 
<form name="" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post" enctype="text/html"> 
<p>Name:<br> 
<input name="Name" value="<?php echo @$_POST['Name']; ?>" size="50" maxlength="150" type="text"> 
</p> 
<p>E-Mail-Adresse:<br> 
<input name="Email" value="<?php echo @$_POST['Email']; ?>" size="50" maxlength="150" type="text"> 
</p> 
<p>Beitrag:<br> 
<textarea name="Beitrag" rows="10" cols="50"><?php echo @$_POST['Beitrag']; ?></textarea> 
</p> 
<input name="" value="speichern" type="submit"> 
</form> 

<!-- Daten speichern, wenn alle Felder ausgefüllt wurden--> 
<?php  
$fehler = 0; 
$fehlertext = ""; 
If (isset[$_POST["Speichern"])) {

If (!isset($_POST['Name']) Or Trim($_POST['Name']) == "") { 
  $fehler = 1; 
  $fehlertext = "Bitte geben Sie Ihren Namen an.<br>"; 
} 

If (!isset($_POST['Email']) Or Trim($_POST['EMail']) == "") { 
  $fehler = 1; 
  $fehlertext = "Bitte geben Sie Ihre EMail Adresse an.<br>"; 
} 

If (!isset($_POST['Beitrag']) Or Trim($_POST['Beitrag']) == "") { 
  $fehler = 1; 
  $fehlertext = "Bitte geben Sie einen Beitrag ein.<br>"; 
} 

If ($fehler == 0) {  

$sql .= " INSERT INTO gbuch "; 
$sql .= " SET "; 
$sql .= " Name ='". $_POST['Name'] ."', "; 
$sql .= " Email ='". $_POST['Email'] ."', "; 
// UTC Zeit festlegen: 
date_default_timezone_set('Europe/Berlin');  
$sql .= " Datum ='". date("Y-m-d H:i:s") ."', ";  
$sql .= " Beitrag='". $_POST['Beitrag'] ."' ";  

echo "<h2>Eintrag gespeichert</h2>"; 

//Zugriff auf die MySQL Datenbank: 
define ( 'MYSQL_HOST', 'localhost' ); 
define ( 'MYSQL_BENUTZER', 'root' ); 
define ( 'MYSQL_KENNWORT', '' ); 
define ( 'MYSQL_DATENBANK', 'gaestebuch' ); 

$db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT); 
if ( ! $db_link ) 
{ 
die('keine Verbindung zur Zeit m&ouml;glich - sp&auml;ter probieren '); 
} 
$db_sel = mysql_select_db( MYSQL_DATENBANK ) 
or die("Auswahl der Datenbank fehlgeschlagen"); 

// ausführen des mysql-Befehls/Speichern der Daten 
$db_erg = mysql_query( $sql ); 
if ( ! $db_erg ) 
{ 
die('Ung&uuml;ltige Abfrage: ' . mysql_error()); 
} 
if($sql && mysql_affected_rows() > 0) 
{ 
?> 
<p>Vielen Dank f&uuml;r Ihren Eintrag!<br> 
<?php  
} 

?> 
</p> 
<p>Beim Eintragen ist ein Fehler aufgetreten.<br> 
<?php } 
echo '<p><a href="gaestebuch.php">G&auml;stebuch anzeigen</a></p>'; 
exit; 
exit; 
}
?>

Übrigens: Dein Formular und der Button selber haben keinen Namen. Das kann auch zu Problemen führen !
 
Zuletzt bearbeitet:
Ich habe dem Formular jetzt einen Namen gegeben und den Quellcode so wie oben eingefügt.

Es treten aber folgende Probleme auf:
- wenn nichts in die Felder engetragen wurde und ich auf speichern klicke, passiert nichts, ausser dass der link "Gästebuch anzeigen" unter dem Formular erscheint
=> es wird keine Fehlermeldung ausgegeben
- wenn in alle Felder etwas eingetragen wurde und ich auf speichern klicke, kommt nicht mehr die Ausgabe "Vielen Dank für ihren EIntrag" und die Daten werden auch nicht im Gästebuch gespeichert..

Jetzt bin ich total verwirrt...wieso geht das auf ein mal nicht mehr^
 
Dazu bleibt nur zu sagen, dass die Verwendung von $_SERVER["PHP_SELF"] ziemlich unsicher ist und vermieden werden sollte. Wer möchte, kann ja mal folgendes bei sich lokal ausprobieren.

HTML:
<form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>">
<input type="submit" />
</form>

und das dann mit folgender URL aufrufen:
Code:
http://localhost/pfadZurDatei/index.php/"></form><script type="text/javascript">alert("you got XSS'ed");</script><form>
 
So funktioniert das bei mir. Ich hab den Code mal nebenbei etwas formatiert, damit er besser lesbar ist ;)

HTML:
<?php
error_reporting(E_ALL);
?>
<!-- Formular Darstellung -->
<form action="./" method="post">
<p>Name:<br>
<input name="Name" value="" size="50" maxlength="150" type="text">
</p>
<p>E-Mail-Adresse:<br>
<input name="Email" value="" size="50" maxlength="150" type="text">
</p>
<p>Beitrag:<br>
<textarea name="Beitrag" rows="10" cols="50"></textarea>
</p>
<input name="speichern" value="speichern" type="submit">
</form>

<!-- Daten speichern, wenn alle Felder ausgefüllt wurden-->
<?php
$fehler = 0;
$fehlertext = "";
if (isset($_POST["speichern"])) {

  if (!isset($_POST['Name']) Or Trim($_POST['Name']) == "") {
    $fehler = 1;
    $fehlertext = "Bitte geben Sie Ihren Namen an.<br>";
  }

  if (!isset($_POST['Email']) Or Trim($_POST['Email']) == "") {
    $fehler = 1;
    $fehlertext = "Bitte geben Sie Ihre EMail Adresse an.<br>";
  }

  if (!isset($_POST['Beitrag']) Or Trim($_POST['Beitrag']) == "") {
    $fehler = 1;
    $fehlertext = "Bitte geben Sie einen Beitrag ein.<br>";
  }

  if ($fehler == 0) {

    $sql = " INSERT INTO gbuch ";
    $sql .= " SET ";
    $sql .= " Name ='". $_POST['Name'] ."', ";
    $sql .= " Email ='". $_POST['Email'] ."', ";
    // UTC Zeit festlegen:
    date_default_timezone_set('Europe/Berlin');
    $sql .= " Datum ='". date("Y-m-d H:i:s") ."', ";
    $sql .= " Beitrag='". $_POST['Beitrag'] ."' ";

    echo "<h2>Eintrag gespeichert</h2>";

    //Zugriff auf die MySQL Datenbank:
    define ( 'MYSQL_HOST', 'localhost' );
    define ( 'MYSQL_BENUTZER', 'root' );
    define ( 'MYSQL_KENNWORT', '' );
    define ( 'MYSQL_DATENBANK', 'gaestebuch' );

    $db_link = @mysql_connect (MYSQL_HOST, MYSQL_BENUTZER, MYSQL_KENNWORT);
    if ( ! $db_link ){
      die('keine Verbindung zur Zeit m&ouml;glich - sp&auml;ter probieren ');
    }
    $db_sel = mysql_select_db( MYSQL_DATENBANK ) or die("Auswahl der Datenbank fehlgeschlagen");

    // ausführen des mysql-Befehls/Speichern der Daten
    $db_erg = mysql_query( $sql );
    if ( ! $db_erg ){
      die('Ung&uuml;ltige Abfrage: ' . mysql_error());
    }
    if($sql && mysql_affected_rows() > 0){
      ?>
      <p>Vielen Dank f&uuml;r Ihren Eintrag!<br>
      <p><a href="gaestebuch.php">G&auml;stebuch anzeigen</a></p>
      <?php
    }
    ?>
    </p>
    <p>Beim Eintragen ist ein Fehler aufgetreten.<br>
    <?php
  }
  else
    echo $fehlertext;
}
?>
 
Also bei mir funktioniert das nicht.....
Jetzt werde ich beim Klick auf speichern immer auf die Index Seite zurückgeleitet....:confused:
 
timestamp hat nur deine "bedenkliche" Schreibweise wie folgt geändert:

HTML:
<form action="./" method="post">

Ändere du es nun so das du bei action ="" den Namen deiner Datei einträgst.

Er hat dir ja auch dazugeschrieben warum er das gemacht hat ! ! !
 
Ok, danke! Jetzt funktioniert das mit den Fehlermeldungen schon mal :)
Allerdings gibt es noch das Problem, dass die schon getätigten Eingaben gelöscht werden, wenn man nicht alle Felder ausgefüllt hat und auf speichern klickt...
 
Kann es sein das du dir immer nur den Code kopierst und bei dir wieder einfügst?

HTML:
<p>Name:<br>
<input name="Name" value="<?php echo @$_POST['Name']; ?>" size="50" maxlength="150" type="text">
</p>
<p>E-Mail-Adresse:<br>
<input name="Email" value="<?php echo @$_POST['Email']; ?>" size="50" maxlength="150" type="text">
</p>
<p>Beitrag:<br>
<textarea name="Beitrag" rows="10" cols="50"><?php echo @$_POST['Beitrag']; ?></textarea>
</p>
 
Wenn du nicht die index als Formular benutzt, musst du im action attribut den Dateinamen hineinschreiben. Zum Beispiel
HTML:
<form action="./meineDatei.php">
 

Neue Beiträge

Zurück