Siechfred: (Perl DBI) Where-Klausel global setzen

Beitrag lesen

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?

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.