marc: cgi und Datenbank

Beitrag lesen

Hallo Helmut, danke für Deine Antwort. Ich hatte Dich zunächst falsch verstanden. Selbstverständlich hatte ich schon versucht, eine Datenbankanbindung zu erreichen. Bisher ohne Erfolg. Aber zunächst zum grundsätzlichen:

  • die Daten sollen in eine Datenbank, da sämtliche Daten später weiter in Datenbankform verarbeitet werden (nicht von mir, sondern von anderen). Eine Textdatei ist also nicht gewünscht.

Ich habe einmal ein ganz einfaches Beispiel erzeugt:

  • html Formular mit nur einem (Pflicht)feld (Kongressgebühr)
  • sql Datenbank auf dem Server (db_test) mit einer Tabelle (test) und einer Tabellenzeile (Kongressgebühr)
  • perlskript, welches Pflichtfeld (Kongressgebühr) in die Datenbankzeile (Kongressgebühr) einfügen soll (die Option der Emailantwort etc habe ich weggelassen).

Eine Fehlermeldung erhalte ich immerhin nicht, wenn ich das ganze auf meinem Server teste, trotzdem enden die Daten nicht in der Tabelle auf dem Server.

Vielleicht kannst Du nochmal das jetzige Skript begutachten. Der relevante teil ist wohl #Datenbank Anbindung. Vielen Dank! marc

Das ganze sieht dann so aus:

#! /usr/local/bin/perl

Ein Perlskript, das Formulareingaben auswertet.

print "Content-type: text/html\n\n";
$mailprog="/usr/lib/sendmail";
%daten=&Eingabe;
%datum=&zeit;
$parameter = &Formateingaben(%daten);

Formularfelder, die angegeben werden müssen (Pflichtfelder)

if (!$daten{'Kongressgebühr'}) { &fehler("Kongressgebühr"); }

Datenbank Anbindung: hier soll versucht werden die Werte des Pflichtfeld 'Kongressgebühr' in eine Datenbank einzulesen.

Die SQL Datenbank ist 'db_test', die relevante Tabelle 'test' und die Zelle 'Kongressgebühr'. Die Eingaben des Nutzers in das html Feld 'Kongressgebühr' sollen also in die Tabelle eingelesen werden.

use CGI;
use DBI;
my $DB_NAME = "db_test";
my $DB_DSN = "DBI:mysql:database=$DB_NAME";
my $DB_USER = "User_test";
my $DB_PASSWD = "Passwort_test";
my $dbh = DBI->connect($DB_DSN, $DB_USER, $DB_PASSWD) or die "Fehler bei Datenbankverbindung: $!";

my $sql = "INSERT INTO test VALUES ('$daten')";
my $sth = $dbh->prepare( $sql ) ||
     die "Kann Statement nicht vorbereiten: $DBI::errstr\n";

$dbh->disconnect;

Rückgabe des HTML-Dokumentes mit Dank zur Anmeldung und Formulardatenauflistung

my (@x)=split(/\n/,$parameter);
foreach $i (@x)
{
($k,$v)=split(/: /,$i);
$str.="<td align=right>$k</td><td align=left>$v</td><tr>\n" if $k;
}

print <<EOF;
<html>
<head>
<title>Kongress</title>
</head>
<body bgcolor=eff3f5>
<table cellpadding="10">
<td>
<font size=3 face=ARIAL>Wir bedanken uns f&uuml;r Ihre Anmeldung.</font><br>
<br>
<table>
<td align=left width="569"><font color=000000 face=ARIAL><font size=+1>Ihr Formular wurde abgeschickt.</font><br>
</table>
<br>
<div align="center">
<font size=3 face=ARIAL>Folgende Daten haben Sie in das Formular eingetragen:<br>
<table width="573" table cellpadding="4" border=1 align="left" bgcolor=#c1ced7>
$str
<tr>
<td> </td>
</tr>
</table>
</body></HTML>

EOF

Hier endet der Hauptteil des Programms. Was folgt, sind die Subroutinen:

sub Formateingaben
{
local (*in) = @_ if @_ == 1;
local (%in) = @_ if @_ > 1;
local ($out, $key, $output);

$output =  "\n\n";
foreach $key (sort keys(%in))
{
  foreach (split("\0", $in{$key}))
  {
   ($out = $_) =~ s/\n/\n/g;
   $output .= "$key: $out\n";
    }
   }
$output .=  "\n";

return $output;
}
sub Eingabe
{
if ($ENV{'QUERY_STRING'})
{
  $daten=$ENV{'QUERY_STRING'};
} else
{ read (STDIN, $daten, $ENV{'CONTENT_LENGTH'}); }
if (@ARGV) { @datensaetze=@ARGV; } else {
@datensaetze = split(/&/, $daten); }
foreach $satz (@datensaetze)
{
  ($name, $wert) = split(/=/, $satz);
  $wert =~ tr/+/ /;
  $wert =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  $wert =~ s/<(([^ >]|\n)*)>//g;
  $name =~ tr/+/ /;
  $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
  chomp $wert;
  $wert=~s/\n/<br>/g;
  $FORM{$name} = $wert;
}
return %FORM;
}

sub fehler
{

Diese Routine gibt eine Fehlermeldung aus, wenn ein wichtiges Formularfeld nicht ausgefüllt wurde

my $fehler_grund=$_[0];
print "<p><center><table border=5>\n";
print "<td bgcolor=#c1ced7 align=center width=440><h1><font color=#ff3060><u></u></font></h1>";
print "<font color=#000000><font size=+1>- Sie haben ein wichtiges Feld nicht ausgefüllt -</font><p>";
print "</table>";
exit;
}

sub zeit

{
local(@z)=localtime;
foreach $i (@z) { if (length($i)<2) { $i="0".$i; } }
local(%azeit);
local($uhr)="$z[2]:$z[1]:$z[0]";
local($monat)=($z[4]+1);
if (length($monat)<2) { $monat="0".$monat; }

$z[5]="19".$z[5];

$z[5]=(1900+$z[5]);
local($datum)="$z[3].$monat.$z[5]";
$azeit{'uhr'}=$uhr;
$azeit{'datum'}=$datum;
return %azeit;
}