Formular mit Verification Image

Nexlamar

Erfahrenes Mitglied
Hallo!

Ich beschäftige mich noch nicht so lange mit PHP, würde aber gerne folgendes realisieren:

Folgendes Formularscript soll erst abgeschickt werden, wenn der in der datei code.php (s.u.) erzeugte Code korrekt im Formular steht:

Das ist das Formular:
PHP:
<?php

$strEmpfaenger = 'mail';

$strFrom       = '"Formmailer" <mail>';

$strSubject    = 'Feedback';

$strReturnhtml = 'http://www.provider.xy/IhrName/IhreSeite.htm';

$strDelimiter  = ":\t";


if($_POST)
{
 $strMailtext = "";

 while(list($strName,$value) = each($_POST))
 {
  if(is_array($value))
  {
   foreach($value as $value_array)
   {
    $strMailtext .= $strName.$strDelimiter.$value_array."\n";
   }
  }
  else
  {
   $strMailtext .= $strName.$strDelimiter.$value."\n";
  }
 }

 if(get_magic_quotes_gpc())
 {
  $strMailtext = stripslashes($strMailtext);
 }

 mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
  or die("Die Mail konnte nicht versendet werden.");
 header("Location: $strReturnhtml");
 exit;
}

?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
    <head>
        <title>Einfacher PHP-Formmailer</title>
        <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
    </head>
    <body>
        <h1>Beispielformular</h1>
        <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">
            <!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->
            <dl>
                <dt>Ihr Name:</dt>
                <dd><input type="text" name="Versender" /></dd>
                <dt>Ihre E-Mail:</dt>
                <dd><input type="text" name="E-Mail" /></dd>
                <dt>Sie k&ouml;nnen:</dt>
                <dd><input type="checkbox" name="kannwas[]" value="HTML" />HTML <input type="checkbox" name="kannwas[]" value="PHP" />PHP</dd>
                <dt>Sie sind:</dt>
                <dd><input type="radio" name="sexus" value="M" />Mann <input type="radio" name="sexus" value="Frau" />Frau</dd>
                <dt>Sie m&ouml;gen:</dt>
                <dd><select name="Browser"><option value="Opera">Opera</option><option value="Mozilla">Mozilla</option></select></dd>
                <dt>Bemerkungen:</dt>
                <dd><textarea name="Bemerkungen" rows="3" cols="20">Bemerkungen</textarea></dd>
            </dl>
            <!-- Ende der Beispielangaben -->
            <p>
            <input type="submit" value="submit" />
            <input type="reset" value="Zurücksetzen" />
            </p>
        </form>
    </body>
</html>


Das ist die Darstellung des Verification Images:
PHP:
<?PHP
session_start(); // Session starten

// Überprüfung des Prüfcodes, falls das Formular ausgefüllt wurde

if (isset($_POST['submit'])){
if ($_POST['pruefcode'] == $_SESSION['code']){

echo "Der eingegebene Prüfcode ist richtig<br>";
// Aktionen, wenn Prüfcode richtig ist, also hier soll das Formular abgeschickt werden

}

else {

echo "Der eingegebene Prüfcode ist falsch<br>";
// Aktionen, wenn Prüfcode falsch ist, der Text soll erscheinen und die Page neu geladen werden

}
} // Ende der Formularüberprüfung

$_SESSION['code'] = rand(1000, 9999); // Prüfcode erzeugen und in der Session speichern

?>

<!-- Den foldenden HTML-Teil braucht man hier natürlich nicht, es müssen nur zwei Zeilen 
davon in den Fomular-Code übernommen werden -->

<html>
<head>
<title>Formularseite</title>
</head>
<body>
<img src="code.php">
<form method="POST">
<input type="text" name="pruefcode"><br>
<input type="submit" name="submit">
</form>

Und hier wird das Bild mit Code erzeugt:

PHP:
<?PHP
header("Content-type: image/png");
session_start(); // Startet die Session

$grafik = ImageCreate (100, 100); // Erzeugt ein 100x100px großes Bild
$hintergrundfarbe = ImageColorAllocate($grafik, 255, 0, 0); // Definiert die Farben
$schriftfarbe    = ImageColorAllocate($grafik, 0, 255, 0);  // in RGB-Schreibweise
ImageTTFText ($grafik, 20, rand(-30,30), 15, 70, $schriftfarbe, "/beechf", $_SESSION['code']); // Code aus der Session in die Grafik schreiben
ImagePNG($grafik); // Grafik erzeugen
imagedestroy($grafik); // Zwischenspeicher löschen
?>


Wäre super wenn mir jemand helfen könnte!

Vielen Dank schonmal und Grüße,
Markus
 
Zuletzt bearbeitet:
Ich war mal so frei Deinen PHP-Code in die entsprechenden Tags zu packen, so ist das ganze leichter lesbar und man sieht auch gleich, dass es sich um 3 Happen Code handelt und nicht um einen langen.
 
Das will ich gar nicht, sondern primär will ich verstehen was ich zusammenbastel und funktionieren soll es auch. In diesem Fall geht es mir auch nicht darum ein Script zu schreiben das so ein Bild mit Code erzeugt (da sagst Du ja zurecht dass es schon viele fertige Scripte gibt). Vielmehr bekomme ich das Zusammenwirken von Formular und Verification noch nicht hin. Es wäre daher super wenn mir jemand erstmal erklären könnte wie man die Verification in das Formular einbaut. Wenn das klappt kann ich mich weiter aus dem Fenster wagen und eventuell nach effizienteren Lösungen suchen ;)
 
Zuletzt bearbeitet:
Hat denn niemand eine Idee? Im Prinzip müsste man doch nur den ersten Code-Schnipsel in den zweiten einbauen, ich vermute mit einer if-Bedingung - ich habe das Versucht, aber bei mir hat er dann das Formular nicht mehr abgeschickt. Den 3. Code habe ich nur eingefügt falls es jemanden nach einem Beispiel sucht.

Danke,
Nexlamar
 
Hallo!

Nach einigem Herumwerkeln habe ich es doch geschafft aus verschiedenen (kostenlosen) Quellen mein Wunschscript zusammenzubauen. Es sieht jetzt so aus:

PHP:
<?php 
session_start();
// include Definitionen
include("config.php");
$Input_Code = $_POST["Code"];
$Random_Code = $_SESSION["string"];

if ( ( $Input_Code == $Random_Code ) && ( $Random_Code != "" ))
{

// Code richtig, let´s go!

$mailHeaders = "From: $from\n";
$mailTo = $me;
$mailSubject = "Bewerbung";
$mailBody = "Folgende Bewerbung ist eingetroffen: \n \n";
	
  if (gettype($_POST)=="array")
  {
		reset($_POST);
		while ( list($key, $value) = each($_POST)) 
    {
		 $mailBody .= "$key: $value \n\n"; 
		}
	}
  
	mail($mailTo, $mailSubject, $mailBody, $mailHeaders); 
   
	session_destroy();

	if (!headers_sent()) 
  {
   	header("Location:
    http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/".$deliver);  	
   	exit;
  } 
  else 
  {
   print("<h1>code entry matched, but problem, could not send header for new page, already
   header?</h1></body></html>\n");
   exit;
  }
} 
else 
{
// Code falsch, nochmal!
	$_SESSION['string'] = rand(1000, 9999); 
}
?>

<html>

  <head>
  <meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
  </head>

  <body>
    <form action="<? print($PHP_SELF); ?>" method="POST" name="Form" target="_self" id="Form">
    <table>
      <tr>
        <td></td>
        <td><img src="./verification.php"></td>
      </tr>
      <tr>
        <td>Eingabe Code:</td>
        <td><input name="Code" type="text" id="Code" size="5"></td>
      </tr>
      <tr>
        <td>Name:</td>
        <td><input type="text" name="Name" size="30"></td>
      </tr>
      <tr>
        <td>E-Mail:</td>
        <td><input type="text" name="E-mail" size="30"></td>
      </tr>
      <tr>
        <td>Software:</td>
        <td>
          <input type="radio" name="FS-Version" value="FS 2002">FS 2002<br>
          <input type="radio" name="FS-Version" value="FS 2004">FS 2004
        </td>
      </tr>
       <tr>
        <td>Add-Ons:</td>
        <td>
          <input type="checkbox" name="Ad-Ons[]" value="Flight1 ATR72-500">
          Flight1 ATR-72 500<br>
          <input type="checkbox" name="Ad-Ons[]" value="FsPassengers"> FsPassengers<br>
          <input type="checkbox" name="Ad-Ons[]" value="FSBuild"> FSBuild<br>
          <input type="checkbox" name="Ad-Ons[]" value="German Airports 4">
          German Airports 4<br>
          <input type="checkbox" name="Ad-Ons[]" value="FSUIPC"> FSUIPC
        </td>
      </tr>
      <tr>
        <td>Type-Rating:</td>
        <td>
          <select name="Type-Rating[]" size="4" multiple>
            <option>ATR72-500</option>
            <option>B737-600/700/800</option>
            <option>B737-300/400/500</option>
            <option>Beech Bonanza A36</option>
          </select>
        </td>
      </tr>
      <tr>
        <td>Fon:</td>
        <td><input type="text" name="Telefon" size="30"></td>
      </tr>
      <tr>
        <td>Motivation:</td>
        <td><textarea rows="5" name="Motivation" cols="30"></textarea></td>
      </tr>
      <tr>
        <td></td>
        <td><input type="submit" name="Submit" value="Senden">&nbsp;&nbsp;<input type="reset"
        value="Reset" name="reset"></td>
      </tr>
    </table>
    </form>
  </body>
</html>

Dazu noch eine Datei in die ich gerne möglichst viele Variablen auslagern würde:

PHP:
<?php
$deliver="send.html" ;
$me="markus.wichmann@gmail.com" ;
$from = '"Website" <noreply@Website.de>';
//.$_SERVER['HTTP_HOST']
?>

Und noch die Datei, welche das Bild erzeugt:

PHP:
<?PHP
header("Content-type: image/png");
session_start(); // Startet die Session

$grafik = ImageCreate (55, 30); // Erzeugt ein Bild
$hintergrundfarbe = ImageColorAllocate($grafik, 139, 139, 177); // Definiert die Farben
$schriftfarbe    = ImageColorAllocate($grafik, 159, 159, 198);  // in RGB-Schreibweise
ImageTTFText ($grafik, 18, rand(-10,10), 5, 20, $schriftfarbe, "/ttf_codef", $_SESSION['string']); 
// Code aus der Session in die Grafik schreiben
ImagePNG($grafik); // Grafik erzeugen
imagedestroy($grafik); // Zwischenspeicher löschen
?>


Wie anfangs geschrieben bin ich PHP-Neuling. Ich hätte jetzt noch einige Fragen zum Script, vielleicht kann mir dazu jemand was erklären:

Speziell hierzu:

PHP:
if (!headers_sent()) 
  {
   	header("Location:
    http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF'])."/".$deliver);  	
   	exit;
  } 
  else 
  {
   print("<h1>code entry matched, but problem, could not send header for new page, already
   header?</h1></body></html>\n");
   exit;
  }
}

Warum werden diese Zeilen benötigt?

Speziell hierzu:

PHP:
if (gettype($_POST)=="array")
  {
		reset($_POST);
		while ( list($key, $value) = each($_POST)) 
    {
		 $mailBody .= "$key: $value \n\n"; 
		}
	}

Hier werden wenn ich es richtig sehe in einer Schleife alle Formulardaten in eine Art Array geschrieben und der Variablen $mailBody übergeben, welche dann versandt wird. Ich habe jetzt aber auch einige Arrays im Formular selbst (Checkbox, Liste) - wie können hier alle Werte mitübergeben werden? Das gut gemachte Tutorial dazu (for-Schleife) habe ich gesehen, leider weiß ich nicht wie man es in den Mailversand einbaut ...

Des Weiteren würde ich gerne jedes Feld auf Inhalt überprüfen. Im Falle fehlenden Inhaltes soll direkt in die jeweilige Tabellenzeile ein kurzer Satz erscheinen (Bitte noch ausfüllen oder so).

Und schließlich würde ich gerne wissen, ob es eine Möglichkeit gibt, die Formulardaten nach einem gewollten Browser-Reload oder nach Falscheingabe des Codes "zu speichern", sodaß nicht alles wieder eingegeben werden muss?

Auch wenn ich nicht erwarten kann auf alles eine Antwort zu bekommen, würde ich mich über den einen oder anderen Tipp freuen!

Danke und Grüße,
Nexlamar
 
Zurück