enum-optionen => perl

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
Patrick Bates [ So, 18 März 2007 11:26 ] [ ID #1661272 ]

Re: enum-optionen => perl

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 [at] werte = eval $row->{"Type"};
sub enum {
return [at] _
}

-Christian
Christian Winter [ So, 18 März 2007 11:52 ] [ ID #1661273 ]

Re: enum-optionen => perl

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) = [at] _;
my $dbh = DBI->connect("dbi:mysql:$dbn:$server", $usr, $pw) || die "$DBI::errstr $!";
my ( [at] 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 [at] stuff = $sth->fetchrow) { push [at] tablenames, $stuff[0] }
$sth->finish();

for( [at] 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 [at] 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";
}
# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #
Mirco Wahab [ So, 18 März 2007 14:14 ] [ ID #1661275 ]

Re: enum-optionen => perl

"Mirco Wahab" <wahab-mail [at] gmx.de> schrieb im Newsbeitrag
news:etjecf$k21$1 [at] 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 [at] 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 [at] enum_data = split(/,/,$enum);

return [at] enum_data
}


greets
-/--\-
alex
Patrick Bates [ So, 18 März 2007 16:34 ] [ ID #1661284 ]

Re: enum-optionen => perl

Alexander Kainz schrieb:
> "Mirco Wahab" <wahab-mail [at] gmx.de> schrieb im Newsbeitrag
> news:etjecf$k21$1 [at] 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 [at] 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/(?<!\\)'//g;

portabler, da escapede Anführungszeichen drin gelassen werden. Das
Hochkomma muss nicht escaped werden. "i" ist wieder überflüssig.

> my [at] enum_data = split(/,/,$enum);
>
> return [at] enum_data
> }

Oder kürzer:

sub get_enum {
return eval
$dbh->selectrow_hashref(
"SHOW COLUMNS FROM $_[0] LIKE '$_[1]'"
)->{"Type"};
}

sub enum {
return [at] _;
}

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
Christian Winter [ So, 18 März 2007 17:09 ] [ ID #1661287 ]

Re: enum-optionen => perl

"Alexander Kainz" <nomail [at] spam.com> 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
Michael Panteleit [ Mo, 19 März 2007 16:58 ] [ ID #1662313 ]

Re: enum-optionen => perl

> 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
Patrick Bates [ Mo, 19 März 2007 19:11 ] [ ID #1662314 ]
Perl » de.comp.lang.perl.misc » enum-optionen => perl

Vorheriges Thema: do und eval Blöcke
Nächstes Thema: Dynamic Loading