[Thread Prev][Thread Next]   >Date Index >Thread Index

Re: HTML-Formular CGI/DBI in MySQL DB schreiben - Kopfschmerzen

Johannes Plunien - Sun Aug 26 13:39:51 2007


Hallo Stefan,

On Aug 26, 2007, at 1:06 PM, Stefan Bauer wrote:

$user = "dbi";
$passwort = "dbi";
$datenbank = "dbi";
$treiber = "dbi:mysql:" . $datenbank;

Hier fehlt ueberall das 'my ...', was den Fehler 'Global symbol "$user" requires explicit package' verursacht.


      foreach my $Feld (@Feldnamen) {


my $sth = $dbh->prepare('INSERT INTO spieler ($Feld)
VALUES('$cgi->param($Feld)')
                or die "Kann Daten nicht eintragen: " . $dbh->errstr;

$sth->execute;

}

Ich schaetze mal, deine Tabelle Spieler besteht aus mehreren Feldern. Mit dieser Vorgehensweise wuerdest du in dieser Tabelle viele neue Datensaetze erstellen in dem aber jeder Datensatz mit einem anderen Feld gefuellt ist und alle uebrigen Felder leer bleiben. Ich vermute mal, dass dies nicht gerade das ist, was du machen moechtest :-) Desweiteren solltest du dich mal schlau machen, wie prepared statements funktionieren: http://search.cpan.org/~timb/DBI-1.59/ DBI.pm#prepare Damit erleichterst du dir das Leben in zwei Hinsichten: Du musst keine Zeichen mehr escapen und SQL Injections haben auch so gut wie keine Chance mehr.
Zur Erklaerung mal ein kleines Beispiel:

my $sql = "insert into spieler (name, vorname) values ('$name', '$vorname')";

Sieht auf der SQL-Seite korrekt aus, aber nur solange $name bzw. $vorname kein ' enthaelt:

my $name = "'Plunien'";
my $vorname = "Johannes";
my $sql = "insert into spieler (name, vorname) values ('$name', '$vorname')";
print $sql;

=> insert into spieler (name, vorname) values (''Plunien'', 'Johannes')

Und da faellt der SQL Parser dann auf die Nase und meckert :-)
Genau dieses Problem umgeht man mit o.g. prepared statements.


Eine (von vielen) moeglichen Loesungen waere:

[...] $dbh und $cgi vorausgesetzt...

my @fields = qw/vorname name strasse plz ort/;
my $sql = sprintf 'insert into spieler (%s) values (%s?)', join(', ', @fields), '?, ' x int scalar(@fields)-1;
my $params = $cgi->Vars;
my @bind = ();
push @bind, $params->{$_} for @fields;
my $sth = $dbh->prepare($sql);
$sth->execute(@bind);

Gruesse,
Johannes

--
Johannes Plunien | mailto:plu@pqpq.de | http://www.pqpq.de



Next: