Tabelle spaltenweise aus MySQL-Abfrage befüllen lassen

airliner

Erfahrenes Mitglied
Moin Leude!

Mein Vergleichsportal liegt in den letzten Wehen und ich brauche "nur noch" eine halbwegs ansprechende Ausgabe eines recht aufwendigen SQL-Queries...
Kurze Erläuterung: Es gibt eine Tabelle in der MySQL-DB mit 46 Spalten (jaja, schlagt mich, ist nicht die schönste Aufteilung).
Durch angetickerte Radiobutton auf einem weiteren Formular werden die values an die Query übergeben. Das funktioniert auch so, wie es soll (habe mir testweise die Query anzeigen lassen). Jetzt hänge ich noch an der tabellarischen Ausgabe der ermittelten Werte.
Das soll aber nicht zeilenweise passieren (is klar, bei 46 Spalten), sondern spaltenweise.
Zeilenweise habe ich es schon einmal hinbekommen, das ist weniger das Problem.
Spaltenweise sollte jetzt auch nicht das riesending sein. Allerdings gibt es besondere Anforderungen dazu:
Die ersten beiden Spalten sollen statisch gefüllt werden, einige Zellen jedoch bleiben dort leer.
+-------------+----------------+----------------+
|Kategorie--|.....................|.....................|
|..................|Merkmal 1.....|Ausprägung..|
+-------------+----------------+----------------+ usw usw.
Dort wo "Ausprägung" steht, sollen die abgefragten Daten aus der DB rein.

Wie stelle ich das am besten an?
Eine weitere Einschränkung wird zudem sein, dass die Anzahl der Spalten nicht immer gleichbleiben wird. Mal wird es vielleicht nur eine, mal können es auch mehr als fünf werden.

Ich hoffe nur, dass es eine einfache Lösung gibt, die mir google nur noch nicht verraten wollte...
 
Hab es noch nicht so ganz verstanden.

Die unterschiedliche Spaltenanzahl würde ich dadurch lösen das ich immer eine neue Tabelle mit der entsprechenden Spaltenanzahl erstelle.

Was es mit der Ausprägung auf sich hat, musst du mir nochmal genauer erklären. Sind das die Parameter die du beim Auwählen angegeben hast oder wie?
 
Ah ich glaub jetzt verstehe ich was du willst.

Du hast also 3 Spalten, 2 davon sind statisch und die dritte soll komplett mit den DAten der 46 Spalten gefüllt werden richtig ?

Hmm..wenn sich der inhalt der Spalten 1 und 2 eh nicht ändert kannst du ja doch zeilenweise ausgeben und dann in spalte 3 einfach die ganzen werte reinpacken oder seh ich was falsch ?
 
Hallo Tombe,

ich überlege grad, ob es möglich ist über die Anzahl der in Frage kommenden Zeilen (in der MySQL-DB) die Anzahl der zu erstellenden Spalten festzulegen.
Die ersten beiden Spalten wollte ich hardcoden, sodass ich mir um die Zeilenanzahl keine Gedanken machen brauche.
Deine Idee mit den immer wieder neu erstellen Tabellen teile ich zwar auch, ist aber für die Übersicht nicht wirklich hilfreich. In dem Portal sollen ja Produkte verglichen werden.

Ich erkläre es am besten nochmal etwas anders, vielleicht ist es dann verständlicher:
Ich habe mir ein Formular zusammengebastelt mit 29 Merkmalen (es werden also 29 der 46 Eigenschaften zum Filtern genutzt). Diese Merkmale haben zwei der mehr Radiobutton, wahlweise mit ja/nein bzw. anderen values. Diese werden per POST an eine andere Seite weitergegeben, wo die SQL-Query drin liegt. Durch die Query sollen dann alle 46 Merkmale der Produkte abgefragt werden mit der WHERE-Einschränkung durch die values der Radiobutton.
Da die ausgewählten values variieren können, variiert natürlich auch die Anzahl der in Frage kommenden Produkte (also die Zeilen in der MySQL-DB) und damit der auszugebenden Spalten in meiner Seite.

Mit
PHP:
while($row = mysql_fetch_row($query))
    {
		echo "<tr>";
		echo "<td>"$row"</td>";
komme ich ja an die Daten ran (sollte ich vielleicht ein Array draus machen und dort die einzelnen Elemente herauslösen? <--sagt man das eigentlich so? Bin zu kurz dabei mich da reinzufuchsen).
Parke ich die HTML-Tags mit in die Schleife, habe ich Angst, dass es mir das gesamte Tabellen-Layout zerschießt.
Jedenfalls fällt mir kein vernünftiger workaround dazu ein.
Das habe ich bis jetzt:

PHP:
$query = mysql_query($sql_query) or DIE (mysql_error());

if(!mysql_num_rows($query))
{
    echo "Keine Übereinstimmungen gefunden.";
}
else{
	while($row = mysql_fetch_row($query) $row++)
		echo $row[0];
	
?>
	<table>
		<th>Kategorie</th>
		<th>Eigenschaft</th>
		<th>Name</th>
		<tr>
			<td>Produkt</td>
			<td></td>
			<td></td>
		</tr>
			<td></td>
			<td>Name</td>
			
		
	</table>
 
Ich habe mal ein Bild "gemalt" wie ich mir vorstelle was du machen willst.

Alles was schwarz geschrieben ist, sind die Angaben die immer vorhanden sind
Alles was rot geschrieben ist, ist das Ergebnis der SQL-Abfrage. Je mehr Treffer in der Datenbank desto mehr Spalten werden benötigt.

Was davon stimmt?
 

Anhänge

  • tabelle.jpg
    tabelle.jpg
    52,4 KB · Aufrufe: 53
Hab mal schnelle ien Testscript erstellt, um die Daten zu kreuzen.
PHP:
//Namen der Zeilentitel 
$felder = array('Feld1', 'Feld2');

$sql = 'SELECT * FROM test';
$result = mysql_query($sql);

while($item = mysql_fetch_array($result)){
    $zeilen[0][] = $item[0];
    $zeilen[1][] = $item[1];
}
echo '<table>';
foreach($zeilen as $index => $zeile){
    echo '<tr>';
    echo "<th>{$felder[$index]}</th>";
    foreach($zeile as $value){
        echo "<td>{$value}</td>";    
    }
    echo '</tr>';
}
 
Zuletzt bearbeitet:
Entschuldigt meine späte Antwort.
Ich hatte mir in der Zwischenzeit überlegt, ob ich das nicht auf zwei Tabellen, die nebeneinander dargestellt werden, aufteile.
Die erste, linke, Tabelle fummel ich statisch zusammen (also Kategorie und Merkmale). Die zweite, rechte, Tabelle lasse ich dann über die Query befüllen.
Auch wenn es nicht in den PHP-Bereich gehört: Wie stelle ich das am besten an? Sollte ich über DIVs gehen oder gibt es da noch andere Möglichkeiten (sowas wie eine Haupttabelle mit zwei Zellen, die die anderen beiden Tabellen aufnimmt. Wobei sich dann wieder die Frage stellt, wie ich die while-Schleife unterbringe.)?
 
Hast du mein Script mal ausprobiert? Wenn nicht, hat es keinen Sinn dass ich dir schreibe wie du es für deine neuen Bedürfnisse anpassen musst, denn der grösste teil bliebt gleich.
 
Hallo Yaslaw,

ja, ich habe dein Script mal ausprobiert und es auch so weit angepasst, wie ich es mit meinem Wissensstand hinbekommen habe.
Das führte allerdings nicht zu dem erhofften Erfolg.

Ich habe daraufhin meinen letzten Einwurf der ineinander verschachtelten Tabellen ausprobiert und es sieht auf den ersten Blick ganz gut aus (es läuft erst seit wenigen Minuten).

Trotzdem vielen Dank für deine Bemühungen und deine Zeit!

Für Interessierte, wie ich es letztlich gelöst habe:
PHP:
$query = mysql_query($sql_query) or DIE (mysql_error());

if(!mysql_num_rows($query))
{
    echo "Keine Übereinstimmungen gefunden.";
}
else{

echo "<table>";
	echo "<tr>";
		echo"<td>";
			//statische Tabelle
			echo"<table>";
				echo"<th>Kategorie</th>";
				echo"<th>Merkmal</th>";
				
				//Kategorie "Produkte"
				echo"<tr>";
					echo"<td>Produkt</td>";
					echo"<td></td>";
				echo"</tr>";
				echo"<tr>";
					echo"<td></td>";
					echo"<td>Name</td>";
				echo"</tr>";
				echo"<tr>";
					echo"<td></td>";
					echo"<td>Referenzen</td>";
				echo"</tr>";
				echo"<tr>";
					echo"<td></td>";
					echo"<td>Infomaterial</td>";
				echo"</tr>";
				echo"<tr>";
					echo"<td></td>";
					echo"<td>Demoversion</td>";
				echo"</tr>";

//usw usw

			echo"</table>";
		echo"</td>";
		
		while($row = mysql_fetch_row($query)){
		echo"<td>";
		
			//zu füllende Tabelle aus der Query
			echo"<table>";
				echo"<th>Ausprägung</th>";

					echo"<tr>";
						echo"<td> </td>";
					echo"</tr>";
					echo"<tr>";
						echo"<td>$row[0]</td>";
					echo"</tr>";
					echo"<tr>";
						echo"<td>$row[1]</td>";
					echo"</tr>";
					echo"<tr>";
						echo"<td>$row[2]</td>";
					echo"</tr>";
					echo"<tr>";
						echo"<td>$row[3]</td>";
					echo"</tr>";
					echo"<tr>";
						echo"<td>$row[4]</td>";
					echo"</tr>";

//usw usw

			echo"</table>";
		echo"</td>";
		}
	echo"</tr>";
echo"</table>";

Auch wenn es nicht gerade die eleganteste und ziemlich statische Lösung ist, so funktioniert sie doch für meine Bedürfnisse.
Jetzt muss ich nur noch die Druck- bzw. PDF-Funktion klären. Da vermute ich aber die Übergabe per POST hinter und probier mich mal mit GET. Da keine Passwörter oder ähnlich sensible Daten übertragen werden, sollte das weniger ein Problem darstellen. Zur Sicherheit wird natürlich ein weiterer DB-Nutzer ausschließlich mit Leserechten auf dieser Tabelle eingerichtet, um etwaigen Injections vorzubeugen.
 
Zurück