Map X und Y

Lukas03

Mitglied
Hallo,

habe zwei Probleme mit meiner programmierten spielermap.

1. Fehler.) Nur ein Datensatz wird in die Karte übergeben, warum wird der zweite User nicht angezeigt?
2. Fehler.) Der erste User wird zweimal ausgeben gleich daneben. :-/
Die X & Y Koordinaten werden beim Registrieren automatisch per Zufall generiert.-/

PHP:
<?php
include ('config.php');

    $sql = mysqli_query($db,"SELECT id, x, y, username FROM spieler ORDER BY x");
    $row2 =  mysqli_fetch_object($sql);
    
    $koordinatenx = $row2->x; // X  Koordinaten werden aus der Datenbank übertragen
    $koordinateny = $row2->y; // Y  Koordinaten werden aus der Datenbank übertragen
    $username = $row2->username;// // Username wird aus der Datenbank übertragen
    $userid = $row2->id;
    $max = 25; // Größe der Karte
  
   echo '<table bgcolor="#000000" border="0" cellpadding="0" cellspacing="2">';

   for($y = 1; $y <= $max; $y++)
        {
            echo '<tr>';

            for($x = 1; $x <= $max; $x++)
            {   
                     $sql = mysqli_query($db,"SELECT id, x, y, username FROM spieler ORDER BY x");
                  
                      while($row2 = mysqli_fetch_object($sql)) 

                    if ($x  == $koordinatenx & $y == $koordinateny){ // Koordinaten werden mit der Schleife verglichen?? FEHLER?
                          
                    echo "<td>";
                    echo '<a href="user.php?id=';
                    echo $userid;
                    echo '"><img src="insel.gif" title="';
                    echo $username;
                    echo $koordinatenx;
                    echo '.';
                    echo $koordinateny;
                    echo '"></a>';
                    echo '</td>';
                
                       }
                
                    else { //keine Koordinaten
                    echo "<td>";
                    echo '<img src="wasser.gif" title="Wasser"';
                    echo '">';
                    echo '</td>';
                        }
                    

            }
            echo '</tr>';
        }
        echo '</table>';

?>



Map als im Anhang mit MYSQL Struktur


Über einen hilfreichen Tipp würde ich mich sehr freuen :)

Gruß
Lukas
 

Anhänge

  • map.jpg
    map.jpg
    298,4 KB · Aufrufe: 7
Lösung
Die Lösung habe ich dir in Posting #4 angegeben. Ausprogrammiert würde das so aussehen:
Code:
$max = 25; // Größe der Karte
$sql = mysqli_query($db, "SELECT id, x, y, username FROM spieler");
$pos = [];
while ($row2 = mysqli_fetch_object($sql)) {
    $x = $row2->x;
    $y = $row2->y;
    $pos[$x][$y] = ['username' => $row2->username, 'id' => $row2->id];
}

echo '<table bgcolor="#000000" border="0" cellpadding="0" cellspacing="2">';


for ($y = 0; $y < $max; $y++) {
    echo '<tr>';
    for ($x = 0; $x < $max; $x++) {
        if (isset($pos[$x][$y])) {
            echo "<td>";
            echo '<a href="user.php?id=';
            echo $pos[$x][$y]['id'];
            echo '"><img src="insel.gif" title="';
            echo...
Die Variablen mit den Userdaten, $koordinatenx etc. ermittelst Du bei der ersten Datenbankabfrage, und zwar nur für den ersten Benutzer, da hier keine Schleife. Bei der zweiten DB-Abfrage innerhalb der inneren Schleife hast Du zwar eine Schleife über das Ergebnis, aber Du holst die Daten gar nicht heraus und weist sie nicht den Variablen neu zu. Daher verpufft diese Abfrage.

Von der Effizienz her ist diese Lösung gar nicht optimal, weil Du 25*25 Mal die selbe DB-Abfrage ausführst.
Mein Vorschlag: Zunächst die Tabelle, ohne die Benutzer zu berücksichtigen, mit Wasser aufbauen. Anschließend die DB-Abfrage und gezielt in den richtigen Zellen jeweils den Link mit Insel einbauen.
 
PPS: Jetzt habe ich ein wenig falsch gedacht: Du möchtest ja die Inseln gleich im PHP einbauen, daher musst Du es gleich während der Schleifendurchläufe machen. Vorschlag dazu: Die User gleich am Anfang auslesen und die Daten in ein zweidimensionales Array parallel zur Tabelle eintragen. Der ganze Rest im Array bleibt undefiniert. Dann kannst Du während der Schleifendurchläufe sehr einfach prüfen, ob sich ein Benutzer in der Tabellenzelle befindet.
 
@Sempervivum danke erstmal, hab die gesamte abfrage + Variablen in die erste Schleife verschoben damit wurde Fehler 2 behoben *freu*

Die anderen User werden aber immer noch nicht ausgegeben?

Das mit der zweidimensionales Array werde ich mir mal anschauen :)

PHP:
<?php
include ('config.php');


    
    
    $max = 25; // Größe der Karte
  
   echo '<table bgcolor="#000000" border="0" cellpadding="0" cellspacing="2">';

   for($y = 1; $y <= $max; $y++)
        {
            echo '<tr>';

            for($x = 1; $x <= $max; $x++)
            {   
                        $sql = mysqli_query($db,"SELECT id, x, y, username FROM spieler");
                       $row2 =  mysqli_fetch_object($sql);
                       $koordinatenx = $row2->x; // X  Koordinaten werden aus der Datenbank übertragen
                    $koordinateny = $row2->y; // Y  Koordinaten werden aus der Datenbank übertragen
                    $username = $row2->username;// // Username wird aus der Datenbank übertragen
                    $userid = $row2->id;
                  
                      while($row2 = mysqli_fetch_object($sql)) 

                    if ($x  == $koordinatenx & $y == $koordinateny){ // Koordinaten werden mit der Schleife verglichen?? FEHLER?
                          
                    echo "<td>";
                    echo '<a href="user.php?id=';
                    echo $userid;
                    echo '"><img src="insel.gif" title="';
                    echo $username;
                    echo $koordinatenx;
                    echo '.';
                    echo $koordinateny;
                    echo '"></a>';
                    echo '</td>';
                    echo $username;
                
                       }
                
                    else { // Ausgabe wenn keine Koordinaten
                    echo "<td>";
                    echo '<img src="wasser.gif" title="Wasser"';
                    echo '">';
                    echo '</td>';
                        }
                    

            }
            echo '</tr>';
        }
        echo '</table>';

?>
 
Nicht ganz, einfach über die Schleife ging auch ohne array

PHP:
                        $sql = mysqli_query($db,"SELECT id, x, y, username FROM spieler");

                          while($row = mysqli_fetch_object($sql)) 
                    
                    if ($x  == $row->x & $y == $row->y){ // Koordinaten werden mit der Schleife verglichen?? FEHLER?
                          
                    
                    echo "<td>";
                    echo '<a href="user.php?id=';
                    echo $row->id;
                    echo '"><img src="insel.gif" title="';
                    echo $row->username;
                    echo $row->x;
                    echo '.';
                    echo $row->y;
                    echo '"></a>';
                    echo '</td>';
                    
                
                       }
 
Hallo, ich noch einmal, möchte nicht wieder ein neues Thema erstellen,

irgendwie passt die Zuordnung noch nicht so ganz die User werden woanders wiedergegeben :-/

Liegt es an der If-Bedingung, oder doch an der Html Tabelle?

User eins hat x1 und y1

User zwei x1 und y2

User drei hat x1 und y5

Aktueller Code
PHP:
<?php
include ('config.php');


    
    
    $max = 10; // Größe der Karte
  
   echo '<table bgcolor="#000000" border="0" cellpadding="0" cellspacing="2">';

   for($x = 1; $x < $max; $x++)
        {
            echo '<tr>';

    for($y = 1; $y < $max; $y++)
            {   
                        $sql = mysqli_query($db,"SELECT id, x, y, username FROM spieler ORDER BY x");

                      while($row = mysqli_fetch_object($sql))  {
                    
                    if ($x == $row->x++ && $y == $row->y++ ){ // Koordinaten werden mit der Schleife verglichen?? FEHLER?
                          
                    
                    echo "<td>";
                    echo '<a href="user.php?id=';
                    echo $row->id;
                    echo '"><img src="insel.gif" title="';
                    echo $row->username;
                    echo $row->x;
                    echo '.';
                    echo $row->y;
                    echo '"></a>';
                    echo '</td>';
                    
                
                       }
                
                    else { // Ausgabe wenn keine Koordinaten
                    echo "<td>";
                    echo '<img src="wasser.gif"';

                    echo '">';
                    echo '</td>';
                        }
                    

            }}
            echo '</tr>';
        }
        echo '</table>';





?>

@Sempervivum eventuell könntest du mir nochmal helfen :)

Lg
Lukas
 

Anhänge

  • map.jpg
    map.jpg
    54,6 KB · Aufrufe: 4
Die Lösung habe ich dir in Posting #4 angegeben. Ausprogrammiert würde das so aussehen:
Code:
$max = 25; // Größe der Karte
$sql = mysqli_query($db, "SELECT id, x, y, username FROM spieler");
$pos = [];
while ($row2 = mysqli_fetch_object($sql)) {
    $x = $row2->x;
    $y = $row2->y;
    $pos[$x][$y] = ['username' => $row2->username, 'id' => $row2->id];
}

echo '<table bgcolor="#000000" border="0" cellpadding="0" cellspacing="2">';


for ($y = 0; $y < $max; $y++) {
    echo '<tr>';
    for ($x = 0; $x < $max; $x++) {
        if (isset($pos[$x][$y])) {
            echo "<td>";
            echo '<a href="user.php?id=';
            echo $pos[$x][$y]['id'];
            echo '"><img src="insel.gif" title="';
            echo $pos[$x][$y]['username'];
            echo $x + 1;
            echo '.';
            echo $y + 1;
            echo '"></a>';
            echo '</td>';
            echo $pos[$x][$y]['username'];
        } else {
            echo "<td>";
            echo '<img src="wasser.gif" title="Wasser"';
            echo '">';
            echo '</td>';
        }
    }
    echo '</tr>';
}

echo '</table>';
 
Lösung
Zurück