[
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:
- Re: HTML-Formular CGI/DBI in MySQL DB schreiben - Kopfschmerzen, (continued)
- [no subject],
renee . baecker