Schrift
[thread]3722[/thread]

nur übergebene Parameter in db eintragen



<< |< 1 2 >| >> 17 Einträge, 2 Seiten
wiel
 2006-09-25 22:27
#34690 #34690
User since
2006-08-08
11 Artikel
BenutzerIn
[default_avatar]
Moinsen,

ich hole mir aus einem Formular eine Menge Parameter und bau dann daraus den SQL-String zusammen Das funzt soweit. Nun wird nicht immer jedes Feld ausgefüllt. Es gibt doch sicher einen eleganteren Weg nur die ausgefüllten Felder an die DB weiterzureichen. Momentan prüfe ich das bei den betreffenden Formularfeldern manuell vorher, weise dann einer Variable einen Defaultwert oder den übergebenen Parameter zu und ersetzte das '$dbh->quote($para...' im SQL-String mit dieser Variable. Funktioniert, bläht mein Script aber unnötig auf und ich hätte in der DB auch lieber den Eintrag 'NULL' als meinen kodierten Pseudowert.

Code: (dl )
1
2
3
4
5
6
7
my %params = $cgi->Vars();
....
my $sql = "insert into recherche (ort, mv_id, mol_id, ...)
values (" $dbh->quote($params{ort}) . ","
. $dbh->quote($params{mv_id}) . ","
. $dbh->quote($params{mol_id}) . ","
. $dbh->quote($params{dgm_id}) . "," ...

Im Kopf habe ich so eine Schleife, die im ersten Teil den Schlüssel und im hinteren Teil des Sql-Strings den Wert einfügt. Bin leider unfähig sowas zu bauen zumal eine Checkbox im HTML-Formular den Wert 'on' übergibt, wenn das Häkchen gesetzt ist und in die DB als boolean konvertiert werden sollte.

MfG
wiel
renee
 2006-09-25 22:35
#34691 #34691
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Undefinierte Werte werden als NULL gespeichert... Du solltest außerdem auch mit der ?-Notation arbeiten.

Probier mal:
Code: (dl )
1
2
3
my $sql = "insert into recherche (ort, mv_id, mol_id, ...) values (?,?,?,?)";
my $sth = $dbh->prepare($sql) or die $dbh->errstr();
$sth->execute(@params{qw/ort mv_id mol_id/}) or die $dbh->errstr();
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
wiel
 2006-09-26 03:52
#34692 #34692
User since
2006-08-08
11 Artikel
BenutzerIn
[default_avatar]
Quote
Undefinierte Werte werden als NULL gespeichert...
Dachte ich auch, klappt bei mir aber nur bei Varchar-Feldern in der DB. Bleibt ein Intiger-Feld frei, mault mich die DB an.
FEHLER: ungültige Eingabesyntax für ganze Zahl: »«
Nur wenn ich es beim Insert gar nicht aufführe, bekomme ich meinen NULL-Wert. (Debian Sarge Postgres 7.4x)
Quote
. Du solltest außerdem auch mit der ?-Notation

wieder was gelernt, habe aber dann immernoch das Problem, daß ich die Übergabeparameter teilweise überarbeiten will, HTML-Checkbox(on) --> SQL(true)

MfG wiel
esskar
 2006-09-26 10:57
#34693 #34693
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
my @all_fields = qw(ort mv_id mol_id);

my @def_fields = ();
foreach (@all_fields) {
  push @def_fields, $_ if defined $params{$_};
}

if (@def_fields) {
  my $sql = "INSERT INTO recherche (" . join(',', @def_fields) . ") VALUES (" . join(',', '?' x scalar @def_fields) . ")";
  my $sth = $dbh->prepare($sql) or die $dbh->errstr();
  $sth->execute(@params{@def_fields}) or die $dbh->errstr();
}  
\n\n

<!--EDIT|esskar|1159253922-->
renee
 2006-09-26 11:00
#34694 #34694
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Doch, geht auch mit Integer-Feldern:

Mein Test:
Code: (dl )
1
2
3
Name           Typ                             NULL?        Default
test_ID int(11) Nein auto_increment
testfeld int(11) Ja NULL


Skript:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/usr/bin/perl

use strict;
use warnings;
use DBI;

my $dbh = DBI->connect("DBI:mysql:dbname:localhost",'user','passwd') or die $DBI::errstr;
my $statement = "INSERT INTO test_tabelle(testfeld) VALUES (?)";

my $sth = $dbh->prepare($statement) or die $dbh->errstr();

$sth->execute(1) or die $dbh->errstr();
$sth->execute(undef) or die $dbh->errstr();

$sth->finish();
$dbh->disconnect();
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
nepos
 2006-09-26 11:14
#34695 #34695
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, ist das entsprechende Integer-Feld wirklich undef oder ist das nur ein leerer String, also ''?
renee
 2006-09-26 11:27
#34696 #34696
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
[quote=esskar,26.09.2006, 08:57]
Code: (dl )
1
2
3
[...]
my $sql = "INSERT INTO recherche (" . join(',', @def_fields) . ") VALUES (" . join(',', '?' x scalar @def_fields) . ")";
[...]
[/quote]
Aus join(',', '?' x scalar @def_fields) sollte join(',', ('?') x scalar @def_fields) werden, da man einen einzelnen String nicht joinen kann.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
topeg
 2006-09-26 11:34
#34697 #34697
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ohne jetzt auf das eigendliche Problem ein zu gehen, will ich dich warnen.
Solche gemerischen SQL-Zugriffe sind ein offenes Toor für Ackerangiffe, aller Art. Wenn du dir nicht absolut sicher bist, wer darauf zugreift, würde ich zu statischen SQL-Abfragen raten, bei denen du über CGI-Schalter die gerade benötigten Abfragen aktivierst.
renee
 2006-09-26 11:40
#34698 #34698
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
eigentlich sollte es keine Probleme geben. Wenn man es so macht wie esskar, dass man die erlaubten Felder benennt und dann das Statement zusammenbaut, passiert nix.

Wenn Du alles statisch machst, musst Du "hunderte" Statements schreiben - für jede mögliche Kombination von ausgefüllten Felder eins!

Und da durch die ?-Notation auch gleichzeitig ein Quoting gemacht wird, ist es recht sicher. Der User kann ja kein Statement komplett selbst festlegen.
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
wiel
 2006-09-26 20:08
#34699 #34699
User since
2006-08-08
11 Artikel
BenutzerIn
[default_avatar]
So, erstmal besten Dank für die Anregungen.
@ renee
Dein Script funktioniert bei mir umgeschrieben auf pg und cgi auch, sowohl von der cmd als auch auch über den apache aufgerufen, allerdings nur solange ich die Integerwerte als undefinierte Variabeln im Skript selber definiere (hu, was für ein deutsch). Hole ich sie mir aus einem Html-Formular und fülle einen zukünftigen Integerwert nicht aus, alles wie gehabt.

Nepos hatte wohl den richtigen Riecher. Ich werde zu dem Zeitpunkt, wenn ich in die db schreiben will, wohl eine leere Stringvariable, aber keine undefinierte Variable haben. Aus dem gleichen Grund könnte ich mir erklären, warum esskars Ansatz auch nur klappt, wenn ich alle Felder im Formular mit Werten bestücke. Laß ich eins aus:
FEHLER: ungültige Eingabesyntax für ganze Zahl: »«

Habe heute auch schon mit Sachen wie
Code: (dl )
$sth->bind_param(3, $value, { TYPE => SQL_INTEGER });
rumprobiert, aber entweder benutze ich es mit falschen Syntax oder es bringt auch nichts. Ich werde wohl alle Felder in der Db als varchar deklarieren und mit sql die Typenkonvertierung vornehmen.
Eine Idee habe ich noch, kann das falsch sein? Ich wüßte aber nicht, als was man ein Eingabefeld im HTML-Formular sonst (außer Text) deklarieren sollte. Die Werte stammen aus vergleichbaren Feldern.
Code: (dl )
<INPUT size=13 type="TEXT" ID="mol_id" NAME="mol_id" >(MoleID)
\n\n

<!--EDIT|wiel|1159286935-->
<< |< 1 2 >| >> 17 Einträge, 2 Seiten



View all threads created 2006-09-25 22:27.