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
--
Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.
Hinter den Kulissen passiert viel mehr, als man denkt, aber meistens nicht das, was man denkt.