MySQL - Spaltenausgabe verbessern

G

GrU3nL!nG

Gast
Hi,

ich habe folgenden Code:
PHP:
$query = mysql_query("SHOW COLUMNS FROM rights");
        while( $data = mysql_fetch_assoc($query) )
        {
            echo $data['Field'].'<br/>';
        }

Das gibt mir zeilenweise die spalten-typen aus, also:
rechte_id
rechte_name
rechte_beschreibung
recht_1
recht_2
recht_3
.
.
.

Nun möchte ich aber, dass er mmir NICHT rechte_id, rechte_name, rechte_beschreibung mit ausgibt, sondern erst bei recht_1 beginnt.

Was muss ich an meiner Abfrage ändern?
 
Hi,

ich bin mir jetzt nicht sicher ob man da was mit ORDER BY o.ä. machen kann, aber alternativ könntest Du das mit einer Sortierung im Array machen.
 
Hi.

ich behaupte jetzt einfach mal, dass die Tatsache, dass du "recht_x" hast, draus hinweißt, dass das keine relational Datenbankstruktur ist. (3. Normalenform). Deswegen hast du erst das Problem!

Verstehe auch nicht wirklich wozu das gut sein sollte, hab dementsprechend auch keine Lösung.

Wenn du dein Datenbankmodel bis zur 3. Normalenform ableitetest und somit die recht_X auflöst, dann hast du das Problem nicht mehr und alles ist so wie es sein sollte :)

Verstehst du was ich meine?

Gruß,
Nox
 
Vielleicht hilft das:

also hier mal ein beispiel meiner tabelle "rights":
right_id | right_name | description | can_add_news | can_delete_news | ....

wegen der 3.normalform: ich habe doch nichts, was sich wiederholt, oder was doppelt in der tabelle ist?
Es sind ja immer andere rechte, "darf user sehen" und keine ahnung was noch ;)

ich habe es nun so gelöst:
PHP:
<?php
$query = mysql_query("SHOW COLUMNS FROM rights");
while( $data = mysql_fetch_assoc($query) )
{
    if(($data['Field']!="right_id") AND ($data['Field']!="right_name") AND ($data['Field']!="description"))
    {
        echo $data['Field'].'<br/>';
    }
}
?>

Und meine Frage war, ob ich da bei der Ausgabe dies etwas anders machen kann, sprich die query verändern...
Wenn ich zumbeispiel daten auslese und mache ORDER BY name oder so, dann kann ich ja sagen von wo bis wo er aus lesen soll.
Nur hier kann ich ja kein ORDER BY einbauen...?
 
Also für den Fall das du die META-Daten der Tabelle sortieren willst, bietet es sich an die INFORMATION_SCHEMA zu nutzen, einmal vorausgesetzt deine MySQL-Version ist hinreichend neu. Hauptvorteil: Die META-Tabellen verhalten sich genauso wie eine normale Tabelle auch. Eine Abfrage sähe dann z.B. so aus:
Code:
SELECT
    TABLE_CATALOG, --bei mysql immer NULL bei allen anderen ANSI-DBMS steht hier der DB-Name!
    TABLE_SCHEMA, --hier benutzt mysql den namen der DB, normal ist dies das Schema
    TABLE_NAME, 	
    COLUMN_NAME

FROM
    INFORMATION_SCHEMA.COLUMNS

WHERE
    TABLE_NAME = 'rights' AND
    COLUMN_NAME NOT IN ( 'right_id', 'right_name', 'description' )
Vorteil dieser Methode ist Unabhängigkeit des DBMS, die Queries sind also meistens sehr portabel und kannst sortieren wie du möchtest.


edit:
BTW. die Struktur right_id | right_name | description | can_add_news | can_delete_news | .... sieht in der Tat sehr merkwürdig aus, was machst du da genau? Sieht aus als würdest du verschiedene Rechtevergaben unter einem Regelnamen zusammenfassen. Wenn dem so sein sollte, ist der Tabellenname "rights" ungünstig gewählt (nebenbei werden Tabellennamen normalerweise immer im Singular bezeichnet, also wenn dann "Right")
 
Zuletzt bearbeitet:
ag3nt schrieb:
BTW. die Struktur right_id | right_name | description | can_add_news | can_delete_news | .... sieht in der Tat sehr merkwürdig aus, was machst du da genau? Sieht aus als würdest du verschiedene Rechtevergaben unter einem Regelnamen zusammenfassen. Wenn dem so sein sollte, ist der Tabellenname "rights" ungünstig gewählt (nebenbei werden Tabellennamen normalerweise immer im Singular bezeichnet, also wenn dann "Right")


Dem kann ich mich nur anschließen.
Und wegen 3. Normalenform, du wiederholst die Rechte :), ja ich weiss, hört sich komisch an, aber ich denke der Fehler liegt in dem Mix aus Rollen und Rechte in einer Tabelle.

Es sollte eigentlich folgende Tabellen geben:

Role: (Alle verfügbaren Rollen)
ro_id
ro_name (z.b. Admin, Member, Moderator)


Right: (Alle zuweisebaren Rechte)
ri_id
ri_name (eben deine can_add_news, can_delete_news, etc)

role_right: (Die n:m Verbindung zwischen Rollen und Rechten)
rr_ri_id
rr_ro_id


user_role: (Die n:m Verbindung zwischen dem User und seinen Rolle)
ur_ro_id
ur_us_id (user id)


Schon oder? :)
 
Zurück
Oben