Tom: TEIL 1: gleichzeitig in die datenbank schreiben

Beitrag lesen

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>&nbsp;</dt>
              <dt>Du bist:</dt>
                <dd><input type="radio" name="geschlecht" value="mannei" id="geschlecht" />
                  M&auml;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 />
                  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                  <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>