PHP-Formular funktioniert nicht

Skandinavika

Mitglied
Hallo!

Bitte helft mir :( : Meine PHP-Formulare arbeiten leider nicht wie gewünscht. Zwar wird der Sicherheitscode zum Verschicken der Daten ordnungsgemäß erzeugt (und auch in die Datenbank geschrieben), aber es wird keine Email verschickt (nicht an uns und auch nicht die Kopie an den User der HP); außerdem wird nach dem Klick auf Abschicken keine Bestätigungsseite angezeigt, sondern nur die Kontaktseite mit neuem Code und leerem Formular geladen. Das Live-Erlebnis gibts hier.

Ich habe den Code angefügt. Könnt Ihr mir vielleicht sagen, wo der Fehler liegt?

Schon mal im Voraus vielen Dank! :)

Code:
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
  <tr> 
    <td> 
<?php
if (!empty($HTTP_POST_VARS)) {extract($HTTP_POST_VARS);}
$remote = getenv("REMOTE_ADDR");
$date = date("m.d.Y H:i:s");

// Datenbank leeren wenn mehr als 100 Einträge vorhanden sind und nur die letzen 30 Einträge behalten

$verbindung = mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name, $verbindung);

$abfrage=mysql_query("SELECT Code FROM $db_table" , $verbindung);
$anzahl_datensaetze = mysql_num_rows($abfrage);

if ($anzahl_datensaetze > 100) {

     $verbindung = mysql_connect($db_host, $db_user, $db_pass);
     mysql_select_db($db_name, $verbindung);
     mysql_query("DELETE FROM $db_table ORDER BY ID LIMIT 70");
     }

// Ende Datenbank leeren

// Anfang Code erzeugen und in die Datenbank schreiben

$verbindung = mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name, $verbindung);

$Buchstaben=array("A", "B", "C", "D", "E", "F", "G", "H", "K", "M", "N", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y");
$Zahlen=array("2", "3", "4", "5", "6", "7", "8", "9");

for($i=0, $Code=""; strlen($Code)<6; $i++)
{
	if(rand(0, 1)==0 && isset($Buchstaben))
	{
		$Buchstabe=$Buchstaben[rand(0, count($Buchstaben))];
		$Code.=$Buchstabe;
		$Codeanzeige.=$Buchstabe." ";
	}
	else
	{
		$Zahl=$Zahlen[rand(0, count($Zahlen))];
		$Code.=$Zahl;
		$Codeanzeige.=$Zahl." ";
	}
}
$Codeanzeige=trim($Codeanzeige);

mysql_query("INSERT INTO $db_table (Code, Codeanzeige) VALUES ('$Code', '$Codeanzeige')", $verbindung);
$ID=mysql_insert_id();

//Ende Code erzeugen


if ($remote == "") $ip = "<i> no ip </i>";
else $ip = getHostByAddr($remote);
if (!isset($ausgefllt)){ 
?>
      <form name="form1" method="post" action="kontakt.php">
        <table width="450" border="0" cellspacing="2" cellpadding="2" align="center">
		<tr>
		<td class="text">
		<?php 
		if ($IhrText !== "") {
		echo $IhrText."<br><br>" ;}
		?>
		</td>
		</tr>
		</table>
        <table width="450" border="0" cellspacing="2" cellpadding="2" align="center">
          <!--DWLayoutTable-->
          <tr align="center" valign="middle"> 
            <td height="23" colspan="2" class="table2"><?php echo $Website; ?> 
              Kontakt</td>
          </tr>
          <tr> 
            <td width="193" height="24" align="left" valign="middle" class="table1">Ihr 
              Name *</td>
            <td width="300" class="table1"><input name="Name" type="text" class="inputtext" size="40"></td>
          </tr>
          <tr> 
            <td height="24" align="left" valign="middle" class="table1">E-Mail 
              *</td>
            <td class="table1"><input name="Email" type="text" class="inputtext" id="Email" size="40"></td>
          </tr>
          <tr> 
            <td height="24" align="left" valign="middle" class="table1">Straße 
            </td>
            <td valign="top" class="table1"><input name="Strasse" type="text" class="inputtext" id="Strasse" size="40"> 
            </td>
          </tr>
          <tr> 
            <td height="24" align="left" valign="middle" class="table1">PLZ</td>
            <td valign="top" class="table1"><input name="PLZ" type="text" class="inputtext" id="PLZ" size="40"></td>
          </tr>
          <tr> 
            <td height="24" align="left" valign="middle" class="table1">Ort</td>
            <td valign="top" class="table1"><input name="Ort" type="text" class="inputtext" id="Ort" size="40"></td>
          </tr>
          <tr> 
            <td height="24" align="left" valign="middle" class="table1">Land </td>
            <td valign="top" class="table1"><input name="Land" type="text" class="inputtext" id="Land" size="40"></td>
          </tr>
          <tr> 
            <td height="24" align="left" valign="middle" class="table1">Telefon</td>
            <td class="table1"><input name="Telefon" type="text" class="inputtext" id="Telefon" size="40"></td>
          </tr>
          <tr> 
            <td height="24" align="left" valign="middle" class="table1">Fax </td>
            <td valign="top" class="table1"><input name="Fax" type="text" class="inputtext" id="Fax" size="40"></td>
          </tr>
          <tr> 
            <td height="76" align="left" valign="middle" class="table1">Bitte 
              geben Sie hier den dargestellten Sicherheitscode ein! *</td>
            <td valign="top" class="table1"><input name="ID" type="hidden" value="<?php echo$ID; ?>"> 
              <input maxlength="6" name="Codeeingabe" size="6" type="text" class="inputtext2">
              <br> <img border="0" height="50" src="codegrafik.php?ID=<?php echo$ID; ?>" width="200"></td>
          </tr>
          <tr> 
            <td height="154" align="left" valign="top" class="table1">Nachricht 
              *<br> <br>
              Raum für Ihre Mitteilung.<br> </td>
            <td valign="top" class="table1"><textarea name="Nachricht" cols="40" rows="8" class="inputtextarea"></textarea></td>
          </tr>
          <tr> 
            <td height="23" align="right" valign="top" class="table1"><!--DWLayoutEmptyCell-->&nbsp;</td>
            <td class="table1"><input name="kopie" type="checkbox" id="kopie" value="checkbox">
              Mir bitte eine Kopie der Nachricht zusenden.</td>
          </tr>
          <tr> 
            <td height="27" valign="top" class="table1"><!--DWLayoutEmptyCell-->&nbsp;</td>
            <td class="table1"> <input type="submit" class="inputbutton"  value="Absenden"> <input name="ausgefllt" type="hidden" id="ausgefllt" value="1"> 
              <input type="reset" class="inputbutton"  value="Löschen"> <input name="loeschen" type="hidden" id="loeschen" value="1"> 
            </td>
          </tr>
          <tr> 
            <td height="23" valign="top" class="table1"><!--DWLayoutEmptyCell-->&nbsp;</td>
            <td valign="middle" class="table1">* Diese Felder m&uuml;ssen ausgef&uuml;llt 
              sein!</td>
          </tr>
		 
        </table>
      </form>
<?php }
else 
{
//Daten überprüfen
if (empty ($Name)) {  
    die ("<center><table width=\"400\"><p class=\"inputbutton\"><br><center>Geben Sie bitte Ihren Namen ein.</center><br><br>
	<a href=\"javascript:history.go(-1);\" class=\"inputbutton\">
	&nbsp;&nbsp;&nbsp;&laquo;&laquo; zurück&nbsp;&nbsp;&nbsp;</A><br><br></p></table></center>");}
if (empty ($Email)) {  
    die ("<center><table width=\"400\"><p class=\"inputbutton\"><br><center>Geben Sie bitte Ihre Emailadresse ein.</center><br><br>
	<a href=\"javascript:history.go(-1);\" class=\"inputbutton\">
	&nbsp;&nbsp;&nbsp;&laquo;&laquo; zurück&nbsp;&nbsp;&nbsp;</A><br><br></p></table></center>");}
if(!eregi("^[a-z0-9\._-]+@+[a-z0-9\._-]+\.+[a-z]{2,4}$", $Email)) { 
     die("<center><table width=\"400\"><p class=\"inputbutton\"><br><center>Geben Sie bitte eine gültige Emailadresse an.</center><br><br>
	<a href=\"javascript:history.go(-1);\" class=\"inputbutton\">
	&nbsp;&nbsp;&nbsp;&laquo;&laquo; zurück&nbsp;&nbsp;&nbsp;</A><br><br></p></table></center>");}
if (empty ($_REQUEST['Codeeingabe'])) {
    die ("<center><table width=\"400\"><p class=\"inputbutton\"><br><center>Geben Sie bitte den Sicherheitscode ein.</center><br><br>
	<a href=\"javascript:history.go(-1);\" class=\"inputbutton\">
	&nbsp;&nbsp;&nbsp;&laquo;&laquo; zurück&nbsp;&nbsp;&nbsp;</A><br><br></p></table></center>");}

$verbindung = mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name, $verbindung);

$abfrage=mysql_query("SELECT Code FROM $db_table WHERE ID='".$_REQUEST['ID']."'", $verbindung);
$ergebnis=mysql_fetch_object($abfrage);

if(strtolower($ergebnis->Code) !== strtolower($_REQUEST['Codeeingabe']))  {
    die ("<center><table width=\"400\"><p class=\"inputbutton\"><br><center>Der Sicherheitscode wurde falsch eingegeben, bitte wiederholen Sie die Eingabe.</center><br><br>
	<a href=\"javascript:history.go(-1);\" class=\"inputbutton\">
	&nbsp;&nbsp;&nbsp;&laquo;&laquo; zurück&nbsp;&nbsp;&nbsp;</A><br><br></p></table></center>");}
if (empty ($Nachricht)) {
    die ("<center><table width=\"400\"><p class=\"inputbutton\"><br><center>Geben Sie bitte eine Nachricht ein.</center><br><br>
	<a href=\"javascript:history.go(-1);\" class=\"inputbutton\">
	&nbsp;&nbsp;&nbsp;&laquo;&laquo; zurück&nbsp;&nbsp;&nbsp;</A><br><br></p></table></center>");}

	
$Nachricht = stripslashes($Nachricht);
$Nachrichthtml = ereg_replace("\n", "<br>", $Nachricht);
$Telefon = stripslashes($Telefon);
$date = date("d.m.Y H:i:s");		
	echo "
	<p><br><br>
	<center>
	<table width=\"400\"><tr><td class=\"inputtextarea\"  width=\"400\">
	<FONT face=arial size=2>
	Sehr geehrte(r), Frau/Herr <b>$Name</b>, 
	<br><br>
	vielen Dank für Ihre Nachricht!
        Wir werden diese schnellstmöglich bearbeiten.<br><br>
	Freundliche Grüße $IhrName
	<p>
	<FONT face=arial size=2><b>
	<b>Ihre Nachricht:</b><br><br>
	$Nachrichthtml<br><br><br>
	
	<HR NOSHADE SIZE=\"1\" WIDTH=\"400\" ALIGN=\"LEFT\">
	<br><b>
	<a href=\"javascript:history.go(-1);\" class=\"inputbutton\">
	&laquo;&laquo; zurück</A>
		</td></tr></table></center>";
		

// Formulardaten verschicken
$header = "From: $Name <$Email>\n";
$header .= "Reply-To: $Email\n";     
$header .= "Content-Type: text/plain"; 
mail("$IhreMail", "$Website","
Folgende Person hat am $date Uhr, das Kontaktformular von $Website ausgefüllt:
--------------------------------------------------------

Name:       	$Name
Strasse:    	$Strasse
PLZ:        	$PLZ
Ort:    	$Ort
Land:       	$Land
Telefon:    	$Telefon
Fax:        	$Fax
Email:      	$Email
Nachricht:
$Nachricht

$ip
--------------------------------------------------------	
","$header");

//Bestätigungsemail an den Absender
if(isset($kopie))
{
$header1 = "From: $Website <$IhreMail>\n";
$header1 .= "Reply-To: $IhreMail\n";
$header1 .= "Content-Type: text/plain"; 
mail("$Email","Ihre Kontaktaufnahme über $Website", "
Guten Tag, Frau/Herr $Name,\n
vielen Dank für Ihre Nachricht!\n
---------------------------------------------\n
Folgende Daten sind bei uns eingegangen:\n
Ihr Name:	$Name
Ihre Strasse:	$Strasse
Ihre PLZ:	$PLZ
Ihr Ort:	$Ort
Ihr Land:	$Land
Ihr Telefon:	$Telefon
Ihr Fax:	$Fax
Ihre Email:	$Email
Ihre Nachricht:
$Nachricht
---------------------------------------------\n
Wir danken Ihnen für Ihr Interesse und werden uns schnellstmöglich um Ihre Anfrage kümmern.\n

Dies ist eine automatisch vom System generierte Bestätigungs-Email.

Mit freundlichem Gruß
$IhrName

$Website\n\n
","$header1"); 
}
}
?>      
    </td>
  </tr>
</table>
 
Hallo,

laut deinem Server läuft bei dir PHP v5.2.4. Die $HTTP_POST_VARS ist mit PHP 5 entfernt worden (ich denke mal aus Sicherheitsgründen).

Rufe deine Variablen nicht mit extract() ab, sondern so wie es empfohlen wird mit $_POST[], dann sollte es wieder gehen.

Übrigens:
Wenn ich den Sinn und die Funktionsweise von extract() richtig gedeutet habe, könne ich von deiner Seite aus auf jede beliebige Datenbank zugreifen (Wenn es das $HTTP_POST_VARS noch geben würde) :)

// Edit:
Noch ein paar Quellenagaben:
im PHP Handbuch
Warum das extract() in deinem Falle böse ist

Gruß
BK
 
Zuletzt bearbeitet:
Hallo!

Erst mal vielen Dank für Deine Antwort!

Allerdings hätte ich in meinem Beitrag anmerken sollen, dass ich von PHP keinen Dunst habe (das Formular war vorgefertigt :-( ), soll heißen, ich verstehe nur Bahnhof... :(

Könntest Du Deine Antwort mal für einen PHP-Deppen formulieren, bitte?

Nochmals vielen Dank!
 
PHP:
<table width="100%"  border="0" cellspacing="0" cellpadding="0">
  <tr> 
    <td> 
<?php
$Codeeingabe = $_POST['Codeeingabe'];
$Email = $_POST['Email'];
$Fax = $_POST['Fax'];
$ID = $_POST['ID'];
$Land = $_POST['Land'];
$Nachricht = $_POST['Nachricht'];
$Name = $_POST['Name'];
$PLZ = $_POST['PLZ'];
$Ort = $_POST['Ort'];
$Strasse = $_POST['Strasse'];
$Telefon = $_POST['Telefon'];
$ausgefllt = $_POST['ausgefllt'];
$kopie = $_POST['kopie'];
$loeschen = $_POST['loeschen'];

$remote = getenv("REMOTE_ADDR");
$date = date("m.d.Y H:i:s");

// Datenbank leeren wenn mehr als 100 Einträge vorhanden sind und nur die letzen 30 Einträge behalten

$verbindung = mysql_connect($db_host, $db_user, $db_pass);
mysql_select_db($db_name, $verbindung);

...

Quick & Dirty, Angaben ohne Gewähr ;)
So geht es zwar, aber ich würde es so nicht verwenden. Sicherheit ist gleich 0. Vielleicht hat jemand anderes hier mehr Lust als ich und macht es richtig ;)

Gruß
BK
 
Hallo!

Vielen, vielen Dank! Das ist mit Sicherheit schon ein Fortschritt im Vergleich zu unserem früheren System ohne Sicherheitscode...

Über weitere Lösungsvorschläge (mit Sicherheitsfaktor) würde ich mich sehr freuen!

Viele Grüße!
 
Man sollte den input-Filter anwenden
http://ch.php.net/manual/en/filter.constants.php
http://ch.php.net/manual/en/function.filter-input-array.php
http://ch.php.net/manual/en/function.filter-input.php
PHP:
//liste mit allen parametern und deren definition bestimmen
$whitelist= array(
        'Codeeingabe'   =>  FILTER_SANITIZE_STRING,
        'Email'         =>  FILTER_VALIDATE_EMAIL,
        'Fax'    =>  array(
                            'filter' => FILTER_VALIDATE_REGEXP,
                            //TODO: Fax-Nummer-Schame für Regexp genauer defineiren
                            'regexp' => '[[:digit:]]{15}'),
        'ID'     =>  array(
                            'filter' => FILTER_VALIDATE_INT,
                            'options' => array('min_range' => 1, 'max_range' => 1000))
//TODO die weiteren Parameters definieren
);

//Die POST-Parameters abholen und prüfen
$inputs = filter_input_array(INPUT_POST, $whitelist);

//Da nur noch geprüfte Werte vorhanden sind, kann man den extract ausführen 
//oder die Werte einzeln den Variablen zuweisen
extract($inputs);

//Man kann auch jeden Wert einzeln abholen
$land = filter_input(INPUT_POST, 'Land', FILTER_SANITIZE_STRING);

//Beispiel:
echo $Email;
echo $land;
 
Zuletzt bearbeitet:
Zurück