[Erledigt] Mehrspaltige Tabelle erstellen mit While Schleife

mydoys.de

Well-known member
ID: 84968
L
20 April 2006
2.749
125
Ich kämpfe nun schon seit einer Ewigkeit mit Google und jede menge Internet Formen herum..
Bisher irgendwie keinen Erfolg..

Zur Sache:
Ich habe eine Datenbank abfrage welche eine schleife erstellt. In dieser sollen mir mit Hilfe von Tabellen die Daten ordentlich angezeigt werden..

So etwa:
[Inhalt 1] [Inhalt 2]
[Inhalt 3] [Inhalt 4]
[Inhalt 5] [Inhalt 6]

und so weiter..
Mein Derzeitiger Code welchen ich zusammen gebastelt habe:

PHP:
<?php
 $counter = 0;
 $counter2 = 1;
echo "<html>\n<body>\n<table>\n<tr>\n";
$query = "SELECT * FROM `xxxxxx_slots` WHERE `views` > '0' ORDER BY `views` DESC";
$query = mysql_query($query);
$content = mysql_fetch_array($query);

while(isset($content[$counter])) 
{
  echo "\n<td>$content[1]</td>";
     $counter++;

 if($counter2 == 3) 
{ 
echo "\n</tr><tr>"; 

$counter2 = 1; 
}
  else { $counter2++; }
 }

echo "\n</tr>\n</table>\n</body>\n</html>";

?>

Dieser gibt mir fast richtig dieses aus:

HTML:
<html>
<body>
<table>
<tr>

<td>INHALT 1</td>
<td>INHALT 1</td>
<td>INHALT 1</td>
</tr><tr>
<td>INHALT 1</td>
<td>INHALT 1</td>
<td>INHALT 1</td>
</tr><tr>
<td>INHALT 1</td>
<td>INHALT 1</td>
<td>INHALT 1</td>
</tr><tr>
<td>INHALT 1</td>
</tr>
</table>
</body>
</html>

Wie man sehen kann eben nur fast richtig..
Was stimmt hier nicht?
Wie bekomme ich weiter Datensätze angezeigt und nicht nur den ersten?
Wat muss ich tun damit die Tabelle nur 2 Spalten bekommt?


Dankbar für jede Hilfe..

Im Anhang findet ihr:
test.php -> Das PHP Script
Tabellenstruktur.txt -> Mein "Layout" der Datenbank
Quelltext.php -> Das was angezeigt wird, derzeit.
 

Anhänge

  • test.zip
    1,1 KB · Aufrufe: 0
Zuletzt bearbeitet:
PHP:
<?php 
while(isset($content[$counter]))  
{ 
  echo "\n<td>$content[1]</td>"; 
     $counter++; 

 if($counter2 == 2)  
{  
echo "\n</tr><tr>";  

$counter2 = 1;  
} 
  else { $counter2++; } 
 } 

echo "\n</tr>\n</table>\n</body>\n</html>"; 

?>

Die Variable $counter2 verringern um nur 2 Spalten zu erzeugen, siehe Quelltext.

Um nicht immer den gleichen Datensatz anzeigen zu lassen solltest du vielleicht nicht immer nur einen Datensatz ausgeben lassen :p Außerdem müsste das der 2. Datensatz sein und nicht der erste, den du ausgeben lässt. Siehe Variable $content[1].

Man kann das sicher eleganter programmieren, aber das war ja nicht deine Frage :)
 
Die Variable $counter2 verringern um nur 2 Spalten zu erzeugen, siehe Quelltext.

Um nicht immer den gleichen Datensatz anzeigen zu lassen solltest du vielleicht nicht immer nur einen Datensatz ausgeben lassen :p Außerdem müsste das der 2. Datensatz sein und nicht der erste, den du ausgeben lässt. Siehe Variable $content[1].

Man kann das sicher eleganter programmieren, aber das war ja nicht deine Frage :)

Gut, haben wir die zeilen.. die Variable zeigt mir die 2 Position des Datensatzes an jo das soll es auch weil dort der Namen steht nur soll es dieses von alle ~60 Datensätzen machen, es steht in der schleife aber nix passiert :( :shifty:
 
Der Inhalt deiner DB Zelle steht nicht in $content[1], sondern eher in $content[$counter][1]. Die komplette Zeile ist in $content[$counter]. Wenn du $content[1] aufrufst, dann verweißt du immer auf die "erste" Zeile deiner Datenbank.


Gut, haben wir die zeilen.. die Variable zeigt mir die 2 Position des Datensatzes an jo das soll es auch weil dort der Namen steht nur soll es dieses von alle ~60 Datensätzen machen, es steht in der schleife aber nix passiert :( :shifty:
 
Wie bekomme ich weiter Datensätze angezeigt und nicht nur den ersten?

Ähm, mysql_fetch_array() liefert Dir einen Datensatz (eine Zeile). Um durch alle Zeilen zu gehen, musst Du das schon innerhalb der Schleife immer wieder aufrufen. Macht man normalerweise immer mit einem Konstrukt àla

PHP:
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) {
   echo $row[...];
}

siehe mysql_fetch_array().

Eine Anmerkung sei mir gestattet: SELECT * in Verbindung mit mysql_fetch_array() ist sehr gefährlich. Es gibt keinen wirklichen Garant in welcher Reihenfolge Du die Spalten zurückbekommst, das kann sich ja durchaus auch mal ändern. Ich würde Dir mindestens zu einem mysql_fetch_assoc() raten, besser noch das SELECT * ersetzen durch ein SELECT auf den Spalten die Du wirklich brauchst.


*edit* sehe gerade, dass mysql_fetch_array beides liefert, numerische und assoziative Indizes. Würde immer über die assoziativen Indizes zugreifen, also $row["feldname"] statt $row[23].
 
... Wenn du $content[1] aufrufst, dann verweißt du immer auf die "erste" Zeile deiner Datenbank.

Auf eine Zeile in der Datenbank - nein. Eher auf das zweite Array-Element, denn Array's fangen immer bei 0 an. Was in dem Element steht auf das du verweist, ist egal - es kann ein Object im allgemeinen sein - welches eine Resource, ein Array, ein String, quasi ein Datentype mit Inhalt ist.
 
So erstmal danke! (mir brennt der kopf :) )

ich habe es zu 98% hinbekommen so wie ich es wollte habe nur noch eine Fehlermeldung die mich stört..

der Abolute neue Code:

PHP:
<?php 
  $max_cols = 2;  
  $col_count = 1; 

  $abfrage = "SELECT `name`,`text`,`platform`,`icon`,`views` FROM `slots4u_slots` WHERE `views` > '0' ORDER BY `views` DESC";
  $ergebnis = mysql_query($abfrage);
  while($row = mysql_fetch_object($ergebnis))
    {
  echo "<table><tr>\n"; 
  for ($z = 0; $z < $row; $z++) { 
    $row = mysql_fetch_array($ergebnis); 

    if ($col_count > $max_cols) { 
      echo "</tr>\n<tr>\n"; 
      $col_count = 1; 
    }    

    echo ("<td>".$row['name']."</td>\n"); 

    $col_count += 1; 
  } 
 
  for ($i = $col_count-1; $i < $max_cols; $i++) { 
    echo "<td></td>\n"; 
  } 
  echo "</tr></table>\n"; 

    }
?>

Soweit alles Prima bis auf:
Notice: Object of class stdClass could not be converted to int in /var/www/web260/html/slots4u.de/test.php on line 15

Zeile 15 :
PHP:
  for ($z = 0; $z < $row; $z++) {

Es wird an $row liegen weil ich dieses als numerischen Wert behandle es aber am ende keiner ist.. wie würde denn die Alternative dazu aussehen?
 
Lies nochmal nach was mysql_fetch_object macht, da hast Du glaube ich etwas missverstanden.


Du hast eine while-Schleife in der Du mit mysql_fetch_object Zeilenweise die Daten abholst, drin hast Du noch einmal eine For-Schleife... die brauchst Du schon mal gar nicht. Eine while-Schleife die Zeile für Zeile abholt, innen drin ist nichts weiter als die Ausgabe der Daten für die aktuelle Zeile.


Wie ich bereits oben schrieb:

PHP:
$result = mysql_query($query);
while ($row = mysql_fetch_assoc($result)) {
     // aktuelle Zeile ausgeben: beginne mit <tr>, ende mit </tr>, dazwischen eine <td>...</td> pro Spalte
     // auf Felder assoziativ zugreifen, also $row["feldname"]
}

... das reicht völlig aus.
 
Du hast eine while-Schleife in der Du mit mysql_fetch_object Zeilenweise die Daten abholst, drin hast Du noch einmal eine For-Schleife... die brauchst Du schon mal gar nicht. Eine while-Schleife die Zeile für Zeile abholt, innen drin ist nichts weiter als die Ausgabe der Daten für die aktuelle Zeile.

...........................

... das reicht völlig aus.

Ich hatte es wie oben beschrieben Probiert aber dieses führte nicht zum Erfolg, denn ich benötige ja eine Mehrspaltige Tabelle die anhand von vorhanden Datenbank setzen erstellt wird. Wobei wie oben beschrieben es immer nur 2 nebeneinander sein sollen.

Das Bsp. von dir zeigte mir entweder nur eine 1 Einspaltige oder zu ~ alles aus der Datenbank auf einer zeile Ergebnis..

Erste ergebniss|Zweite ergebniss
Drittes ergebniss|Viertes ergebniss
... immer so weiter bis alle die passen angezeigt werden..


EDIT
Lösung gefunden!

1. Datenbank inhalt zählen mit
PHP:
$menge = mysql_num_rows($ergebnis);
Betroffene Zeile ersetzen mit
PHP:
for ($z = 0; $z < $menge; $z++) {
Also das $row tauschen mit $menge ...
Fertig :)
 
Zuletzt bearbeitet: