Tabellen horizontal, nicht vertikal ausgeben

Alles, was PHP betrifft, kann hier besprochen werden.

Tabellen horizontal, nicht vertikal ausgeben

Postby CHRISS76 » 31. December 2004 09:56

Hallo,

ich habe mal wieder ein Anfängerproblem!

Ich möchte gerne Rubriken für Links mit PHP ausgeben.
Leider werden die Rubriken nur vertikal untereinander aufgeführt, ich möchte aber, dass immer 2 Rubriken horizontal nebeneinander stehen, und dann kommen erst die nächsten 2 Rubriken darunter.

alt:
Rubrik1
Beschreibung1

Rubrik2
Beschreibung2

Rubrik3
Beschreibung3
........

so soll es sein:
Rubrik1 | Rubrik2
Beschreibung1 | Beschreibung2

Rubrik3 | ......
Beschreibung3 | ......

Kann mir da jemand helfen?

Grüsse und Danke Chris


Code: Select all
<?php
                 while ($zeile = mysql_fetch_array($result1, MYSQL_BOTH))
   {
                 ?>
                 <table width="240" border="0">
                      <tr>
                   <td width="40"><img src="image/links/ordner.gif" width="40" height="34"></td>
                        <td width="190"><span class="Stil1"><?php echo ($zeile[1]); ?></span></td>
                      </tr>
                      <tr>
                        <td>&nbsp;</td>
                        <td><span class="Stil1"><?php echo ($zeile[2]); ?></span></td>
                   </tr>
                    </table>
                  
                        <?php

   }
                 ?>
CHRISS76
 
Posts: 27
Joined: 19. August 2004 14:38

Postby Stefan » 31. December 2004 17:36

Du brauchst eine kleine Schleife, die dir soviele "Spalten"(td) aneinander setzt, wie Du es gerne hättest. Wenn Du z.B zwei Spalten möchtest, aber z.B neun Einträge, so wird Deinen Tabellen nicht gültig sein, da eine Tabledata Zelle einfach fehlt.

1. Ermittele die Gesamtanzahl der Einträge.
2. Bestimme wieviele Spalten Du haben möchtetst. (hier also zwei)
3. Ermittele aus den vorhanden Einträgen und den vorgegebenen Spalten die Anzahl an leeren Tabelenzellen.

4. Baue die Tabelle aus den ermittelten Werten.

Code: Select all
<?PHP

error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

 /*
 // Tabelle aus Datenbankinhalte bauen.
 // 1. Ermittle Anzahl an Einträgen "$Anzahl['elemente']", die in die Tabelle sollen.
 // 2. Ermittle die Tabelleninformation. Wieviele Spalten, Zeilen, Anzahl leerer "td" "<td>&nbsp;</td>"
 // 3. Baue die Tabelle.
 */

 /*
 // 1. Anzahl der Elemente bestimmen
 */

 $Anzahl['elemente'] = 13;
 $Anzahl['spalten']  = 2;
 
 /*
 //   2. ermittele Tabellenwerte
 */

  // Aufgerundet die Anzahl der resultierenden Zeilen
  $Anzahl['zeilen'] = ceil($Anzahl['elemente'] / $Anzahl['spalten']);

   // Gesamtanzahl der resultierenden Zellen
  $Anzahl['zellen'] = $Anzahl['spalten'] * $Anzahl['zeilen'];

  // Anzahl an leeren "<td>&nbsp;</td>" Zellen ermitteln.
  $Anzahl['leere_zellen'] = $Anzahl['zellen'] - $Anzahl['elemente'];

  /*
  // 3. Baue Tabelle mit den ermittelten Informationen.
  // Setze Tabellenzähler auf "1", damit nicht "0/3==0" eintritt.
  // Wird benötigt um neue Zeile aufzumachen.
  */
  $zaehler['tabelle'] = 1;

  // schreibe Tabellenkopf
  echo "<table border=\"1\" cellpadding=\"1\" cellspacing=\"0\">\n";
  echo "<tr>\n";

  /*
  // erzeuge die Zellen.
  */
  for($i=0;$i < $Anzahl['elemente'];$i++)
  {
    // öffen die Zelle
     echo "  <td>\n";
     // schreibe die Elemente in die Zelle
     echo "    ".$i."\n";
     // schliesse Zelle ab.
     echo "  </td>\n";

     /*
     // Wenn Zellenanzahl pro Spalte erreicht ist schreibe "</tr>\n<tr>\n".
     // Ist allerdings auch der letzte Eintrag erreicht, mache kein neue Zeile auf.
     // überlasse das Zeilen Ende dem "$Anzahl['leere_zellen']" auffüller.
     */
  if($zaehler['tabelle'] % $Anzahl['spalten'] == 0 AND
     $zaehler['tabelle'] != $Anzahl['zellen']):
      echo "</tr>\n";
      echo "<tr>\n";
  endif;

     // erhöhe Tabellenzähler um 1
     $zaehler['tabelle']++;

  } // ENDE :: for($i=0;$i < $Anzahl['elemente'];$i++)

  /*
  // fülle die Differenz zwischen "$Anzahl['zellen']"
  // und tatsächlichen Einträgen "$Anzahl['elemente']" mit "<td>&nbsp;</td>".
  // Ist der Wert "$Anzahl['leere_zellen']" = "0".
  // D.h es gibt keine neue Zeile mehr, dann schreib auch keine.
  */
  if($Anzahl['leere_zellen'] != 0 )
  {
    for($x=1; $x <= $Anzahl['leere_zellen'];$x++){
    /**
    * Eine leere Zellen pro Eintrag.
    * Wenn für einen Eintrag mehrere Zellen benutzt werden, dann
    * hier anpassen.
    */
    echo"  <td>\n    &nbsp;\n  </td>\n";
     }
  }

  // schreibe Tabellenende.
  echo "</tr>\n";
  echo "</table>\n";

?>


Die Elemente sind bei Dir jetzt nicht nummerisch, sonder irgendwelche Datenbankeinträge. Macht ja nix, funktioniert hier genauso.

viel Erfolg.

PS: ist mir klar, das das vielleicht ein bisschen zu komplex wirkt, aber ich helf Dir gerne weiter.

ciao, und guten Rutsch
Stefan
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Rückfrage

Postby CHRISS76 » 01. January 2005 11:15

Hallo Stefan,

ich wünsche Dir ein gutes neues Jahr und vielen Dank für Deine Antwort.

Ich habe mich mal so durchgekämpft und verstehe etwas nicht.

Anzahl der Elemente habe ich folgendermaßen abgebildet:

$Anzahl['elemente'] = mysql_num_rows($result1) * 2;

Jeder Datensatz aus der Datenbank bringt 2 wichtige Felder mit, deshalb habe ich die Anzahl der Datensätze mit 2 multipliziert und dann habe ich die Anzahl der Elemente.

Mein Problem ist jetzt aber, wie gebe ich die Werte der Datenbankfelder in Deinem Coding aus?

bsp: 1. Datensatz sieht so aus:

Feldnamen: id|kategorie|beschreibung
Feldinhalte: 1|Sonstiges|Alle Links, die sonst nirgendwo reinpassen

wie und wo mache ich jetzt in Deinem Coding einen Loop über meine SQL-Ergebnisse (z.B. mysql_fetch_array($result1, MYSQL_BOTH)) und gebe oben genannte Daten folgendermaßen aus???:

Kategorie1 | Kategorie2
Beschreibung1 | Beschreibung2

Kategorie3| ......
Beschreibung3 | ......

Ich habe Dein Coding ausprobiert und es funktioniert auch mit den 13 Zahlen in 2 Spalten, aber wie baue ich jetzt dort die Datensatzausgabe ein?

Das ist mir ein Rätsel ?!

Nochmals vielen Dank im voraus

Grüsse Chris
CHRISS76
 
Posts: 27
Joined: 19. August 2004 14:38

Postby Stefan » 02. January 2005 23:50

Morsche Chris,

dachte mir schon das es Dich evtl. vor noch mehr Rätsel stellt :-)

Der Quatsch ist einfach ein doofer Tabellenbauer, die Zellen kannst Du natürlich füllen wie Du willst.

Leider hab ich jetzt grad überhaupt kein Bock da was zu machen. Morgen abendend bin ich hoffentlich wieder ansprechbar.

aber schonmal vorweg.

Anzahl[Elemente] ist in Deinen Fall die Anzahl an Datensätzen aus der Datenbank (mysql_num_rows($query)).

Nicht mit zwei Multiplizieren, Dein Datensatz(einer) besteht halt aus x Feldern

und an der Stelle wo die Tabellenzellen aus gegeben werden versuch mal folgendes
Code: Select all
  /*
  // erzeuge die Zellen.
  */
  for($i=0;$i < $Anzahl['elemente'];$i++)
  {
    // öffen die Zelle
     echo "  <td>\n";



     // schreibe die Elemente in die Zelle
   

     echo $zeile['Beschreibung']".\n";
     echo $zeile['kategorie']."\n";

   


 // schliesse Zelle ab.
     echo "  </td>\n";



Es ginge natürlich auch noch einfacher,

DB Anfrage

while(Datensätze da)
{
schleife,
jeweils zwei <td>Datensätze</td>
}

zeile schliesssen </tr>

Allerdings wird Deine Quelltext bei ungeraden Zahlen nicht mehr gültig sein.


Gut Möglichen, das ich jetzt auch nicht richtig liege, Morgen sehen wir weiter, gute Nacht
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

ich weiss nicht weiter!

Postby CHRISS76 » 03. January 2005 20:47

Hallo Stefan,

tut mir leid, aber ich totaler Anfänger.
Dein Coding unten funktioniert auch gut, aber wie und wo baue ich
jetzt noch eine Schleife ein, die die SQL-Datensätze ausgibt?! Denn ich habe ja quasi unendlich Datensätze, die in den bereits erstellten Zeilen und Spalten eingefügt werden müssen.

$zeile = mysql_fetch_array($result1, MYSQL_BOTH)

echo $zeile[kategorie];
echo $zeile[beschreibung];


Anzahl der Elemente würde ich schon mit 2 multiplizieren, weil ich ja bei jedem Datensatz nur die Inhalte von 2 Feldern ausgeben will, oder??

Grüsse und nochmals Danke im voraus

Chris


Code: Select all
<?PHP

error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

 /*
 // Tabelle aus Datenbankinhalte bauen.
 // 1. Ermittle Anzahl an Einträgen "$Anzahl['elemente']", die in die Tabelle sollen.
 // 2. Ermittle die Tabelleninformation. Wieviele Spalten, Zeilen, Anzahl leerer "td" "<td>&nbsp;</td>"
 // 3. Baue die Tabelle.
 */

 /*
 // 1. Anzahl der Elemente bestimmen
 */

 $Anzahl['elemente'] = 13;
 $Anzahl['spalten']  = 2;
 
 /*
 //   2. ermittele Tabellenwerte
 */

  // Aufgerundet die Anzahl der resultierenden Zeilen
  $Anzahl['zeilen'] = ceil($Anzahl['elemente'] / $Anzahl['spalten']);

   // Gesamtanzahl der resultierenden Zellen
  $Anzahl['zellen'] = $Anzahl['spalten'] * $Anzahl['zeilen'];

  // Anzahl an leeren "<td>&nbsp;</td>" Zellen ermitteln.
  $Anzahl['leere_zellen'] = $Anzahl['zellen'] - $Anzahl['elemente'];

  /*
  // 3. Baue Tabelle mit den ermittelten Informationen.
  // Setze Tabellenzähler auf "1", damit nicht "0/3==0" eintritt.
  // Wird benötigt um neue Zeile aufzumachen.
  */
  $zaehler['tabelle'] = 1;

  // schreibe Tabellenkopf
  echo "<table border=\"1\" cellpadding=\"1\" cellspacing=\"0\">\n";
  echo "<tr>\n";

  /*
  // erzeuge die Zellen.
  */
  for($i=0;$i < $Anzahl['elemente'];$i++)
  {
    // öffen die Zelle
     echo "  <td>\n";
     // schreibe die Elemente in die Zelle
     echo "    ".$i."\n";
     // schliesse Zelle ab.
     echo "  </td>\n";

     /*
     // Wenn Zellenanzahl pro Spalte erreicht ist schreibe "</tr>\n<tr>\n".
     // Ist allerdings auch der letzte Eintrag erreicht, mache kein neue Zeile auf.
     // überlasse das Zeilen Ende dem "$Anzahl['leere_zellen']" auffüller.
     */
  if($zaehler['tabelle'] % $Anzahl['spalten'] == 0 AND
     $zaehler['tabelle'] != $Anzahl['zellen']):
      echo "</tr>\n";
      echo "<tr>\n";
  endif;

     // erhöhe Tabellenzähler um 1
     $zaehler['tabelle']++;

  } // ENDE :: for($i=0;$i < $Anzahl['elemente'];$i++)

  /*
  // fülle die Differenz zwischen "$Anzahl['zellen']"
  // und tatsächlichen Einträgen "$Anzahl['elemente']" mit "<td>&nbsp;</td>".
  // Ist der Wert "$Anzahl['leere_zellen']" = "0".
  // D.h es gibt keine neue Zeile mehr, dann schreib auch keine.
  */
  if($Anzahl['leere_zellen'] != 0 )
  {
    for($x=1; $x <= $Anzahl['leere_zellen'];$x++){
    /**
    * Eine leere Zellen pro Eintrag.
    * Wenn für einen Eintrag mehrere Zellen benutzt werden, dann
    * hier anpassen.
    */
    echo"  <td>\n    &nbsp;\n  </td>\n";
     }
  }

  // schreibe Tabellenende.
  echo "</tr>\n";
  echo "</table>\n";

?>
CHRISS76
 
Posts: 27
Joined: 19. August 2004 14:38

Postby Stefan » 04. January 2005 01:05

Grüß Gott,

Also der Tabellenkram ist eigentlich nur dazu da, um ein gültige Htmltabelle um Deine dynamischen Inhalten zu bauen.

Kurz um, Deine Schleife muss innerhalb des Table Elemetes aktiviert werden.

Nein, Du must keinen Ergebisse Multiplizieren, Ein einziger Datensatz besteht bei Dir halt aus zwei Werten.

Ich hab da jetzt mal was zusammengeswurschdelt, das es Dir vielleicht einfacher macht.
Das Ganze besteht jetzt aus drei Teilen.


1. Erster Teil besteht aus Datenbankanfrage und bilden der Zelleninhalte
2. Zweiter Teil besteht aus einer Funktion, die die Tabelle dann mit Deinenen Inhalten zusammen baut.
3. Als drittes, kommt halt der Funktionsaufruf

Am Anfang musst Du natürlich Deine Verbindungsdaten eintragen

An der Stelle richtetst Du den Inhalt für jeweils eine Zelle her. Du bist völlig frei in der Gestaltung.

Code: Select all
// Erstelle die Inhalte einer Zelle
while($zeile = mysql_fetch_array($result))
{
  $Inhalt[] =

  // Hier die Inhalte einer Zelle bestimmen wie Du es gerne hättest.


  "<span class='name'>". $zeile['kategorie'] ."</span>\n<br>\n
  <span class='beschreibung'>".$zeile['beschreibung']."</span>\n<br>\n";


  // Ende!
}

Der Inhalt wird in einem Array gespeichert und in der Funktion weiterverarbeitet. In der Funkion musst Du auch die Anpassungen für das Aussehen der Tabelle vornehmen.

Aber Achtung, der Tabellenbauer ist nicht perfekt, liefert aber wenn man in nicht mutwillig verarscht eine saubere Tabelle. Natürlich müssten da vielleicht auch noch ein paar Wächter rein oder eine bessere Struktur her. Womöglich mit mehr Templatecharakter usw. Ganz zu schweigen davon, gibt es sogar eine Pearklasse für sowas glaub ich mal.
Also geh vorsichtig damit um.

Versuchs halt mal.
Code: Select all
<?PHP

######## Erster Teil

error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);

$cfg['DB_verbindung'] = mysql_connect('localhost','root','xxx')
                          or die ('kein Server');

$cfg['DB_auswahl']    = mysql_select_db('test',$cfg['DB_verbindung'])
                          or die ('Keine Datenbank');

$Anzahl['ausgabe_limit']  = false; // Wenn die Anzahl der Datensätze
                                   // begrenzt sein soll, mit numerischem
                                   // Wert festlegen. Kannste später zum
                                   // blättern umbauen

// Erstelle die Datenbankabfrage
$sql = 'SELECT
          `kategorie`,
          `beschreibung`
        FROM
          `rubriken`';
// ergänze die DBAnfrage um das Limit falls gesetzt
if($Anzahl['ausgabe_limit'])
  $sql .=" WHERE 1 LIMIT 0,".$Anzahl['ausgabe_limit'];

// Halte das Ergebnis fest
$result = mysql_query($sql,$cfg['DB_verbindung'])
            or die (mysql_error().'<br>'.$sql);

// Erzeuge ein Array, in dem die Zelleninhalte gespeichert werden.
$Inhalt = array();

// Erstelle die Inhalte einer Zelle
while($zeile = mysql_fetch_array($result))
{
  $Inhalt[] =

  // Hier die Inhalte einer Zelle bestimmen wie Du es gerne hättest.


  "<span class='name'>". $zeile['kategorie'] ."</span>\n<br>\n
  <span class='beschreibung'>".$zeile['beschreibung']."</span>\n<br>\n";


  // Ende!
}




##### zweiter Teil

/**
 * Die Funktion kannnst Du natürlich in eine andere Datei auslagern
 * und mit include(tabellen_funktion.inc.php); wieder in die aktuelle
 * Datei reinholen. Die Formatierung der Tabelle und der Zelle musst Du
 * hier vornehmen
 */


function baue_tabelle($Inhalt)
{

// Anzahl der Spalten
$Anzahl['spalten']        = 2;     // Anzahl der gewünschten Spalten

// Formatierung der Tabelle
$format['tabelle']      = "<table class='tabelle' width='450' border='1'>\n";
$format['zeile']        = "  <tr class='zeile'>\n";
$format['zelle']        = "    <td class='zelle'>\n\n";
$format['leere_zelle']  = "&nbsp;"; // Wie soll die leeren/leere Zelle gefüllt sein?


// Anzahl der Gesamtmenge an Datensätzen
$Anzahl['elemente'] =  count($Inhalt);
// Aufgerundet die Anzahl der resultierenden Zeilen
$Anzahl['zeilen'] = ceil($Anzahl['elemente'] / $Anzahl['spalten']);
// Gesamtanzahl der resultierenden Zellen
$Anzahl['zellen'] = $Anzahl['spalten'] * $Anzahl['zeilen'];
// Anzahl an leeren "<td>&nbsp;</td>" Zellen ermitteln.
$Anzahl['leere_zellen'] = $Anzahl['zellen'] - $Anzahl['elemente'];
/*
// 3. Baue Tabelle mit den ermittelten Informationen.
// Setze Tabellenzähler auf "1", damit nicht "0/3==0" eintritt.
// Wird benötigt um neue Zeile aufzumachen.
*/
$zaehler['tabelle'] = 1;

  // schreibe Tabellenkopf
  echo $format['tabelle'];
  echo $format['zeile'];

for($i=0;$i < count($Inhalt);$i++)
{
  echo $format['zelle'];
  echo $Inhalt[$i]."\n\n";
  echo "    </td>\n";
     /*
     // Wenn Zellenanzahl pro Spalte erreicht ist schreibe "</tr>\n<tr>\n".
     // Ist allerdings auch der letzte Eintrag erreicht, mache kein neue Zeile auf.
     // überlasse das Zeilen Ende dem "$Anzahl['leere_zellen']" auffüller.
     */
  if($zaehler['tabelle'] % $Anzahl['spalten'] == 0 AND
     $zaehler['tabelle'] != $Anzahl['zellen']):
      echo "</tr>\n";
      echo "<tr>\n";
  endif;

     // erhöhe Tabellenzähler um 1
     $zaehler['tabelle']++;

  } //while($zeile = mysql_fetch_array($result1))

  /*
  // fülle die Differenz zwischen "$Anzahl['zellen']"
  // und tatsächlichen Einträgen "$Anzahl['elemente']" mit "<td>&nbsp;</td>".
  // Ist der Wert "$Anzahl['leere_zellen']" = "0".
  // D.h es gibt keine neue Zeile mehr, dann schreib auch keine.
  */
  if($Anzahl['leere_zellen'] != 0 )
  {
    for($x=1; $x <= $Anzahl['leere_zellen'];$x++){
    /**
    * Eine leere Zellen pro Eintrag.
    * Wenn für einen Eintrag mehrere Zellen benutzt werden, dann
    * hier anpassen.
    */
    echo"<td>\n".$format['leere_zelle']."</td>\n";
     }
  }

  // schreibe Tabellenende.
  echo "</tr>\n";
  echo "</table>\n";
 
}

##################### FUNKTION ENDE
?>



<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">

<html lang="de">
<head>
  <title>Tabellenbauer</title>
  <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  <style type="text/css">
    span.name{font-size:100%;font-weight:bold;}
    span.beschreibung{font-size:80%}
  </style>
</head>

<body>

<?PHP

###### Dritter Teil
// Wenn keine Daten vorhanden, dann baue auch keine Tabelle
if(count($Inhalt) !=0)
  baue_tabelle($Inhalt,$anzahl);
else
 echo "keine Daten vorhanden";

?>


</body>
</html>


ciao, Stefan
Last edited by Stefan on 04. January 2005 21:13, edited 1 time in total.
User avatar
Stefan
 
Posts: 475
Joined: 26. December 2002 22:36
Location: Mitten in der sonnigen Südpfalz

Danke

Postby CHRISS76 » 04. January 2005 20:06

Hallo Stefan,

Du bist genial,

vielen Dank, jetzt funktioniert es perfekt und ich habe es auch wohl verstanden.

Also vielen Dank nochmal

Grüsse Chris
CHRISS76
 
Posts: 27
Joined: 19. August 2004 14:38


Return to PHP

Who is online

Users browsing this forum: No registered users and 14 guests