Schrift
[thread]10407[/thread]

MySQL: Spaltennamen auslesen?

Leser: 3


<< >> 10 Einträge, 1 Seite
pixelflat
 2007-09-17 17:34
#99565 #99565
User since
2007-09-13
15 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich möchte gerne die Spaltennamen einer Tabelle in einer MySQL-Datenbank auslesen.
Dabei brauche ich die Reihenfolge genau so, wie man sie zB im Query Browser sieht.

Bisher mache ich das so:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
    $sql = "SELECT * FROM Tabelle";
$sth = $dbh->prepare( $sql ) or die $dbh->errstr;
$sth->execute();

$erg=$sth->fetchrow_hashref;


while (($element,)=each(%$erg))
{
print "$element\n";
}


Damit bekomme ich die Namen der Spalten, allerdings in falscher Reihenfolge. Die Spaltennamen sind nicht alphabetisch, deshalb kann ich es auch nicht nachträglich sortieren...
renee
 2007-09-17 17:50
#99569 #99569
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Schau mal, ob Du was mit "column_info" von CPAN:DBI anfangen kannst...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
pixelflat
 2007-09-17 17:56
#99570 #99570
User since
2007-09-13
15 Artikel
BenutzerIn
[default_avatar]
Danke, da muss ich mich aber erst mal einlesen.

Mal schaun ob ichs hin krieg...
sid burn
 2007-09-17 18:41
#99571 #99571
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
Schau mal unter perldoc DBI unter "Statement Handle Attributes". Dort hat ein Statement das Attribut "NAMES" was eine Arrayref auf die Spaltennamen zurück gibt, so wie du es abgefragt hast. Übrigens sollte man deswegen auch kein "SELECT *" benutzen sondern gleich alle Parameter angeben im SQL. Macht weniger Probleme.


Code: (dl )
1
2
3
4
5
6
7
8
9
mysql> select * from faq;
+----+-------+----------------------------------------+-------------------------------------------------------------+-------------------+----------------+
| id | title | question | answer | show_themenordner | feeds_ratgeber |
+----+-------+----------------------------------------+-------------------------------------------------------------+-------------------+----------------+
| 1 | | Welche Frameworks gibt es? | CGI::Application, Catalyst, Jiffty | 1 | 0 |
| 2 | | Wie verbindet man sich zu Datenbanken? | Mit dem DBI Modul! | 1 | 0 |
| 3 | | Welche Sigils gibt es? | Für Skalare ein $. Für Arrays ein @ und für Hashes ein % | 1 | 0 |
+----+-------+----------------------------------------+-------------------------------------------------------------+-------------------+----------------+
3 rows in set (0.00 sec)


dbi_name.pl
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/usr/bin/perl
use strict;
use warnings;
use DBI;

my $db_user    = 'root';
my $db_passwd  = '';
my $db_options = { RaiseError => 1, AutoCommit => 1 };

my $dbh = DBI->connect('dbi:mysql:database=faq', $db_user, $db_passwd, $db_options)
    or  die DBI::errstr;

my $sth = $dbh->prepare( 'SELECT * FROM faq' );
$sth->execute();

my $num_of_fields = $sth->{NUM_OF_FIELDS} - 1;
my $names         = $sth->{NAME};

while ( my $row = $sth->fetchrow_arrayref ) {
    for my $i ( 0 .. $num_of_fields ) {
        print $names->[$i], ' => ', $row->[$i], "\n";
    }
    print "\n";
}

$dbh->disconnect;


Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
sidburn@sid:~/perl$ ./dbi_name.pl
id => 1
title =>
question => Welche Frameworks gibt es?
answer => CGI::Application, Catalyst, Jiffty
show_themenordner => 1
feeds_ratgeber => 0

id => 2
title =>
question => Wie verbindet man sich zu Datenbanken?
answer => Mit dem DBI Modul!
show_themenordner => 1
feeds_ratgeber => 0

id => 3
title =>
question => Welche Sigils gibt es?
answer => Für Skalare ein $. Für Arrays ein @ und für Hashes ein %
show_themenordner => 1
feeds_ratgeber => 0
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
pixelflat
 2007-09-18 09:20
#99583 #99583
User since
2007-09-13
15 Artikel
BenutzerIn
[default_avatar]
Einwandfrei. Danke vielmals...

//edit
Quote
Übrigens sollte man deswegen auch kein "SELECT *" benutzen sondern gleich alle Parameter angeben im SQL. Macht weniger Probleme.


Meinst du damit, in dem SQL Befehl anstatt * alle Spaltennamen angeben?
nepos
 2007-09-18 10:14
#99584 #99584
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Ja, damit wird klar, welche und in welcher Reihenfolge du die Spalten aus der DB holen willst.
SELECT * ist immer böse. Stell dir vor, du änderst was an der DB und die Spaltenreihenfolge ändert sich. Dann musst du den ganzen Code durchsuchen und anpassen.
Struppi
 2007-09-18 13:51
#99592 #99592
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
oder hash_ref verwenden.
pixelflat
 2007-09-18 14:58
#99594 #99594
User since
2007-09-13
15 Artikel
BenutzerIn
[default_avatar]
Naja, die Reihenfolge oder Anzahl weiss ich ja nicht. Das Script soll ja bei jeder beliebigen Tabelle funktionieren.

Mittlerweile habe ich es gelöst. Es werden zuerst alle Spaltennamen ausgelesen, danach der SQL-Befehl (anhand der Namen) erzeugt. So muss ich nicht Select * verwenden und hab trotzdem alle. xD

Danke nochmal an Sid Burn
sid burn
 2007-09-18 15:46
#99600 #99600
User since
2006-03-29
1520 Artikel
BenutzerIn

user image
@pixelflat
Also wenn du einfach ein "select *" auf jede Tabelle anwendest und du nicht weißt wie die Tabelle ausschaut dann kannst das ganze natürlich so lassen. Also "select *" und die Namen dann über $sth->{NAME} auslesen.

Spricht dann meiner Seite nichts dagegen.
Nicht mehr aktiv. Bei Kontakt: ICQ: 404181669 E-Mail: perl@david-raab.de
Struppi
 2007-09-19 03:33
#99636 #99636
User since
2006-02-17
628 Artikel
BenutzerIn
[Homepage]
user image
Das klingt für mich kompliziert, in den meisten Fällen dürfte hash_ref einfacher sein, vor allem wenn man noch eine extra Abfrage machen muss um die Feldnamen rauszufinden.
<< >> 10 Einträge, 1 Seite



View all threads created 2007-09-17 17:34.