(Perl DBI) Where-Klausel global setzen
Horst
- datenbank
Hallo,
gestern abend, Problem: In einem Script gibt es einige SQL-Statements in welche eine zusätzliche WHERE-Klausel eingebaut werden sollten. Auch Statements, in denen es bereits eine Where-Kls gibt.
Gute Programmierer haben ja _alle_ Statements weiter oben als $sth_x, $sth_y usw. vordefiniert und müssen bei Änderungen nicht erst alle zusammensuchen... seufz.
Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
SELECT name, vname FROM adressen
automatisch ein
SELECT name, vname FROM adressen WHERE visible=1
wird?
Und die auch:
SELECT name, vname FROM adressen WHERE lfdnr=33
SELECT name, vname FROM adressen WHERE lfdnr=33 AND visible=1
Viele Grüße,
Hotte
Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
SELECT name, vname FROM adressenautomatisch ein
SELECT name, vname FROM adressen WHERE visible=1wird?
Nein.
Struppi.
Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
SELECT name, vname FROM adressenautomatisch ein
SELECT name, vname FROM adressen WHERE visible=1wird?
Ich löse das über eine eigene Subroutine, evtl. wäre das ein Denkanstoß:
# Syntax: getResults([spaltennamen], [Where], {And}, Sortierspalte)
sub getDBResults(@$@$%$$) {
my $fields = join ',', @{$_[0]};
my $stm = 'SELECT '.$fields.' FROM tabelle';
my (@p,$i);
$stm .= ' WHERE ' . $_[1]->[0] . '=?' if( defined $_[1] );
if( defined $_[2] ) {
while( my($k,$v) = each %{$_[2]} ) {
$stm .= ' AND ' . $k . '=?';
push @p, $v;
}
}
$stm .= ' ORDER BY '.$_[3].' DESC' if defined $_[3];
my $dbh = DBI->connect(...) || error('Connecting to database failed', $DBI::errstr);
my $sth = $dbh->prepare($stm)|| error('Preparing statement ' . uc($stm).' failed: ', $DBI::errstr);
$sth->bind_param(1, $_[1]->[0]) if defined $_[1];
$i = 2;
foreach my $p(@p) {
$sth->bind_param($i, $p);
}
$sth->execute || error('Executing statement failed: '.$stm, $DBI::errstr);
my $rows = $sth->rows;
}
Damit bekomme ich so ziemlich jede SELECT-Abfrage hin, die ich in meinem Anwendungsfall brauche. Ansonsten gilt das, was Struppi sagte.
Siechfred
Frage: Gibt es die Möglichkeit, eine WHERE-Klausel global so zu setzen, dass z.B. aus einem
SELECT name, vname FROM adressenautomatisch ein
SELECT name, vname FROM adressen WHERE visible=1wird?
Ich löse das über eine eigene Subroutine, evtl. wäre das ein Denkanstoß:
Isses! Cool!
Vielen Dank und Grüße,
Hotte