Dynamische html Tabelle aus Mysql erstellen

Liebe Experten,
Ich habe mit eigenen Mitteln versucht und es nicht hingekriegt. Ich bin erst seit kurzem mit PHP am Arbeiten und hoffe mich noch zu steigern.
Ich habe folgende Tabelle(Sales) in meiner Datenbank:
Land Art1 Art2 Art3 Art4 Händler
USA 12 0 4 7 8976
Tunesien 0 35 36 7 6744
China 34 275 0 124 7867
Australien 0 8 4 77 6763
Nigeria 6 7 0 9 7004
Kanada 0 9 8 11 8976
Japan 23 0 25 0 2312
Deutschland7 8 19 10 8768
Schweiz 8 23 0 11 6563
Brasilien 9 0 101 88 6876
Italien 0 0 0 0 8883
Neuseeland 3 4 9 0 7671
Kenya 5 0 7 0 8767

Ich möchte aus dieser Sales DB-Tabelle anhand von php die Länder in Kontinenten(Amerika=USA;Kanada;Brasilien,Europa=DE,Schweiz,Italien…) gruppieren und die Werte(Art) so ausgeben dass leere Felder nicht angezeigt werden.In der 3. Spalte der Tabelle sollte den Händler stehen.
Sollte wie im Beispiel in Italien alle (Art)Felder Null sein, dann sollte Italien nicht in der Tabelle erscheinen.
So sollte die Tabelle aussehen:
Amerika
USA 8976
Art1: 12
Art3: 4
Art4: 7
Kanada
Art2: 9
Art3: 8
Art4: 11
Brasilien 6876
Art1: 9
Art3: 101
Art4: 88
Afrika
Tunesien 6744
Art2: 35
Art3: 36
Art4: 7
Nigeria 7004
Art1: 6
Art2: 7
Art4: 9
Kenya 8767
Art1: 5
Art3: 7
Australien
Australien 6763
Art2: 8
Art3: 4
Art4: 77
Neuseeland 7671
Art1: 3
Art2: 4
Art3: 9
Europa
Deutschland 8768
Art1: 7
Art2: 8
Art3: 19
Art4: 10
Schweiz 6563
Art1: 8
Art2: 23
Art4: 11
Könnt mir bitte dabei helfen?
Ich kriege dass nicht hin.Ich habe alles in einem Array gepackt und versuche mit einer while Schleife auszugeben aber das klappt nicht.
Hier einen Entwurf von meinem Code:
$SQLString=„SELECT * FROM sales
WHERE ???
GROUP BY ???“;
$Ergebnis = mysql_query($SQLString,$Verbindung);

$anzahl = mysql_num_rows($Ergebnis);

?>

Kontinent
Land1Art1Art3Art4Land2Art1Art2Art3Land3<?php while ($adr = mysql_fetch_array($Ergebnis)){

?><?php echo $adr['Kontinent']?><?php echo $adr['Land']?><?php echo $adr['Art1']?><?php echo $adr['Art2']?><?php echo $adr['Art3']?>

<?php }
?\> Gehe ich das Thema richtig an?Ich wäre dankbar für eure Hilfe. Grüße BBoli

Hallo BBoli,

deine Query sollte wie folgt aussehen:

"SELECT * FROM Sales"

ansonsten seh ich grad nicht woran es liegen kann, wobei der Index „Kontinent“ nicht definiert ist, da keine solche Spalte in der DB vorhanden ist.

MFG

Du brauchst in deiner Tabelle noch eine Spalte für den Kontinent:

alter table add column Kontinent varchar(10);

Diese dann noch ausfüllen mit:

update set Kontinent = ‚Europa‘ where Land in('Deutschland, ‚Schweiz‘,…);

Dann kannst du so selektieren:

select * from sales where (art1 > 0 or art2 > 0 or art3 > 0) order by Kontinent, Land;

Im Grunde ordnest du nach Kontinent und dann nach Land und gruppiertst nicht. Es werden nur Länder angezeigt wo mindestens ein Artikel > 0 ist.

Bei der Tabelle ist noch ein Fehler drin. Dort musst du tags für die Spalten und für die Zeilen nehmen.

Gruß
Till

Hallo BBoli,

woher weiß PHP eigentlich welches Land auf welchem Kontinent ist?

Ich würde noch eine weitere Spalte anlegen „Kontinent“ und jedem Kontintent eine Ziffer zuweisen. (INT Länge: 1).

Dann kannst du „GROUP BY kontinent“ verwenden und bekommst alle Einträge gruppiert angezeigt.

Hoffe ein wenig geholfen zu haben…falls ich falsch verstanden habe, dann bitte genauere Aangabe woher PHP weiss welches Land welcher Kontinent ist.

Um zu prüfen ob alle Zellen leer sind benutzt du:
if(!empty($adr[‚Adr1‘] && !empty($adr[‚Art2‘] usw…

{
Ausgabe mit echo falls alle Felder NOT EMPTY !!!
}

Gruss
David

Liebe Experten,
Ich habe mit eigenen Mitteln versucht und es nicht
hingekriegt. Ich bin erst seit kurzem mit PHP am Arbeiten und
hoffe mich noch zu steigern.
Ich habe folgende Tabelle(Sales) in meiner Datenbank:
Land Art1 Art2 Art3 Art4 Händler
USA 12 0 4 7 8976
Tunesien 0 35 36 7 6744
China 34 275 0 124 7867
Australien 0 8 4 77 6763
Nigeria 6 7 0 9 7004
Kanada 0 9 8 11 8976
Japan 23 0 25 0 2312
Deutschland7 8 19 10 8768
Schweiz 8 23 0 11 6563
Brasilien 9 0 101 88 6876
Italien 0 0 0 0 8883
Neuseeland 3 4 9 0 7671
Kenya 5 0 7 0 8767

Gehe ich das Thema richtig an?Ich wäre dankbar für eure Hilfe.
Grüße
BBoli

Hi!

Erstmal - schön dass du selber versuchst das Problem zu verstehen anstatt blind nach einer Lösung zu Fragen - so lernst du viel mehr (und andere Leute sind vermutlich auch wesentlich eher geneigt dir zu helfen)

aber zurück zu deinem Problem:

du musst irgendwo hinterlegen welches Land zu welchem Kontinent gehört.
Ich werde jetzt ab dieser Stelle mal das ganze Zeug von wegen Datenbankdesign ausser acht lassen und eine Quick-and-dirty-Lösung aufzeigen:

Ergänze doch mal deine Tabelle dass sie wie folgt aufgebaut ist:
Land Art1 Art2 Art3 Art4 Händler Kontinent.

dein Query wäre also logischerweise folgender:
SELECT * FROM SALES ORDER BY Kontinent ASC

dies führt dann dazu dass z.B. erst alle Einträge von Asien, dann alle von Australien, usw… erscheinen

wenn du jetzt noch nur dann den Kontinent ausgibst wenn dieser sich in der Liste ändert hast du es auch schon fast geschafft (sowas nennt man übrigends einen „Gruppenwechsel“)

bleibt also noch die Frage wie man die leeren Felder aussortiert: Bei deinem Aufbau wäre es sinnvoll dies in PHP selber auszufiltern da hier auch die Ausgabe erfolgt… wie gesagt - alles eine Frage des Datenbankdesigns…

sooo - ich hoffe ich konnte dir hier den benötigten Denkanstoß geben und bis bald

Daniel Heinrich

PS: Da du offensichtlich bereit bist dich mit dem Thema auseinanderzusetzen: Solltest du ein bisschen mehr Interesse am Datenbankdesign oder am Programmdesign haben bin ich gerne bereit dir bei der ein oder anderen Frage zu helfen - einfach nochmal per Wer-Weiss-Was auf diese Antwort hier Antworten :wink:

Hi,

ich möchte dir hier nicht die vollständige Lösung deiner Anforderung geben, denn du sollst ja das aha Gefühl bekommen, wenn du die Lösung findest.

Als erstes möchte ich sagen, dass man natürlich mit der Tabelle und den unten angegebenen PHP/HTML Script zum Ziel kommt. Ich würde die Tabelle jedoch anders aufbauen. Schau dir bitte den Aritkel im folgendem Link zum Thema Normalisierung an. Link: http://de.wikipedia.org/wiki/Normalisierung_%28Daten…
In diesem Artikel geht es darum das Tabellendesign so optimal wie möglich zu erzeugen.
Stell dir mal die Frage was würdest du machen, wenn es einen 5. Artikel in deiner Datenbank geben würde (diesr kommt natürlich nach Fertigstellung deiner Seite). Dann müsstest du bei dem Design die Tabelle und den Script anpassen.
Mein Vorschlag ist, Trenne die Artikel, die Händler und Länder in eigene Tabellen.
z. B.
Tabelle1: Händler
ID, Händler
1 8976
2 6744 usw.
Tabelle2: Land
ID, Land
1 USA
2 Tunesien usw.
Tabelle3: Artikel
ID, Artikel, Land_ID, Händler_ID
1 12 1 1
2 4 1 1 usw.

Abfrage:
SELECT Land, Händler, Artikel FROM Land INNER JOIN Artikel ON Land.ID = Land_ID INNER JOIN Händler ON Händler.ID = Händler_ID
ORDER BY Land_ID

Dann bekommst du folgendes Ergebnis:
Land, Händler, Artikel
USA 8976 12
USA 8976 4 usw.

Nun musst du in einer Schleife jeden einzelnen Datensatz auslesen und den Inhalt in die entsprechende Position in deinem PHP Dokument einbinden (siehe dein Beispiel).
Fertig.
Wenn jetzt z. B. in USA ein weiterer Artikel erscheinen soll, musst du nur einen Datensatz in der Tabelle Artikel hinzufügen (dasselbe gilt auch für Land und Händler).

Ich hoffe, ich konnte dir ein wenig helfen.

LG
Manfred Matschke

Hallo,

als blutiger Anfänger ist das schon ein etwas größeres Problem.
Als erstes muss mann die Strukturen der Datenbank bzw. Tabellen bestimmen.
Woher weiss Deine Datenbank welche Länder zu welchem Kontinent gehören? Dafür müsste eine Tabelle her in der Kontinent und Land steht. Und dann wirst Du meines Erachtens das nicht in einer Abfrage lösen können. Es ist vielleicht zum Üben auch besser das in einzelnen Schritten zu lösen. Dann kanst Du mit if-Abfragen bestimmen ob der Eintrag angezeigt werden soll oder nicht.
Zum Üben nehme Dir nicht sofort etwas so schweres vor. Das bringt erst Frust. Denn PHP ist sehr sehr stark, aber deshalb auch nicht sehr schnell zu lernen.

Vielleich hilt Dir das schon etwas weiter. Und sonst soltest Du lesen. Z.B. selfphp (auch irgendwo im Netz zu finden).

Viele Grüße
Werner

WHERE
art1 0 and art2 0 and art3 0

bezüglch gruppierung: wo ist die zuordnung der kontinente zum land?

bezüglich 0 unterdrücken:

<?php echo ($adr['Art1']?$adr['Art1']:"") ?>

ist die kurzform für
if $adr[‚Art1‘] (meint if Art1 nicht falsch - falsch ist es bei leer oder 0) then $adr[‚Art1‘] else „“

Hallo,

um es vorweg zu sagen: da hast du noch einiges vor dir! Ich kann dir nicht die komplette Lösung geben, sondern nur einige Tipps.

Zum einen: da du wie ich annehme in Zukunft noch mehr solcher umfangreicheren Projekte planst, solltest du dir eine dicke Lektüre zum Thema kaufen. Viele beinhalten auch gleichzeitig Praxisbeispiele.

Denn mit „Anfängerwissen“ (ohne dich jetzt wirklich gut einschätzen zu können :smiley:) ist es hier nicht getan.

Ich möchte aus dieser Sales DB-Tabelle anhand von php die
Länder in
Kontinenten(Amerika=USA;Kanada;Brasilien,Europa=DE,Schweiz,Italien…)
gruppieren

Dann musst du erstmal eine eigene Spalte für die Kontinente einrichten.

und die Werte(Art) so ausgeben dass leere Felder
nicht angezeigt werden.

Wie willst du das machen? In HTML musst du schließlich eine feste Spaltenanzahl schreiben und kannst nicht mitten in einer Zeile weniger Spalten als davor und danach haben.

In der 3. Spalte der Tabelle sollte den
Händler stehen.

Das lässt sich ja regeln.

Sollte wie im Beispiel in Italien alle (Art)Felder Null sein,
dann sollte Italien nicht in der Tabelle erscheinen.

In der while-schleife eine if-abfrage für jedes Feld.

Ich kriege dass nicht hin.Ich habe alles in einem Array
gepackt und versuche mit einer while Schleife auszugeben aber
das klappt nicht.

Wie klappt es nicht? Welche Fehlermeldung erhältst du? Ohne Fehlermeldung kann man schwer was zur Ursache sagen.

Übrigens: Auch wenn du als Starter wahrscheinlich gerade genug andere Probleme hast, empfiehlt es sich (wenn man die Servervoraussetzungen hat) mit OOP zu arbeiten. Sprich statt mySQL mySQLi zu verwenden. Aber das kannst du später auch noch lernen.

Hier einen Entwurf von meinem Code:
$SQLString=„SELECT * FROM sales
WHERE ???
GROUP BY ???“;
$Ergebnis = mysql_query($SQLString,$Verbindung);

Gut. Bei Where kannst du eine Art Filter eintragen. Hier kannst du auch schon überprüfen lassen, ob bestimmte Felder leer sind. Dafür brauchst du jetzt natürlich SQL-Syntax.

Group by dient dazu, das Ergebnis z.B. nach Kontinenten zu Gruppieren. Dafür muss bei jedem Eintrag natürlich eine Spalte mit dem Kontinent existieren.

Gehe ich das Thema richtig an?Ich wäre dankbar für eure Hilfe.

Grundsätzlich kann ich keine Fehler erkennen. Aber du musst dich noch mehr mit der Theorie und der Funktionsweise von Datenbanken im Allgemeinen beschäftigen, um z.B. zu verstehen, dass wenn du nach etwas filtern oder gruppieren willst, es auch in einer Spalte vorhanden sein muss.

MfG, Florian J.

Hallo BBoli13,

vorher müssen wir ein paar grundsätzliche Fragen klären:

  1. Du schreibst, bei Italien ist alles 0. Steht in Deiner Tabelle für Italien in den Spalten Art1 bis Art4 wirklich „0“ oder „NULL“. Soll heißen, sind diese Spalten auf „NULL“ oder „NOT NULL“ gesetzt? Bedeutet in der Praxis:
    Sind die Spalten auf „NULL“ gesetzt und werden keine Werte für diese Spalten eingetragen, haben sie automatisch den Wert „NULL“.
    Sind die Spalten jedoch auf „NOT NULL“ gesetzt und es werden keine Werte eingetragen, haben sie automatisch den (Standard-)Wert „0“.

  2. Tabellen in HTML müssen in jeder Zeile die gleiche Anzahl Spalten enthalten (allerdings kann man sie zusammenfassen). Da Du vorher nie weißt, wieviel Art-Spalten für jedes einzelne Land in Deiner DB mit Werten belegt ist, muss Deine HTML-Tabelle auch 4 Art-Spalten haben; es sei denn, Du zeigst alternativ nur die Summe der Art1- bisy Art4-Spalten an. Dann brauchst Du für diese Summe immer nur 1 Spalte.

Zu Deiner SQL_Querie würde ich Folgendes vorschlagen:

$SQLString=„SELECT * FROM sales
WHERE SUM(Art1+Art2+Art3+Art4)>0“;

MIT SUM() prüfst Du, ob alle Art-Spalten des jeweiligen Datensatzes „0“ sind. Dann wird der Datensatz (das Land) von der DB nicht ausgeliefert.

Für die Sortierung nach Kontinenten (und Ländern) entweder per Hand gruppieren:

$Amerika_SQLString=„SELECT * FROM sales
WHERE SUM(Art1+Art2+Art3+Art4)>0 AND (Land=‚USA‘ OR Land=‚Kanada‘)“;

$Europa_SQLString=„SELECT * FROM sales
WHERE SUM(Art1+Art2+Art3+Art4)>0 AND (Land=‚Deutschland‘ OR Land=‚Schweiz‘ OR Land=’…’ usw.)“;

Oder Deine Tabelle Sales um die Spalte Kontinent ergänzen und für jedes Land den zugehörigen Kontinent eintragen. Dann kannst Du Dir die SQL-Ausgabe nach Kontinent und Land alphabetisch sortiert ausliefern lassen:

$SQLString=„SELECT * FROM sales
WHERE SUM(Art1+Art2+Art3+Art4)>0
ORDER BY Kontinent ASC, Land ASC“;

Ich hoffe, ich kann Dir ein bischen helfen.

Ansonsten fragen :smile:

Schönes Wochenende.
Ralf

Meine Websitze: www.Themen-Reich.de