Vinzenz Mai: DB Auslesen und abbrechen

Beitrag lesen

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