thealex
Goto Top

Daten aus DB richtig zuordnen wenn zwei Werte stimmen

Hallo liebe Administrator.de Nutzer,

Ich habe eine DB in der zu jedem Tabellenfeld ein eintrag existiert.

mid(X-Koordinate) subid(Y-Koordinate) type(bestimmt die feldeigenschafft) owner(klar besitzer) und map_id ist der primärschlüssel
dbtable

Jetzt möchte ich zu folgender tabelle den wert aus type nutzen um die td-class zu bestimmen

function displayMap(){
			
				try
			{
			$loadMap = $this->conn->prepare("SELECT * FROM vulgor_tiles ORDER BY subid +0 DESC, mid+0 ASC");  
			$loadMap->execute();
			$map = $loadMap->fetchAll(PDO::FETCH_ASSOC);
			}
			catch(PDOException $e)
			{
				echo $e->getMessage();
			}
			//echo "<pre>"; 
			//print_r($map);	
			//echo "</pre>"; 
			
			echo "<table border='1'>";  
			echo "<tr>";  
			for($x=1, $xmax=50, $ymax=50, $y=0; $x <= $xmax, $ymax > $y; $x++){
			//foreach($map as [$mid."_".$subid] => $type){ 
			echo "<td class='type' >".$x."-".$ymax."</td>";  
			//}
			if($x == 50){
			echo "</tr>";  
			echo "<tr>";  
			$ymax--;
			$x=0;
			}
			
			}
			
			
			}
Type ist eine zahl zwischen 0 und 3. Wie kann ich jetzt also den passenden wert type zuordnen?

Content-ID: 366438

Url: https://administrator.de/contentid/366438

Ausgedruckt am: 17.11.2024 um 09:11 Uhr

Pedant
Pedant 01.03.2018 aktualisiert um 13:52:33 Uhr
Goto Top
Hallo TheAlex,

mir ist völlig unklar wie Deine Ausgabe aussehen soll und welchen Zweck sie verfolgt.
In der Ausgabe-Schleife nutzt Du lediglich zwei Zahlvariablen (x und ymax) und lässt auch nur diese ausgeben.
Als class verwendest Du den festen String type.
Die gesamte Ausgabe hat nichts mit der Datenbank zu tun.

In Deiner auskommentierten for-Schleife foreach($map as [$mid."_".$subid] => $type)
befindet sich zumindest ein Bezug zur Datenbank.
Was soll die von Dir ungenutzte Vartable $type aber enthalten?
Soll es die Verknüpfung von $mid."_".$subid sein
oder
der Datenbankwert des Feldes type?

In dieser Unkenntnis habe ich mal was (um)geschrieben, was zumindest irgendetwas ausgibt.
<?php

function displayMap()
	{
	$server = "mysql:host=localhost; port=3306; dbname=test";  
	$benutzer = "root";  
	$kennwort = "MeinrootKennwort";  
	$conn = new PDO($server, $benutzer, $kennwort);
	$conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	try
		{
		$loadMap = $conn -> prepare("SELECT * FROM vulgor_tiles ORDER BY subid +0 DESC, mid +0 ASC");  
		$loadMap -> execute();
		$map = $loadMap -> fetchAll(PDO::FETCH_ASSOC);
		}
	catch(PDOException $e)
		{
		echo $e->getMessage();
		};
	//echo "<pre>"; 
	//print_r($map);	
	//echo "</pre>"; 
	echo "\t\t<table border='1'>\n";  
	echo "\t\t\t<tr>\n";  
	for ($x=1, $xmax=5, $ymax=3, $y=0; $x <= $xmax, $ymax > $y; $x++)
		{
		foreach ($map as $row)
			{
			//print_r($row);
			$mid = $row["mid"];  
			$subid = $row["subid"];  

			/* type ist entweder das hier: */
			//$type = $mid."_".$subid; 
			/* oder doch der Wert aus der Datenbank: */
			$type = $row["type"];  
			//if ($x == $mid && $y == $subid)
			if ($x == $mid)
				{
				echo "\t\t\t\t<td class='$type'>".$x."-".$ymax."</td>\n";  
				};
			}
		if($x == $xmax)
			{
			$ymax--;
			$x=0;
			echo "\t\t\t</tr>\n";  
			if ($ymax > 0) {echo "\t\t\t<tr>\n";};  
			};
		};
	echo "\t\t</table>\n";  
	}
?>
<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
		<title>Test</title>
	</head>
	<body>
<?php
displayMap();
?>
	</body>
</html>

Anmerkung:
Die Max-/Startwerte habe ich in meinem Code reduziert, damit die Ausgabe überschaubar bleibt.
$xmax=5
$ymax=3

Ob meine Ausgabe etwas mit Deiner Zielsetzung zu tun hat, kann ich allerdings nicht beurteilen.
Dazu könntest Du Dich gerne noch äußern und/oder html-Code posten, der den gewüschten Output demonstriert.

Meine Ausgabe sieht so aus:
<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
		<title>Test</title>
	</head>
	<body>
		<table border='1'>  
			<tr>
				<td class='0'>1-3</td>  
				<td class='1'>2-3</td>  
			</tr>
			<tr>
				<td class='0'>1-2</td>  
				<td class='1'>2-2</td>  
			</tr>
			<tr>
				<td class='0'>1-1</td>  
				<td class='1'>2-1</td>  
			</tr>
		</table>
	</body>
</html>

Einrückungen \t und Zeilenumbrüche \n sind auch bei generiertem Html kein Luxus, sondern notwendig, um das Ergebnis visuell Prüfen zu können.

Nachtrag:
Meine Tabelle "vulgor_tiles" enthält nur die beiden Datensätze, die in Deinem Screenshot zu sehen sind.
Mehr Datensätze wären hier eventuell sinnvoll, um zu sehen wohin die Reise gehen soll.

Gruß Frank
TheAlex
TheAlex 01.03.2018 um 16:21:34 Uhr
Goto Top
Ich habe mittlerweile die zuordnung schon hinbekommen, allerdings fehlt mir jetzt die komplette erste reihe in der ausgabe.

			function displayMap(){
			
				try
			{
			$loadMap = $this->conn->prepare("SELECT * FROM vulgor_tiles ORDER BY subid +0 DESC, mid+0 ASC");  
			$loadMap->execute();
			$map = $loadMap->fetchAll(PDO::FETCH_ASSOC);
			}
			catch(PDOException $e)
			{
				echo $e->getMessage();
			}

			echo "<table class='map'>";  
			echo "<tr>";  
			for($x=1, $xmax=50, $ymax=50, $y=0; $x <= $xmax, $ymax > $y; $x++){
			foreach($map as $key => $v){
			if($x == $v['mid'] && $ymax == $v['subid']){  
			echo "<td class='type".$v['type']."' >".$x."-".$ymax."</td>";  
			}
			}
			
			if($x == 50	){
			echo "</tr>";  
			echo "<tr>";  
			$ymax--;
			$x=1;
			
			}
			}
			echo "</tr></table>";  
			
			}

Wäre über jede hilfe dankbar
Pedant
Pedant 01.03.2018 um 22:18:18 Uhr
Goto Top
Hallo TheAlex,

Zitat von @TheAlex:
Wäre über jede hilfe dankbar
...und warum igonorierst Du die einzige Hilfe, die Du bisher erhalten hast?
Hast Du sie gelesen?
Was hat Dir geholfen?
Was war am Thema vorbei?
Was hast Du nicht verstanden?
Warum beantwortest Du keine der Rückfragen?
Sollen wir weiterhin raten wie die erste Reihe in Deiner Ausgabe aussehen soll?

Ich weiß nicht wie ich Dir helfen soll, nicht wobei und nicht wohin, ich bin mir nur recht sicher, dass ich könnte, wenn ich wüsste was Du eigentlich möchtest.

Gruß Frank
Pedant
Pedant 02.03.2018 um 12:39:57 Uhr
Goto Top
Hallo TheAlex,

ich glaube ich weiß jetzt wo die Reise hingehen soll.

<?php

function displayMap()
	{
	$server   = "mysql:host=localhost; port=3306; dbname=test";  
	$benutzer = "root";  
	$kennwort = "MeinrootKennwort";  
	$conn     = new PDO($server, $benutzer, $kennwort);
	$conn -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

	try
		{
		$loadMap = $conn -> prepare("SELECT * FROM vulgor_tiles ORDER BY subid +0 DESC, mid +0 ASC");  
		$loadMap -> execute();
		$map = $loadMap -> fetchAll(PDO::FETCH_ASSOC);
		}
	catch(PDOException $e)
		{
		echo $e->getMessage();
		};

	echo "\t\t<table class='map'>\n";  
	echo "\t\t\t<tr>\n";  
	$xmax = 50;
	$ymax = 50;
	$y = $ymax;
	for($x = 1; $x <= $xmax; $x++)
		{
		$td_ausgegeben = false;
		foreach($map as $key => $v)
			{
			if($x == $v['mid'] && $y == $v['subid'])  
				{
				echo "\t\t\t\t<td class='type".$v['type']."'>".$x."-".$y."</td>\n";  
				$td_ausgegeben = true;
				};
			};
		if($x == $xmax)
			{
			if ($td_ausgegeben)
				{
				echo "\t\t\t</tr>\n";  
				echo "\t\t\t<tr>\n";  
				}
			$y--;
			$x = 0;
			};
		if ($y == 0) {break;};
		};
	echo "\t\t\t</tr>\n";  
	echo "\t\t</table>\n";  
	}
?>
<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
		<title>Test</title>
	</head>
	<body>
<?php
displayMap();
?>
	</body>
</html>

Mit diesen Beispieldaten
map_id	mid	subid	type	owner
1	1	2	0	0
2	3	4	1	0
3	5	6	2	0
4	7	9	3	0
5	9	10	3	0

sieht die Ausgabe so aus
<!DOCTYPE HTML>
<html>
	<head>
		<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
		<title>Test</title>
	</head>
	<body>
		<table class='map'>  
			<tr>
				<td class='type3'>9-10</td>  
				<td class='type3'>7-9</td>  
				<td class='type2'>5-6</td>  
				<td class='type1'>3-4</td>  
				<td class='type0'>1-2</td>  
			</tr>
		</table>
	</body>
</html>

Gruß Frank