enum-optionen => perl
am 18.03.2007 11:26:37 von Patrick Bates
hallo!
ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
machen.
hab dazu nix gefunden im netz und bitte um tipps, vor allem, wie sich die
enum-optionen auslesen lassen.
greets
-/--\-
alex
Re: enum-optionen => perl
am 18.03.2007 11:52:34 von Christian Winter
Alexander Kainz schrieb:
> ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
> machen.
>
> hab dazu nix gefunden im netz und bitte um tipps, vor allem, wie sich die
> enum-optionen auslesen lassen.
Deine Angaben sind ein wenig dürftig. Welche enums?
Falls Du mögliche Werte für ein MySQL-Enum-Feld meinst, dann
sollte Dir
SELECT COLUMNS FROM [TABELLENNAME] LIKE '[SPALTENNAME]';
helfen. Aus dem Rückgabe-Record brauchst Du dann das "Type"-Feld,
das etwa wie
enum('WERTA','WERTB','WERTC')
aussieht.
Mit einem kleinen Trick kannst Du sogar Perl das Parsen überlassen:
my @werte = eval $row->{"Type"};
sub enum {
return @_
}
-Christian
Re: enum-optionen => perl
am 18.03.2007 14:14:49 von Mirco Wahab
Alexander Kainz wrote:
> hallo!
>
> ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
> machen.
>
> hab dazu nix gefunden im netz und bitte um tipps, vor allem, wie sich die
> enum-optionen auslesen lassen.
>
Ich rate mal was Du machen willst.
Letztens habe ich sowas mal übungs-
weise probiert (selbst MySQL-Anfänger).
Vielleicht kann mir auch jemand sagen, wie
das mit MySQL-Boardmitteln (5.0.x) besser
zu realisieren wäre.
Viele Grüße
M.
(Du wirst Dich schon durchfitzeln) ==>
use strict;
use warnings;
use Sys::Hostname;
use DBI;
my $dbhost = $^O=~/win/i ? 'fremderserver' : hostname();
my $dbname = 'meinedatenbank';
my %enums;
retrieve_enums($dbname, $dbhost, 'sqluser', 'sqlpasswd', \%enums);
print "[$dbname] $_ ==> $enums{$_}\n" for sort keys %enums;
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
sub retrieve_enums
{
my ($dbn, $server, $usr, $pw, $rh) = @_;
my $dbh = DBI->connect("dbi:mysql:$dbn:$server", $usr, $pw) || die "$DBI::errstr $!";
my (@tablenames, $sth);
$sth = $dbh->prepare('SHOW TABLES') or die "prepare failed:" . $dbh->errstr . "\n";
$sth->execute() or die "execute failed:" . $dbh->errstr . "\n";
while(my @stuff = $sth->fetchrow) { push @tablenames, $stuff[0] }
$sth->finish();
for( @tablenames ) {
$sth = $dbh->prepare("SHOW COLUMNS FROM $_") or die "prepare failed:" . $dbh->errstr . "\n";
$sth->execute() or die "execute failed:" . $dbh->errstr . "\n";
while( my @stuff = $sth->fetchrow_array ) {
$rh->{"$_.$stuff[0]"} = join '|', split /,/, $1 if $stuff[1] =~ /enum\(([^\)]+)/
}
$sth->finish();
}
$dbh->disconnect or warn "Disconnection failed: $DBI::errstr\n";
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
Re: enum-optionen => perl
am 18.03.2007 16:34:39 von Patrick Bates
"Mirco Wahab" schrieb im Newsbeitrag
news:etjecf$k21$1@mlucom4.urz.uni-halle.de...
> Ich rate mal was Du machen willst.
> Letztens habe ich sowas mal übungs-
> weise probiert (selbst MySQL-Anfänger).
>
> Vielleicht kann mir auch jemand sagen, wie
> das mit MySQL-Boardmitteln (5.0.x) besser
> zu realisieren wäre.
>
> Viele Grüße
>
> M.
hello!
ich hab das jetzt etwa so gelöst:
my @enum_select = &enum_set("TABELLE","TABELLENFELD");
sub enum_set {
my $sql_anw = "SHOW COLUMNS from $_[0] LIKE '$_[1]'";
$sth = $dbh->prepare($sql_anw);
my $enum_set = $dbh->selectrow_hashref($sql_anw);
my $enum = $enum_set->{Type};
$enum =~ s/enum//gi; # enum entfernen
$enum =~ s/\(|\)//gi; # klammern entfernen
$enum =~ s/\'//gi; # anführungszeichen entfernen
my @enum_data = split(/,/,$enum);
return @enum_data
}
greets
-/--\-
alex
Re: enum-optionen => perl
am 18.03.2007 17:09:36 von Christian Winter
Alexander Kainz schrieb:
> "Mirco Wahab" schrieb im Newsbeitrag
> news:etjecf$k21$1@mlucom4.urz.uni-halle.de...
>> Ich rate mal was Du machen willst.
>> Letztens habe ich sowas mal übungs-
>> weise probiert (selbst MySQL-Anfänger).
>>
>> Vielleicht kann mir auch jemand sagen, wie
>> das mit MySQL-Boardmitteln (5.0.x) besser
>> zu realisieren wäre.
>>
>> Viele Grüße
>>
>> M.
>
> hello!
>
> ich hab das jetzt etwa so gelöst:
>
> my @enum_select = &enum_set("TABELLE","TABELLENFELD");
Lass das "&" hier weg, es würde nur Sinn machen, wenn Du explizit
eine Prototyp-Deklaration übergehen wolltest.
> sub enum_set {
> my $sql_anw = "SHOW COLUMNS from $_[0] LIKE '$_[1]'";
> $sth = $dbh->prepare($sql_anw);
>
> my $enum_set = $dbh->selectrow_hashref($sql_anw);
> my $enum = $enum_set->{Type};
> $enum =~ s/enum//gi; # enum entfernen
$enum = substr( $enum, 4 );
ist schneller.
> $enum =~ s/\(|\)//gi; # klammern entfernen
$enum = tr/()//d;
ist ebenfalls schneller und auch besser lesbar. Der "i"-Modifier
ist unnötig.
> $enum =~ s/\'//gi; # anführungszeichen entfernen
$enum =~ s/(?
portabler, da escapede Anführungszeichen drin gelassen werden. Das
Hochkomma muss nicht escaped werden. "i" ist wieder überflüssig.
> my @enum_data = split(/,/,$enum);
>
> return @enum_data
> }
Oder kürzer:
sub get_enum {
return eval
$dbh->selectrow_hashref(
"SHOW COLUMNS FROM $_[0] LIKE '$_[1]'"
)->{"Type"};
}
sub enum {
return @_;
}
Das hat natürlich seine Einschränkungen, wenn dritte Schreibzugriff
auf die Datenbank haben, ist das eval vielleicht kein so guter
Einfall.
Ansonsten ließe sich das ganze auch mit weniger Schritten parsen:
sub get_enum
{
my $enum = $dbh->selectrow_hashref(
"SHOW COLUMNS FROM $_[0] LIKE '$_[1]'"
)->{"Type"};
return $enum =~ /^enum\('(.*)'\)$/ ? split(/','/, $1) : ();
}
-Christian
Re: enum-optionen => perl
am 19.03.2007 16:58:22 von Michael Panteleit
"Alexander Kainz" writes:
> ich sollte die enum-optionen mit perl auslesen und ein html-select daraus
> machen.
Da gibt's schöne Module für:
MySQL::TableInfo
CGI
Das sieht dann im Endeffekt so aus (Kopie aus perldoc MySQL::TableInfo)
use CGI;
use DBI;
use MySQL::TableInfo;
my $CGI = new CGI:
my $dbh = DBI->connect(....);
my $table = new MySQL::TableInfo($dbh, "bio");
print $CGI->header,
$CGI->start_html("MySQL::TableInfo"),
$CGI->start_form,
$CGI->div("Do you have beard?"),
$CGI->popup_menu(-name=>'has_beard',
-values=>[$table->enum('has_beard')],
-default=>$table->default('has_beard')),
$CGI->end_form,
$CGI->end_html;
Gruß,
Meikel
Re: enum-optionen => perl
am 19.03.2007 19:11:03 von Patrick Bates
> Ansonsten ließe sich das ganze auch mit weniger Schritten parsen:
>
> sub get_enum
> {
> my $enum = $dbh->selectrow_hashref(
> "SHOW COLUMNS FROM $_[0] LIKE '$_[1]'"
> )->{"Type"};
>
> return $enum =~ /^enum\('(.*)'\)$/ ? split(/','/, $1) : ();
> }
>
> -Christian
danke!
ich habe selten in so kurzer zeit so viel gelernt!
greets
-/--\-
alex