[PHP] Werte aus DB in Tabelle übergeben

M

Mr. Snoot

Gast
Hio,

ich möchte diese Übersicht gerne aus einer DB generieren. Die DB existiert schon, aber jetzt steh ich auf dem Schlauch, wie ich die Begriffe an die richtigen Stellen in der Tabelle bekomme.

Die Grundstruktur mit der alphabetischen Einteilung hab ich
PHP:
<?php

$i = 0;

echo "<table border=\"1\">
	    <tr>
	      <td colspan=\"4\">Übersicht</td>";

#$query = "SELECT wort FROM lexikon";
#$result = mysql_query($query);
#while($row = mysql_fetch_object($result)) {

  for($k=65;$k<=90;$k++) { /* Zählen von A bis Z */
    
    if(($i%4) == 0) { /* Wenn 4 Spalten erreicht sind eine neue Zeile anfangen */
        echo "\t</tr>\n\t<tr>\n";
    }
        echo "\t\t<td>".chr($k)."</td>\n"; /* Ausgabe der Buchstaben */
    $i++;
  }

  if(($i%4) == 0) { /* Wenn in der letzten Zeile 4 Spalten sind, Tabelle beenden */
    echo "\t</tr>\n</table>\n\n";
  }
  
  else /* Andernfalls colspan für die letzte Zelle berechnen */
  {
  echo "\t\t<td colspan=\"".(4-($i%4))."\">&nbsp;</td>\n\t</tr>\n</table>\n\n";
  }

#}

?>
Jetzt müsst ich aber irgendwie bei jedem Buchstaben so viele Wörter wie vorhanden (aber maximal 3) ausgeben. Irgendwo wirds wohl mit susbtr($row->wort,0,1) == chr(k) (o.ä.) weitergehen, nur wo :confused_alt:


Vielleicht hat noch jemand den Durchblick.
 
Zuletzt bearbeitet:
Müsste vom Prinzip her so aussehen. Du musst dann noch die Datenbankabfragen anpassen und den Quelltext nen bisschen erweitern, ich bin ein bisschen tippfaul ;)
PHP:
<table>
<tr>
<?php
$i = 1;
for($k=65;$k<=90;$k++) 
{
  echo '<td><b>'.chr($k).'</b><br />';
  mysql_query("SELECT * .... WHERE AnfangsbuchstabeBuchstabe = '".chr($k)." LIMIT 0,3'); // Halt die entsprechende Abfrage 
  while($row = ...) //mysql_abfrage durchlaufen
  {
    echo '<a href ...>'.$row->Name.'</a><br />';
  }
  echo '<a href="...?buschtabe='.chr($k).'>mehr...</a></td>';
  if($i %4 == 0)
    echo '</tr><tr>';
  $i++;
}
if($i%4 != 0)
  echo '<td colspan="'.($i%4).'">&nbsp;</td>';
?>
</tr></table>
Code ist ungetestet
 
V1tzl1 schrieb:
bisschen tippfaul ;)
[..]
Code ist ungetestet
Man merkts, aber das macht ja nichts :D

Ich war schon dabei zig Schleifen in einander zu verschachteln um an der richtigen Stelle das richtige Wort zu erhalten, aber ich denke dadurch wäre der Code zehn Mal so lang geworden wie deiner (mein Anfang war ja schon länger).


Aber das läuft jetzt einwandfrei, absolut perfekt V1tzl1. Vielen Dank :)


Jetzt bräucht ich nur noch eins: die Gesamtzahl aller Worte mit dem selben Anfangsbuchstaben. Wenn ich mir das aber mit count(substr($row->wort,0,1) == chr($k)) ausgeben lasse, erhalte ich überall nur 1 als Ergebnis!?
 
Mit count(substr($row->wort,0,1) == chr($k)) zählst auch nur die Wahrheitswerte bei einem einzigen Vergleich.

Ich kann kein PHP, vielleicht gibt es für resultSets einer SQL-Abfrage eine Funktion, mit der man die Anzahl der zurückgegebenen Zeilen ermitteln kann.

Ansonsten hilft wahrscheinlich nur, in der while-Schleife einen Zähler hochlaufen zu lassen.
 
Jo, das stimmt natürlich. Da wäre sowas wie count($row->wort) angesagt. Ist nur die Frage, ob ich dazu noch ne weitere DB-Abfrage brauche, da die jetzige ja bei 3 Ausgaben aufhört.
 
hmm also eigentlich ists net so gut SQL-Abfragen innerhalb einer Schleife zu machen. Und mit Counter wird auch dadurch etwas aufwendiger.

Sowas in der Art geht wohl nicht?
Nicht getestet, kann sein, dass bisserl was falsch ist, aber so als Denkansatz und weitere Möglichkeit, kann man sicher noch weiter optimieren. ;)

PHP:
<?

$s=0; # Spaltenzähler
$mspalte = ''; # Container für alle Einträge einer Spalte
$mchar=''; # Merkbuchstabe
$mchar_cnt = 0; # Zähler DS einer Spalte
$max_items = 3; # Maximale Einträge je Spalte/ Buchstabe, 0 = unbegrenzt

echo "<table border=\"1\">
        <tr>
          <td colspan=\"4\">Übersicht</td>
        </tr>";

$query = "SELECT wort, UPPER(LEFT(wort, 1)) chr FROM lexikon ORDER by wort";
$result = mysql_query($query);
while($row = mysql_fetch_object($result)) {
        
        if($mchar==''){
                $mchar = $row->chr;
        }    
        
        if($mchar == $row->chr){
            
                 $mchar_cnt++; # Anzahl hochzählen
                
                if($mchar_cnt > $max_items && $max_items > 0){
                        if($mchar_cnt == ($max_items+1)){
                                    $mspalte .= '<BR><a href>...mehr</a>';
                        }    
                        continue; # wenn mehr Einträge/ Spalte als $max_items, dann Durchlauf überspringen und nächsten DS lesen usw.
                }
                else{
                        $mspalte .= '<br><a href ...>'.$row->wort.'</a>'; # Einträge mit gleichem Buchstaben temporär merken
                }        
        }        
        
        if($mchar != $row->chr){
                
                $s++; # Spalte hochzählen
                
                if($s > 4) {
                        $s=1;
                        echo "</tr>";
                }        
                                
                if($s==1){
                        echo "<tr>";
                }    
                
                echo '<td><a href ...><B>'.$mchar.'</B></a> ('.$mchar_cnt.')<br>'.$mspalte.'</td>'; # Ausgabe vorige gemerkte Spalte inkl. Anzahl
                
                $mchar = $row->chr;
                $mchar_cnt=0;
                $mspalte = '';
        }    
}

# Nachlauf für letzten Buchstaben

if(mysql_num_rows($result) > 0){ # nur wenn while schleife überhaupt durchlaufen

        if($mspalte != ''){ # falls letzte spalte noch nicht ausgegeben
        
                $s++;
                
                if($s > 4) {
                        $s=1;
                        echo "</tr>";
                }        
                                
                if($s==1){
                        echo "<tr>";
                }    
                    
                echo '<td><a href ...><B>'.$mchar.'</B></a> ('.$mchar_cnt.')<br>'.$mspalte.'</td>';
        }
    
        if($s < 4){
                echo '<td '.($s > 1 ? 'colspan='.(4-$s) : '').'>&nbsp;</td>';        
        }    

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

?>

Edit:
Hab noch paar Faselfehler geändert. ^^ Egal müsste sowieso erstmal getestet usw. werden.

Edit 2:
Hab noch wie gewünscht die Eintragsbegrenzung/ Spalte eingebaut.
Probieren obs so geht, ansonsten Fehlerbeseitigung oder Plan B. :)
 
Zuletzt bearbeitet:
Also was schon mal sehr gut ist, dass nur "mehr ..." angezeigt wird, wenns auch "Mehr" gibt.

Allerdings fällt mir grade auf, dass bei allen Buchstaben, außer bei "A" je ein Wort fehlt, und zwar immer das erste (in alphabetischer Reihenfolge gesehn). Zudem dürften auch Buchstaben gezeigt werden, bei denen kein Wort vorhanden ist, die werden im Moment weggelassen.

Aber soweit sieht das schon mal sehr gut aus :)

edit: was war noch mal Plan B? :D
 
Deine nichtvorhandenen Buchstaben haben alles verkompliziert. *Grrrr* ;)
Probier mal das in etwa. Vllt. haut ja jetzt auch garnix mehr hin und ich hab mich total verheddert. *hehe*

PHP:
<?

$max_items = 3; # Maximale Einträge je Spalte/ Buchstabe, 0 = unbegrenzt
$max_spalten = 4; # Spaltenanzahl je Zeile

$s=0; # Spaltenzähler
$mspalte = ''; # Container für alle Einträge einer Spalte
$mchar=''; # Merkbuchstabe
$mchar_cnt = 0; # Zähler DS einer Spalte
$k=65 # chars lückenlos checken, A-Z

echo "<table border=\"1\">
        <tr>
          <td colspan=\"".$max_spalten."\">Übersicht</td>
        </tr>";

$query = "SELECT wort, UPPER(LEFT(wort, 1)) chr FROM lexikon ORDER by wort";
$result = mysql_query($query);
while($row = mysql_fetch_object($result)) {
        
        if($mchar==''){
                $mchar = $row->chr;
        }    
              
        if($mchar == $row->chr){
            
                $mchar_cnt++; # Anzahl hochzählen
                
                if($mchar_cnt > $max_items && $max_items > 0){
                        if($mchar_cnt == ($max_items+1)){
                                    $mspalte .= '<BR><a href>...mehr</a>';
                        }    
                        continue; # wenn mehr Einträge/ Spalte als $max_items, dann Durchlauf überspringen und nächsten DS lesen usw.
                }
                else{
                        $mspalte .= '<br><a href ...>'.$row->wort.'</a>'; # Einträge mit gleichem Buchstaben temporär merken
                }        
        }        
        else{
                        $mk = ord($mchar);
                        while($k <= $mk){
                        $s++;
                        if($s > $max_spalten) {
                             $s=1;
                             echo "</tr>";
                        }        
                         if($s==1){
                            echo "<tr>";
                        }                                   
                            
                                if($k == $mk){
                                         echo '<td><a href ...><B>'.$mchar.'</B></a> ('.$mchar_cnt.')<br>'.$mspalte.'</td>'; # Ausgabe vorige gemerkte Spalte inkl. Anzahl
                                }         
                                else {    
                                        echo '<td><a href ...><B>'.chr($k).'</B></a> (0)<br>Keine Einträge</td>';
                                }
                                $k++;        
                        }

                $mspalte = '<br><a href ...>'.$row->wort.'</a>'; # Einträge mit gleichem Buchstaben temporär merken
                $mchar = $row->chr;
                $mchar_cnt=1;
        }    
}

# Nachlauf für letzten Buchstaben

if(mysql_num_rows($result) > 0){ # nur wenn while schleife überhaupt durchlaufen
                        
        $mk = ord($mchar);
        while($k <= 90){
              $s++;
              if($s > $max_spalten) {
                      $s=1;
                       echo "</tr>";
              }        
              if($s==1){
                       echo "<tr>";
              }                                   
                            
                    if($k == $mk){
                             echo '<td><a href ...><B>'.$mchar.'</B></a> ('.$mchar_cnt.')<br>'.$mspalte.'</td>'; # Ausgabe vorige gemerkte Spalte inkl. Anzahl
                    }         
                    else {    
                            echo '<td><a href ...><B>'.chr($k).'</B></a> (0)<br>Keine Einträge</td>';
                    }        
                    $k++;
        }

        if($s < $max_spalten){
                echo '<td '.($s > 1 ? 'colspan='.($max_spalten-$s) : '').'>&nbsp;</td>';        
        }    

        echo "</tr>";    
}
else{
            echo '<tr><td colspan='.$max_spalten.'>Keine Einträge vorhanden</td></tr>';
    
}    
        
echo "</table>";        

?>
Edit:
Habe noch aus Langeweile die Spaltenanzahl variabel gemacht, also kann man oben einstellen, max. Einträge/Spalte und Anzahl Spalten/ Zeile
 
Zuletzt bearbeitet:
Was soll ich sagen, es wird schon wärmer :D

Also, soweit ich das sehe sind alle Begriffe vorhanden bzw. werden gezählt, allerdings fehlt bei jedem ersten Wort in der Übersicht - bis auf das A wieder - der Link, den ich bei $mspalte .= '<br><a href ...>'.$row->wort.'</a>';.

Ansonsten scheint alles perfekt zu passen.
Deine nichtvorhandenen Buchstaben haben alles verkompliziert.
Wie gesagt, die dürfen auch vorkommen - müssen aber nicht unbedingt :)

edit: *hust* sorry, hab was im Quellcode übersehen, und den Link nicht überall angegeben :freak:
 
Zuletzt bearbeitet:
Welcher Link fehlt? Ist doch an allen ein href dran, irgendendeinen link muss er doch dann anzeigen, evt. nur das falsche?

Wie gesagt ich mache das im Blindflug.
Gib mir doch einfach mal nen Link zu dem ausgabescript auf Deinem Server, damit ich mir mal ein Bild davon machen kann. Zur Not auch per PN.

Edit:
Dann gib mir aber trotzdem mal bescheid, ob das Ding jetzt mit allem drum und dran funzt. :)
 
Zuletzt bearbeitet:
Natürlich funktioniert das jetzt - hast ja du geschrieben ;)

Wirklich grandios, läuft 1 A, exakt wie gewünscht, absolut perfekt.


Was soll man da noch sagen! Vielen Dank Relict, Klasse :daumen:
 
Zurück
Oben