David Zoelfel: DB Auslesen und abbrechen

Huhu liebes Forum.
Ja, ich bin ein totaler PHP-Nub, bzw. Neuling, und brauche Hilfe.
Es wird wohl eine einfache Lösung geben, doch mit meinem derzeitigen Wissensstand wird dies nicht zu lösen sein.
Der Titel des Themaspasst auch nicht 100%, aber mir fiel nichts besseres ein, sry.

Mein Problem ist, dass ich (Grund dafür ist irrelevant, da dies viel zu viel zu schreiben wäre) die letzte Aktivität der Nutzer meines Forums auslesen möchte, und in einer Tabelle wiedergebe.

Das passiert auch so weit, doch die 'lastactivity' wird in einer Zeile angezeigt (also ALLE Werte), anstatt jeweils in einer neuen Zeile.

Hier der Code

  
$down5 = $db->query("SELECT userid,username,lastactivity,lastvisit FROM bb".$n."_users ORDER BY lastactivity ASC LIMIT 45");  
while ($down5top = $db->fetch_array($down5)){  
  
    $down5name .= "» <a href=profile.php?userid=$down5top[userid]&sid=$session[hash]>$down5top[username]</a><br>";  
    $down5activity .= formatdate($dateformat,$down5top['lastactivity'],1);  
    $leer3 .= "<br>";  
    $down5act ="".$down5activity." ".$leer3."";  
}  

Zusätzliche Info:
Es handelt sich um ein Woltlab Burning Board Lite 1.0.2.
Angezeigt werden soll es in der index.php (mit Hilfe des Top 10 - Poster - Hack)

Das ist aber der komplette Quelltext der genutzten Stelle..
Ich komm da aber nicht weiter =/

Wäre lieb, wenn mir jemand helfen könnte.
Danke, lG David

  1. Hi,

    Das passiert auch so weit, doch die 'lastactivity' wird in einer Zeile angezeigt (also ALLE Werte), anstatt jeweils in einer neuen Zeile.

    Und wie sieht der HTML-Code aus, den dein Script an der Stelle erzeugt?

    $down5name .= "» <a href=profile.php?userid=$down5top[userid]&sid=$session[hash]>$down5top[username]</a><br>";

    Lies noch mal nach, wie man Array-Variablen vernuenftig in einen String einbindet:
    http://www.php.net/manual/de/language.types.string.php#language.types.string.parsing

    MfG ChrisB

    1. Ich verstehe ja, dass hier jeden Tag jemand ankommt und vielleicht etwas ähnliches wissen möchte.
      Doch ich beschäftige mich seit ca. 3 Tagen mit PHP und habe noch sowas von KEINEN Durchblick.
      Ist es zuviel verlangt, mir bei diesem Problem KONKRET zu helfen? :x

      Ich meine, der Link sagt mir genauso wenig.

      ChrisB,
      im Editor ist es eine Tabelle in der auf der einen Seite der Benutzername und auf der anderen (soll) die letzte Aktivität stehen.

      Beim Aufruf im Browser wird die 1. TD komplett richtig umgewandelt (jeder Benutzer in einer neuen Zeile) doch in der zweiten TD besteht der Quellcode aus den 'lastactivity'-Werten (aneinander, ohne Leerzeichen) und am Ende einer Folge von 45 <br>'s.

      Soweit VERSTEH ich das ja alles, doch umsetzten kann ich es DEFINITIV noch nicht. Das ist auch der einzige Grund, warum ich mein Problem hier äußere.

      Falls mir nicht geholfen werden kann, werd ich diese kleine Idee wohl nicht einbauen können.
      Ich schaff es halt noch nicht alleine.. auch nicht mit irgendwelchen Links zu externen Seiten..
      lG David & frohe Ostern (:

      1. Hi,

        Ich verstehe ja, dass hier jeden Tag jemand ankommt und vielleicht etwas ähnliches wissen möchte.
        Doch ich beschäftige mich seit ca. 3 Tagen mit PHP und habe noch sowas von KEINEN Durchblick.

        Dann stehst du also noch *ganz* am Anfang deiner Lernkurve.
        Ander haben auch viel Zeit investiert, um ihren bisherigen Wissensstand zu erreichen.

        Der Unterschied liegt vielleicht in der Geduld. Waehrend manche Leute sich die Zeit nehmen, selber Auszuprobieren, zu Versuchen, Nachzulesen - rennen andere direkt zu Anfang bei jedem klitzekleinen Problem ins naechstbeste Forum ...

        Ist es zuviel verlangt, mir bei diesem Problem KONKRET zu helfen? :x

        In wie fern das moeglich ist, haengt wesentlich davon ab, wie *konkret* du dein Problem beschreibst.

        Ich meine, der Link sagt mir genauso wenig.

        Das ist schlecht, sehr schlecht.
        Wie willst du in einer Sprache Programmieren, wenn du nicht in der Lage bist, ihre Dokumentation zu verstehen?

        Beim Aufruf im Browser wird die 1. TD komplett richtig umgewandelt (jeder Benutzer in einer neuen Zeile) doch in der zweiten TD besteht der Quellcode aus den 'lastactivity'-Werten (aneinander, ohne Leerzeichen) und am Ende einer Folge von 45 <br>'s.

        In deinem Code ist noch nicht einmal erkennbar, wo ueberhaupt irgendwelche Tabellenzellen ausgegeben/erzeugt werden. Wie nimmst du da an, sollte hier jemand erkennen koennen, wo das Problem vielleicht liegt?

        Es ist zwar richtig, beim Posten von Code diesen auf ein relevantes Masz zu kuerzen - aber *zu wenig* ist eben auch nicht gut.

        MfG ChrisB

        1. Nochmals huhu und danke für deinen Beitrag.

          Das Problem ist halt, dass ich genau diese Sache so schnell wie möglich einbauen möchte, darum der Weg ins Forum.

          Also.. das Forum nutzt .tpl Dateien.

          die Coder dieser TPL für die 'Down 10' wäre folgender:

            
          <table cellpadding=4 cellspacing=1 border=0 width="96%" bgcolor="{tableinbordercolor}">  
          <tr bgcolor="{tabletitlecolor}" id="tabletitle">  
          <td colspan=7 ><table cellpadding=0 cellspacing=0 border=0 width="{tableinwidth}">  
          <tr>  
          <td><smallfont color="{fontcolorsecond}"><b>Down Ten<b></font></td>  
          <td align="right"><!---Platzhalter---></td></tr></table></td></tr></td></tr>  
          <tr>  
          <td id="tableb" bgcolor="{tablecolorb}" colspan="7">  
          <table cellpadding=4 cellspacing=1 border=0 width="100%" bgcolor="{tableinbordercolor}">  
          <tr>  
          <TD id="tablea" bgcolor="{tablecolora}" width="25%" valign="top">  
          <smallfont><b>Down 10 Poster:</b>  
          <hr width="100%" color="{tableinbordercolor}" noShade size=1>  
          <table>  
          <tr>  
          <td width=100%><smallfont>Benutzername:</font></td>  
          <td align="right" width=300><smallfont>Beiträge:</font></td></tr>  
          <tr>  
          <td width=100%><smallfont><b>$posts25name</b></font></td>  
          <td align="right" width=300><smallfont><b>$posts25post</b></font></td></tr></table></font></td>  
          <TD id="tablea" bgcolor="{tablecolora}"  width="25%" valign="top"><smallfont><b>Älteste Aktivitäten:</b>  
          <hr width="100%" color="{tableinbordercolor}"  noShade size=1>  
          <table>  
          <tr>  
          <td width=100%><smallfont>Benutzername:</font></td>  
          <td align="right" width=300><smallfont>Aktiv:</font></td></tr>  
          <tr>  
          <td width=100%><smallfont><b>$down5name</b></font></td>  
          <td align="right" width=300><smallfont><b>$down5act</b></font></td></tr></table></font></td><!-- Bis dort hn hab ich die Top 10 überarbeitet -->  
          <TD id="tablea" bgcolor="{tablecolora}"  width="50%" valign="top">  
          <smallfont><b>Letzte Beiträge:</b>  
          <hr width="100%" color="{tableinbordercolor}"  noShade size=1>  
          <table>  
          <tr>  
          <td width=65%><smallfont>Titel:</font></td>  
          <td width=35%><smallfont>Benutzername:</font></td>  
          <td align="right" width=300><smallfont>Klicks:</font></td></tr>  
          <tr>  
          <td width=65%><smallfont><b>$popthread</b></font></td>  
          <td width=35%><smallfont><b>$lastposter</b></font></td>  
          <td align="right" width=300><smallfont><b>$popviews</b></font></td></tr></table></font></td></tr>  
          <tr>  
          <td id="tableb" bgcolor="{tablecolorb}"  colspan="7">  
          <table cellpadding="1" cellspacing="0" border="0" width="100%">  
          <tr>  
          <td id="tableb" bgcolor="{tablecolorb}" >  
          <smallfont><b>Top Thema:</b> <b>$pop1title</b> | <b>$pop1views</b> klicks.</font></td>  
          <td id="tableb" bgcolor="{tablecolorb}"  align="right">  
          <smallfont><b>Top Bewertung:</b> <b>$votedthread</b> | <b>$votedrating</b> Stimmen.</font></td></tr></table></td></tr></table></td></tr>  
          
          

          Dann nochmal den Code aus der PHP-Datei (für die ersten beiden Reihen der generierten Tabelle):

            
          // Start Letzte Aktivitaet - down  
            
          $down5 = $db->query("SELECT userid,username,lastactivity,lastvisit FROM bb".$n."_users ORDER BY lastactivity ASC LIMIT 45");  
          while ($down5top = $db->fetch_array($down5)){  
            
              $down5name .= "» <a href=profile.php?userid=$down5top[userid]&sid=$session[hash]>$down5top[username]</a><br>";  
              $down5activity .= formatdate($dateformat,$down5top['lastactivity'],1);  
              $leer3 .= "<br>";  
              $down5act ="".$down5activity." ".$leer3."";  
          }  
            
          // Ende - down  
            
          // Start Down 5 Poster  
          $posts25 = $db->query("SELECT userid,username,userposts FROM bb".$n."_users ORDER BY userposts ASC, username ASC LIMIT 45");  
          while ($posts25top = $db->fetch_array($posts25)){  
            
              $posts25name .= "» <a href=profile.php?userid=$posts25top[userid]&sid=$session[hash]>$posts25top[username]</a><br>";  
              $posts25post .= "$posts25top[userposts] <br>";  
          }  
          // Ende Down 5 Poster  
          
          

          Fehlen sonst noch irgendwelche benötigten Angaben dazu?

          Hier noch vllt. der generierte Code der index.php (die Tabellenspalte, die die 'lastactivity' anzeigen soll)

            
          <td align="right" width=300><font face="Tahoma,Helvetica" size="1"><b>28.01.200802.02.200802.02.200804.02.200804.02.200809.02.200810.02.200810.02.200812.02.200812.02.200813.02.200816.02.200818.02.200822.02.200.......... (usw, dann)<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></b></font></td></tr>  
          
          

          Und ja, ich bin in letzter Zeit im Stress und finde einfach nicht die Zeit um solche Dokumentationen zu den Sprachen komplett zu lesen.. zum Verstehen benötigt es dann ja meistens noch mehrere Durchgänge des lesens..

          Wie dem auch sei, ich verspreche die Doku zu lesen *g*, sobald ich dann zumindest den kleinen Code fertig habe.. aber das kann in der momentanen Situation noch etwas dauern.. brauche halt die Zeit dazu.

          Trotzdem schonmal danke für deine Hilfe bisher (:

          1. Hallo David,

            Das Problem ist halt, dass ich genau diese Sache so schnell wie möglich einbauen möchte

            die Situation ist mir bekannt: Ein neues Feature wurde gewünscht - und versprochen.
            Dies kann schon schwierig genug sein, selbst wenn man sich in der Materie auskennt, aber kaum Zeit zur Verfügung hat. In Deinem Fall: Neu in der Programmiersprache _und_ wenig Zeit ist es halt noch ein paar Stufen schlimmer.

            Es handelt sich um ein Woltlab Burning Board Lite 1.0.2.
            Angezeigt werden soll es in der index.php (mit Hilfe des Top 10 - Poster - Hack)

            Ich kenne die Software nur ihrem Namen nach - Gutes habe ich über sie noch nichts gehört. Anscheinend zu Recht, es folgt schlimmes Tabellenlayout - und an der Stelle, wo eine Tabelle angemessen wäre, der Tabelle der letzten Aktivität, da arbeitest Du (ich vermute mit einem angepassten Top-10-Poster-Hack des Burning Boards, der mir ebenso unbekannt ist) mit <br> in Tabellenzellen. Das tut natürlich weh.

            [... grausamer Code gekürzt]

            <tr>
                <!-- In der Tabellenzelle die Namen durch <br> in "Zeilen" gepresst -->
                <td width=100%><smallfont><b>$down5name</b></font></td>
                <!-- Hier geht es schief: zuerst alle Datumsangaben, gefolgt von allen <br> -->
                <td align="right" width=300><smallfont><b>$down5act</b></font></td>
            </tr>
            </table><!-- Bis dort hn hab ich die Top 10 überarbeitet -->

            [...]

              
              
            
            > ~~~php
              
            
            > // Start Letzte Aktivitaet - down  
            >   
            > $down5 = $db->query("SELECT userid,username,lastactivity,lastvisit FROM bb".$n."_users ORDER BY lastactivity ASC LIMIT 45");  
              
            // In der folgenden Schleife machen Dir unnötige Variablen das Leben schwer  
            // und verursachen den Fehler  
            
            > while ($down5top = $db->fetch_array($down5)){  
            >     $down5name .= "» <a href=profile.php?userid=$down5top[userid]&sid=$session[hash]>$down5top[username]</a><br>";  
              
            // Warum die Variable $down5activity, die Du danach nicht mehr nutzt?  
            // Beachte: Hier hängst Du in jedem Schleifendurchgang ein weiteres Datum an  
            
            >     $down5activity .= formatdate($dateformat,$down5top['lastactivity'],1);  
              
            // Ich nutze lieber eine Variable mehr als weniger, aber  
            //    $leer wäre als Konstante besser, es soll doch nur den Inhalt <br> haben.  
            // Stattdessen hängst Du in jeder Runde ein weiteres <br> an  
            
            >     $leer3 .= "<br>";  
              
            // Hier kommt nun Deine Ausgabevariable, die Du in jeder Runde überschreibst.  
            // Du könntest diese auch nach der Schleife zusammenbauen, das Ergebnis wäre  
            // genauso falsch :-)  
            // Hänge an die Auflistung aller Datumsangaben eine die Auflistung aller <br> an.  
            
            >     $down5act ="".$down5activity." ".$leer3."";  
            
            // Kein Wunder, dass das HTML herauskommt, das Du uns unten zeigst.  
              
            
            > }  
            
            [...]  
            
            > 
            
            

            Dein Code könnte eher so aussehen (das HTML bliebe miserabel), die Ausgabe wäre aber wie gewünscht:

              
            // Initialisiere die Ausgabevariable mit einer leeren Zeichenkette  
            $down5act = '';  
            while ($down5top = $db->fetch_array($down5)) {  
                $down5name .= [...]  
                // Hänge an den Inhalt der Ausgabevariablen den aktuellen,  
                // entsprechend formatierten Zeitpunkt, gefolgt von einem Zeilenumbruch  
                // durch <br> an.  
                down5act .= formatdate($dateformat,$down5top['lastactivity'],1) . '<br>';  
            }  
            
            

            Fehlen sonst noch irgendwelche benötigten Angaben dazu?

            Nein, das war in Ordnung. Etwas zuviel, die Zeile, in der Deine verunglückte Ausgabe erfolgt, hätte gereicht. Aber nicht seitenweise irrelevanter Code ...

            ... und erfreulicherweise auch die fehlerhafte Ausgabe, die das Auffinden Deines logischen Programmierfehlers einfach machte.

            Hier noch vllt. der generierte Code der index.php (die Tabellenspalte, die die 'lastactivity' anzeigen soll)

            <td align="right" width=300><font face="Tahoma,Helvetica" size="1"><b>28.01.200802.02.200802.02.200804.02.200804.02.200809.02.200810.02.200810.02.200812.02.200812.02.200813.02.200816.02.200818.02.200822.02.200.......... (usw, dann)<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br></b></font></td></tr>

              
            
            > Und ja, ich bin in letzter Zeit im Stress und finde einfach nicht die Zeit um solche Dokumentationen zu den Sprachen komplett zu lesen.  
              
            David, es ist nicht erforderlich, die gesamte Dokumentation gelesen zu haben. Bereiche, die man nicht nutzt oder nicht nutzen kann, kann man gerne außen vor lassen. Es wäre eine völlig falsche Zielsetzung, \_alle\_ Funktionen einer komplexen Programmiersprache kennen zu wollen - oder auch nur die Doku dazu gelesen zu haben.  
              
            Es ist hingegen eine gute Idee, sich in die grundlegenden Prinzipien einer Programmiersprache einzuarbeiten. Will man sich ernsthaft mit einer Programmiersprache auseinandersetzen, dann kommt man um Handbuchstudium nicht herum. Es ist nicht notwendig auswendig zu wissen, wie die Aufrufsyntax einer x-beliebigen Funktion aussieht. Es ist wichtig, sie im Handbuch nachlesen (und verstehen) zu können. Es ist auch nicht wichtig, bestimmte Funktionen, die man benötigt, zu kennen. Es ist wichtig, zu wissen, wo man gezielt nach ihr suchen kann:  
            Im Falle von PHP: zuerst die Liste der Funktionsgruppen in der Funktionsreferenz durchblättern. Je öfter man dort nachschlägt, um so mehr bleiben derart im Gedächtnis haften: "Gab's da nicht zu diesem Bereich Funktionen? ...". Zweitens das Inhaltsverzeichnis des passenden Bereichs durchlesen. Die Kurzbeschreibung sollte in aller Regel ausreichen, um zu wissen, ob eine Funktion passt.  
              
            
            > Wie dem auch sei, ich verspreche die Doku zu lesen \*g\*, sobald ich dann zumindest den kleinen Code fertig habe.. aber das kann in der momentanen Situation noch etwas dauern.. brauche halt die Zeit dazu.  
              
            David, Du solltest lernen, beim Programmieren die Funktionsreferenz zu nutzen. Das macht jeder, der ernsthaft programmiert.  
              
              
            Freundliche Grüße  
              
            Vinzenz
            
            1. Hallo Ingrid,

              Du warst etwas sparsam:

              • Alle Variablen sollten initialisiert werden!
              • Es fehlte ein Dollar, den ich hiermit nachreiche.
                
              // Initialisiere die Ausgabevariablen mit leeren Zeichenketten  
              $down5name = '';  
              $down5act  = '';  
              while ($down5top = $db->fetch_array($down5)) {  
                  $down5name .= [...]  
                  // Hänge an den Inhalt der Ausgabevariablen den aktuellen,  
                  // entsprechend formatierten Zeitpunkt, gefolgt von einem Zeilenumbruch  
                  // durch <br> an.  
                  $down5act  .= formatdate($dateformat,$down5top['lastactivity'],1) . '<br>';  
              }  
              
              

              Freundliche Grüße

              Vinzenz

              1. Hi,

                • Es fehlte ein Dollar, den ich hiermit nachreiche.

                Beim derzeitigen Wechselkurs braucht man damit ja nun wirklich nicht zu knausern ...

                MfG ChrisB

                1. Huhu.
                  Wow, Vinzenz, das war genau das, was ich brauchte.
                  Dein Beitrag ist einfach super :)

                  Ich werde versuchen, die Sachen umzusetzten, die Du mir genannt hast. :)
                  Wie schon erwähnt, bin noch neu in der Materie und möchte es gerne lernen..
                  Werde dann wohl noch etwas Zeit ins Lesen stecken. *g*

                  Danke euch beiden für euch Hilfe.
                  lG David