Automatisch mehrere Tabellen abfragen

Hallo,
ich habe mehrere Konfig-Tabellen:
Laender
Orte
Fahrzeuge usw.
Im Frontend kann der User via Drop-Down die entsprechenden Einträge wählen.
Nun möchte ich eine Verwaltungsseite erstellen.
Meine Idee:
Ein Array mit $tabellenarray=array(„orte“,„laender“,„fahrzeuge“);
foreach($tabellenarray as $wert)
{
$sql = "select * from ".$wert;
$ms=mysql_query($sql);
$spaltenarray[??]=???;
}

Und genau da hake ich. Die Spalten sind natürlich auch unterschiedlich. Ebenso die Anzahl…

Irgendwie müsste man sowas doch auch über nen Array machen können udn dann einfach das Array durchlaufen. Oder über ne Zählvariable und ne for-Schleife…
Habe nun show columns gefunden. Aber da hake ich an der Reihenfolge. Der gibt mrnur den Wert des ersten Feldes aus und durchläuft nicht das Spaltennamenarray:

    $sql_spaltenzeigen=sprintf(„show columns from %s“,mysql_real_escape_string($wert));
      echo $sql_ausgabe."<br>";  
        $ms_spaltenanzeigen=mysql_query($sql_spaltenzeigen);
        $ms_ausgabe=mysql_query($sql_ausgabe);                                             
    $feldnamen = array();
$i = 0;
if($ms_spaltenanzeigen != false)
{
while($liste = mysql_fetch_row($ms_spaltenanzeigen))
{
$feldnamen[$i] = $liste[0];
$i++;
}
 }
else die(‚Fehler bei der Datenbankabfrage‘);
   
    foreach($feldnamen as $anzeigenxxx)
    {
    while($ausgabexxx=mysql_fetch_assoc($ms_ausgabe))
 {
 echo „<br>“.$anzeigenxxx.": ".$ausgabexxx[$anzeigenxxx];
    }

Any idea?
Danke für Anregungen!
Oliver

ich habe mehrere Konfig-Tabellen:
Laender
Orte
Fahrzeuge usw.
Im Frontend kann der User via Drop-Down die entsprechenden
Einträge wählen.
Nun möchte ich eine Verwaltungsseite erstellen.

in PHP? Warum fragst du dann nicht im PHP-Brett?

Meine Idee:
Ein Array mit
$tabellenarray=array(„orte“,„laender“,„fahrzeuge“);
foreach($tabellenarray as $wert)
{
$sql = "select * from ".$wert;
$ms=mysql_query($sql);
$spaltenarray[??]=???;
}

Und genau da hake ich. Die Spalten sind natürlich auch
unterschiedlich. Ebenso die Anzahl…

Ich fasse zusammen. Du hast unterschiedliche Tabellen mit unterschiedlichen Spaltennamen und unterschiedlichen Informationen und willst sie trotzdem im gleichen foreach behandeln?

Sowas macht doch nur dann Sinn, wenn die Namen der Tabellen unbekannt sind oder sich deren Anzahl häufig ändert. Wenn du genau weißt, dass es nur 3 Tabellen sind, warum machst du dann nicht je Tabelle eine spezifische Behandlung?

Okay, aber um mal deine Frage zu beantworten.

Irgendwie müsste man sowas doch auch über nen Array machen
können udn dann einfach das Array durchlaufen.

na klar (hab das jetzt nicht getestet, also keine gewähr)

$tabellenarray=array("orte","laender","fahrzeuge");
$data=array();
foreach($tabellenarray as $tableName)
{
 $sql = "select \* from ".$tableName;
 $result=mysql\_query($sql);

 //hole zeilenweise die Daten als assoziatives Array 
 while ($row = mysql\_fetch\_assoc($result)) 
 {

 //speicher das in ein neues gemeinsames assoziatives Array, indem du über den Key auf die 
 //Values zugreifen kannst
 $data[$tableName][]=$row;

 }
}

Aber das wird dir nichts nutzen, weil du damit dein Problem nur einen Schritt nach hinten schiebst, weil du ja jetzt diese wirre Struktur auflösen musst. Und das ist jetzt nicht leichter als vorher.

Any idea?

ja, mach das nicht so, da blickst du in einem halben Jahr nie wieder durch. Wenn es wirklich Konfigdaten sind, dann schaffe dir eine generische Struktur für alle Möglichkeiten, etwa

ID|type |setting |value
--|---------|--------|-----------
1 |Laender |Name |Deutschland 
2 |Fahrzeuge|Marke |VW 

Bitte dann noch normalisieren, das ist nur zur Verdeutlichung.

Wenn du das hast, dann kannst du auch generisch damit umgehen, weil du dann nämlich sicher weißt, welche Information in welcher Spalte steckt.

Aber wenn sich das nicht vereinheitlichen lässt, dann würde ich lieber je Tabelle spezifische Oberflächen generieren. Dann kannst du nämlich auch spezifische Prüfungen auf Eingabefehler oder sonstwas machen.

Günther

Stern? Bitte gern.

Hi,
also warum nicht ans php Brett? Weil showcolumns (habe ich mittlerweile rausgefunden) ein mysql Befehl ist. :wink:

Und die Idee oben funktioniert uu.
Aber bei Land gibts Name und id. Bei fahrzeuge name, id, leistung,hersteller,…
Herstelle rbei Land ist doch sinnfrei.

Ich habe es nun zT lösen können:
Die Spaltennamen in ein Array. Das Array mit foreach druchlaufen und per sql Abgefragt:

$sql_spaltenzeigen=sprintf(„show columns from %s“,mysql_real_escape_string($wert));
// echo $sql_ausgabe."
„;
// echo $sql_spaltenzeigen.“
";
$ms_spaltenanzeigen=mysql_query($sql_spaltenzeigen);

$feldnamen = array();

if($ms_spaltenanzeigen != false)
{
while($liste = mysql_fetch_row($ms_spaltenanzeigen))
{

$feldnamen[$i] = $liste[0];

$i++;
}
}
else die(‚Fehler bei der Datenbankabfrage‘);
//echo "
Größe".count($feldnamen);
foreach($feldnamen as $werte)
{

$sql_ausgabe=sprintf(„select * from %s“,mysql_real_escape_string($wert));
//echo $sql_ausgabe;
$ms_ausgabe=mysql_query($sql_ausgabe);
while($ausgabe_werte=mysql_fetch_assoc($ms_ausgabe))

Problem nun nur noch dass alles transponiert rauskommt. Also statt
id, name,typ, hersteller
1,Bon Jovi, Mondeo,ford
2, 3,Golf,VW

id 1,id 2,id 3,id 4,
name Bon Jovi,3, GFunart
hersteller ford, hersteller mercedes,hersteller,vw…

Die Idee ist halt, dass man irgendwann mal eine weitere Tabelle hinzu packt und dann nur den Namen ins Array packen muss oder sogar eine Tabelle mirt den Tabellennamen macht…
Gruß und Danke!

PS Stern kann ich nicht vergeben. Krieg ne Fehlermeldung, sobald ich den Stern anklicke…

PS Stern kann ich nicht vergeben. Krieg ne Fehlermeldung,
sobald ich den Stern anklicke…

Wechsel mal in die richtige Forumsansicht, da kann man auch viel besser der Konversation folgen.

http://www.wer-weiss-was.de/app/service/board_navi?j…

also warum nicht ans php Brett? Weil showcolumns (habe ich
mittlerweile rausgefunden) ein mysql Befehl ist. :wink:

Aber deine Frage ging eindeutig in die Richtung: Ich krieg was aus mysql und weiß nicht, wie ich es in PHP verarbeiten soll.

Und die Idee oben funktioniert uu.
Aber bei Land gibts Name und id. Bei fahrzeuge name, id,
leistung,hersteller,…
Herstelle rbei Land ist doch sinnfrei.

Dann hast du meine Idee der einheitlichen Konfig-Tabelle scheinbar nicht verstanden. Und offenbar sind es auch keine „Konfigurationsdaten“, sondern einfach Tabellen mit Fremdschlüssel, wonach mein Beispiel dennoch nicht trägt.

Ich habe es nun zT lösen können:
Die Spaltennamen in ein Array. Das Array mit foreach
druchlaufen und per sql Abgefragt:

Warum tust du das? Warum willst du auf Biegen und Brechen show columns machen? Ich habe doch ein Beispiel geliefert, in dem du assoziative Arrays zurückbekommst. Wenn du nicht weißt, was das ist: http://bit.ly/1pTy7tf

Das habe ich in meinem Beispiel extra herausgestellt. Dein Ansatz ist Murks, wie du ja selbst sagst. Hast du mein Beispiel mal probiert und dir das Ergebnis per var_dump() angesehen?

$sql_spaltenzeigen=sprintf(„show columns from
%s“,mysql_real_escape_string($wert));
// echo $sql_ausgabe."
„;
// echo $sql_spaltenzeigen.“
";
$ms_spaltenanzeigen=mysql_query($sql_spaltenzeigen);

$feldnamen = array();

if($ms_spaltenanzeigen != false)
{
while($liste = mysql_fetch_row($ms_spaltenanzeigen))
{

$feldnamen[$i] = $liste[0];

$i++;
}
}
else die(‚Fehler bei der Datenbankabfrage‘);
//echo "
Größe".count($feldnamen);
foreach($feldnamen as $werte)
{

$sql_ausgabe=sprintf(„select * from
%s“,mysql_real_escape_string($wert));
//echo $sql_ausgabe;
$ms_ausgabe=mysql_query($sql_ausgabe);
while($ausgabe_werte=mysql_fetch_assoc($ms_ausgabe))

Glaubst du, dass irgendjemand Lust hat, dieses Gewirre zu lesen? Benutze bitte den pre-Knopf für Codeschnipsel.

Problem nun nur noch dass alles transponiert rauskommt. Also

Murks! Dein Pferd war schon bei der letzten Anfrage tot. Wenn ein Pferd tot ist, steige ab. Ein totes Pferd läuft nicht schneller, wenn du es härter reitest.

Die Idee ist halt, dass man irgendwann mal eine weitere
Tabelle hinzu packt und dann nur den Namen ins Array packen
muss oder sogar eine Tabelle mirt den Tabellennamen macht…

Auch das habe ich verstanden und schon meine Meinung dazu abgegeben. Nehmen wir mal an, alles läuft gut und du kriegst deine Datenstruktur auf die Kette und kommst endlich dazu, das ganze auf der Webseite darzustellen. Wie gehst du denn DANN damit um, dass die eine Information aus 5 Feldern und die andere Information nur aus 2 besteht? Das bleibt in jedem Fall ein look&feel-Disaster, von Fehlerbehandlung ganz zu schweigen, sowas geht in den seltensten Fällen absolut generisch.

Und hey… Wenn da mal ne Tabelle dazukommt, dann musst du für diese eh größere Anpassungen an deinem Quelltext machen, da ist so eine Konfiguration verhältnismäßig schnell zusammengezimmert.

Wenn wir jetzt annehmen, du brauchst für so eine einfache Konfigurationsseite 1h pro Tabelle, dann rechne mal dagegen, wieviel Zeit du schon JETZT auf deine generische Lösung verwendet hast. Da kannst du mutmaßlich einige Erweiterungen an deiner Konfigurationsseite machen, bevor sich das amortisiert.

Und zudem wird dein Code lesbar und nachvollziehbar und damit wartbar. Ich möchte an dieser Stelle bitte auf das KISS-Prinzip verweisen.

Günther

Stern? Bitte gern.