TEIL 1:
Hello,
Ich habe Dir hier 'was fertig gemacht.
Vermutlich sind noch genügend Tipp- unf Denkfehlöer drin, dass Du auf jeden fall noch die Chance hast, es beim Debugging selber zu lernen, wie es besser geht :-))
hi ich würde gern mein formular (siehe code) so umbauen dass es automatisch in eine datenbank einträgt.
zur verfügung stehen mit auf meinem server php und myqsl
mein formula sieht bis jetzt so aus
<?php
#> if($_POST)
Diese Abfrage ist in PHP unsinnig, da das "superglobale Array $_POST" im Script
immer vorhanden ist, wenn PHP ordnungsgemäß arbeitet und es der Programmierer
nicht selber zur Laufzeit gelöscht hat
Deshalb nimmt man mit der Prüfung, ob ein POST- oder ein (generischer) GET-Request
vorliegen besser bezug auf das Vorhandensein der Variable für den Submit-Button
Auch, wenn einige Browser das bei Benutzung der Return-Taste in einem Formular
nicht ordentlich machen, ist es immer noch besser, als eine Abfrage auf eine
Variable durchzuführen, die immer vorhanden sein sollte.
Außerdem ist die Art der Abfrage sätestens seit PHP 4.x nicht mehr richtig
Für die Abfrage auf "ist die Vraiable gesetzt?" gibt es die Funktion isset()
http://de2.php.net/manual/de/function.isset.php
{
$strMailtext = "";
#> while(list($strName,$value) = each($_POST))
Die Verwendung von list() und each() ist nicht mehr zeitgemäß
PHP hat die Spezial-"Funktion" (Parser-Konstrukt) foreach() dafür eingeführt
http://de2.php.net/manual/de/control-structures.foreach.php
foreach($_POST as $strName => $value)
{
{
if(is_array($value))
{
foreach($value as $value_array)
Was ja hier auch schon zum Einsatz kommt *g*
{
$strMailtext .= $strName.$strDelimiter.$value_array."\n";
}
}
else
{
$strMailtext .= $strName.$strDelimiter.$value."\n";
}
}
Das ganze obige Konstrukt ist einigermaßen unfertig.
Es berücksichtigt als Array angelegte Variablen nur in der ersten Dimension,
was, wenn man etwas wirklich "universelles" bauen will, nicht konsequent ist.
Außerdem wird der Submit-Button ebenfalls mit in die Mailnachricht aufgenommen
Und die Übermittlung von Anhängen wird überhaupt nicht berücksichtigt
if(get_magic_quotes_gpc())
{
$strMailtext = stripslashes($strMailtext);
}
Magic Quotes sollte man entweder komplett abschalten
http://de2.php.net/magic_quotes
oder bereits am Scriptanfang, dort wo man die Parameter und Daten übernimmt,
zentral beseitigen
Es bietet sich hierfür eine rekursive Funktion an:
##-----------------------------------------------------------------------------
strip backslashes recursive from all values in an array
##-----------------------------------------------------------------------------
function strip($_data)
{
if (!get_magic_quotes_gpc()) ## return original if not escaped
{
return $_data;
}
if (is_array($_data)) ## call itself recursive, if is an array
{
foreach($_data as $key => $val)
{
$data[$key] = strip($val);
}
}
else
{
$_data = stripslashes($_data);
}
return $_data;
}
Examples:
$_POST = strip($_POST);
$_GET = strip($_GET);
#------------------------------------------------------------------------------
Kompatibilitätsproblem:
Wie teilnehmer des Forums erst kürzlich wieder festgestellt haben,
verhält sich die unter Linux meistens eingestzte Mail-Variante leider
sehr eigenwillig. Die eMail wird hier i.d.R. nicht direkt über Port 25
an den smtp-Server gesendet, sondern sie wird dem Script 'sendmail'
übergeben (oder seinem Ersatz), dass die Nachricht dann MIME-gerecht
aufbereitet und an den smtp-Server weitergibt.
Dabei werden alle übergebenen LF in CRLF und alle übergebenen CRLF in CRLFCRLF
umgewandelt. Es empfiehlt sich daher, nur LF (#10) zu übergeben.
if (OS == Linux)
$strMailtext = str_replace(chr(13).chr(10), chr(10), $strMailtext);
mail($strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom)
or die("Die Mail konnte nicht versendet werden.");
if (function_exists('insert_got_mail'))
{
$ok = insert_got_mail('inmail', $strEmpfaenger, $strSubject, $strMailtext, "From: ".$strFrom);
## wenn $ok !== 0 ist, dann Logbucheintag schreiben lassen.
## siehe error_log() http://de2.php.net/manual/en/function.error-log.php
}
die() mit einem einzilgen Text zu verwenden und den User damit
bei einem Fehler "in den Wald" zu stellen, ist sehr unhöflich.
Hier müsste dem die() zumindest eine komplette Fehlerseite mit Rücklink
übergeben werden.
# die ( file_get_contents('path/to/fehlerseite.html'));
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>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>Einfacher PHP-Formmailer</title>
<style type="text/css">
<!--
body,td,th {
color: #CCCCCC;
}
body {
background-color: #343434;
}
-->
</style></head>
<body>
<h1>Anmeldung als AHA Mitglied</h1>
<!-- ## Die Verwendung von PHP_SELF ist ohne weitere Maßnahmen eine Lücke für das
Cross Site Scripting. Mittels eines Links auf das Script kann man das gesamte
Formular entführen und den Verwender somit Daten stehlen. -->
# <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post">
<form action="<?php print $_SERVER['SCRIPT_NAME']; ?>" method="post">
<!-- Hier die eigentlichen Formularfelder eintragen. Die folgenden sind Beispielangaben. -->
<dl>
<dt>Dein Name:</dt>
<dd><input type="text" name="Name" id="Name" />
</dd>
<dt>Deine E-Mail:</dt>
<dd><input type="text" name="E-Mail" /></dd>
<dt> </dt>
<dt>Du bist:</dt>
<dd><input type="radio" name="geschlecht" value="mannei" id="geschlecht" />
Männlich
<input type="radio" name="geschlecht" value="weiwei" id="geschlecht" />
Weiblich</dd>
<dt>Deine Musik </dt>
<dd>
<input type="radio" name="punk" value="ja" id="punk" />
Punk
<input type="radio" name="matler" value="ja" id="matler" />
Metal
<input type="radio" name="rocker" value="ja" id="rocker" />
Rock
<input type="radio" name="pop" value="ja" id="pop" />
Pop</dd>
<dt><br />
Bemerkungen:<br />
<textarea name="Bemerkungen" rows="7" cols="50">Dieser Text wird unter deinem Mitgliednamen angezeigt</textarea>
</dt>
</dl>
<!-- Ende der Beispielangaben -->
<p>
<input type="submit" value="Senden" />
<input type="reset" value="Zurücksetzen" />
</p>
</form>
</body>
</html>