Themenanzeige auf der Startseite

MK70
Problembeschreibung:
Auf der Startseite werden trotz löschen, der in den Foren befindlichen Themen, die Anzahl Themen / Beiträge und auch der letzte Beitrag von ..., nicht gelöscht.

Im ACP unter Anzeigen Aktualisieren gibt es die Funktion zum aktualsieren leider nicht (wie im WBB2).
Kann mir wer nen Tipp geben, wo ich da was einstellen muss ?
Evtl. in der DB ?
Zikaro
Ich kann dir nicht ganz folgen?

Kannst du mir ein Screen machen?
MK70
Hallo,

Screen brauch ich net mehr machen, hab es gerad endlich nach ewiger Suche gefunden...

Aber für die, die evtl. auch mal das Problem haben:
In den Spalten Beiträge, Themen, Letzter Beitrag werden ja die jeweiligen Themen und Beiträge gezählt / angezeigt. Diese Anzeige musste auf 0 gesetzt werden.

Lösung:
In der Tabelle bbx_boards müssen die folgenden Werte auf 0 bzw. gänzlich gelöscht werden:
threadcount, postcount, lastthreadid, lastposttime, lastposterid und lastposter.
TRS
ich hab mir das gebastelt^^
in acp/otherstuff.php
über ?>
EINFÜGEN
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
if($action=="boardposts")
{
    $result=$db->query("SELECT boardid FROM bb".$n."_boards ORDER BY boardid ASC");
  while($row=$db->fetch_array($result)) 
  {
      $postcount=$db->query_first("SELECT COUNT(postid) AS countp FROM bb".$n."_posts p LEFT JOIN bb".$n."_threads t ON (p.threadid=t.threadid) LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid) WHERE b.boardid='$row[boardid]' AND p.visible=1");
       $db->unbuffered_query("UPDATE bb".$n."_boards SET postcount='$postcount[countp]' WHERE boardid='$row[boardid]'",1);
  }
     eval("print(\"".gettemplate("working_done")."\");");
}


in der acp/templates/otherstuff.htm
über </body>
EINFÜGEN
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<form name="form4" action="otherstuff.php?action=boardposts&sid=$session[hash]" method="post">
 <table cellpadding="4" cellspacing="1" border="0" class="tblborder" width="95%" align="center">
  <tr class="tblhead">
   <td colspan="2">Zählung der Boardbeiträge</td>
  </tr>
  <tr class="secondrow">
   <td colspan="2" align="center"><input type="submit" value="Aktualisieren"></td>
  </tr>
 </table>
</form>
MK70
oh, das klingt gut. Werde ich beizeiten auch mal einbauen... großes Grinsen
Beckebans
Auch wenn ich jetzt wahrscheinlich gesteinigt werde, weil ich nen uraltes Thema ausgrabe:


Der Code von TRS funktioniert soweit. Allerdings werden nur die Beiträge des aktuellen Boards gezählt. Wie bekomme ich es hin, dass die Beiträge von Subboards, deren Subboards, deren Subboards,... immer mit dazu addiert werden?
Schrimm
Du machst aus dem Code eine rekursive Funktion, die jeweils stets ein Stück weiterrein geht und die Beiträge zählt und am Schluss der "Subboardschlange" einen break macht.
Beckebans
@Schrimm, ich brauche nochmal deine Hilfe. Ich habe mich daran ein bisschen versucht und dieses hier herausbekommen:

==> acp/otherstuff.php

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
if($action=="boardposts")
{
  function count_boardposts($boardid)
  {
    global $db$n;
    $postcount $db->query_first("SELECT COUNT(postid) AS countp FROM bb".$n."_posts p LEFT JOIN bb".$n."_threads t ON (p.threadid=t.threadid) LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid) WHERE b.boardid='$boardid' AND p.visible=1");
    if($postcount[childlist] == 0) {
     return $postcount[countp];
     break;
    } else {
     $childlist explode(","$postcount[childlist]);
     for($i 0$i count($childlist); $i++ ) { 
      if(!$childlist[$i] == 0) {
       $childlist_i $childlist[$i];
       count_boardposts($childlist_i);
      }
     }
    }
  }

  $result=$db->query("SELECT boardid FROM bb".$n."_boards ORDER BY boardid ASC");
  while($row=$db->fetch_array($result)) 
  {
      $boardposts_result count_boardposts($row[boardid]);
      $db->unbuffered_query("UPDATE bb".$n."_boards SET postcount='$boardposts_result' WHERE boardid='$row[boardid]'",1);
  }
     eval("print(\"".gettemplate("working_done")."\");");
}



Nur wie kann ich jetzt die ganzen Zählungen zusammenaddieren?
Schrimm
Ganz einfach.
Statt nur einen "Parameter" der rekursiven Funktion zu übergeben, übergibst du zwei, wobei eine davon deine Postzählung ist, die du beim "Funktionsaufbau" aber erstmal 0 setzt.
Beispiel:
php:
1:
2:
3:
4:
5:
6:
7:
function test($id,$count=0) {
 $count++;
 ..........
 ..........
 $count test($id,$count);
 return $count;
}


Somit wird beim ersten Aufruf das count=0 gesetzt(sofern du es nicht schon am Anfang überschreibst), erhält aber beim rekursiven Aufruf den aktuellen count mitgeliefert und zählt dort weiter.
Beckebans
Klappt bei mir nicht Zunge raus


Wieso muss denn am Ende nochmal "$count = function" stehen? Das count wird doch schon in der Funktion selbst mit übergeben.


Edit:
So sieht die Funktion jetzt aus:
php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
function count_boardposts($boardid,$count=0)
  {
    global $db$n;
    $postcount $db->query_first("SELECT COUNT(postid) AS countp FROM bb".$n."_posts p LEFT JOIN bb".$n."_threads t ON (p.threadid=t.threadid) LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid) WHERE b.boardid='$boardid' AND p.visible=1");
    $count $count $postcount[countp];
    if($postcount[childlist] == 0) {
     return $count;
     break;
    } else {
     $childlist explode(","$postcount[childlist]);
     for($i 0$i count($childlist); $i++ ) { 
      if(!$childlist[$i] == 0) {
       $childlist_i $childlist[$i];
       $count count_boardposts($childlist_i,$count);
      }
     }
     return $count;
    }
  }
Schrimm
Zitat:
Original von Beckebans
Klappt bei mir nicht Zunge raus

Wieso muss denn am Ende nochmal "$count = function" stehen? Das count wird doch schon in der Funktion selbst mit übergeben.

Das muss sein, weil die Variable nur funktionsintern existiert und nach dem "return" innerhalb der Funktion zerstört wird.
Du hast also nur einen Wert als Rückgabewert und das Programm weiß damit nix anzufangen.
Wenn du diesen Wert aber in eine Variable schreibst, kannst du diese in der ursprüngliche Funktion weiterverwenden.

Klartext:
Das $count in der nochmals aufgerufenen Funktion ist nicht das $count der ursprünglichen Funktion.
Um somit das endgültige $count auszugeben musst du den Wert in $count zwischenspeichern ehe du ihn mittels return dann rauswirfst.

Ansonsten wäre es so, als würdest du irgendwo in der php-Datei schreiben: "600;"

edit:
Das hier:
php:
1:
2:
3:
if($postcount[childlist] == 0) {
     return $count;
     break;
Würde ich so machen:
php:
1:
if($postcount[childlist] == 0) return $count;

"break;" nach "return;" brauchst du nicht, da alles nach "return;" sowieso nicht ausgeführt wird.
Den else-Teil kann man sich sparen.
Wenns ohne else steht macht es dasselbe(wegen "return;") und ist für gewöhnlich übersichtlicher.

php:
1:
!$childlist[$i] == 0
Was das bedeuten soll, müsstest du mir mal erklären.
Du fragst ob die Variable "false" ist und gleichzeitig 0?

edit 2:
Weiters ist mir nicht ersichtlich wo du "$postcount[childlist]" beschreibst.
Jedenfalls nicht durch deinen Query, da du dort nur eine Abfrage tätigst.
Beckebans
Ja gut, wenn ich das break nicht brauche kann ich das direkt dahinter schreiben. Ist übersichtlicher. Das mit dem else finde ich so wie jetzt eigentlich übersichtlicher. Mit Funktionen habe ich noch nichts groß gemacht und deswegen ist mir das mit dem Ende bei return nicht so geläufig. Da finde ich es mit dem else einfacher zuzuordnen, dass es zu der vorherigen Bedingung gehört. Anfängersache halt smile

Das mit dem childlist sollte eigentlich nicht "false und 0" abfragen, sondern "nicht 0". Da hab ich nur das Rufzeichen an der falschen Stelle gemacht.

Das childlist selbst sollte durch den Query mitkommen, da habe ich aber irgendwie falsch gedacht. Mit dem count zusammen kann man das ja garnicht abfragen.

So sollte es besser aussehen, oder?
Die Funktion ist aber immer noch nicht richtig.

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
function count_boardposts($boardid,$count=0)
  {
    global $db$n;
    $postcount $db->query_first("SELECT COUNT(postid) AS countp FROM bb".$n."_posts p LEFT JOIN bb".$n."_threads t ON (p.threadid=t.threadid) LEFT JOIN bb".$n."_boards b ON (t.boardid=b.boardid) WHERE b.boardid='$boardid' AND p.visible=1");
    $board $db->query_first("SELECT childlist FROM bb".$n."_boards WHERE boardid='$boardid'");
    $count $count $postcount[countp];
    if($board[childlist] == 0) return $count;
    else {
     $childlist explode(","$board[childlist]);
     for($i 0$i count($childlist); $i++ ) { 
      if($childlist[$i] != 0) {
       $childlist_i $childlist[$i];
       $count count_boardposts($childlist_i,$count);
      }
     }
     return $count;
    }
  }
Schrimm
Erkenne auf anhieb keinen Fehler.
Beim ersten Query würde ich das LEFT JOIN zur bbX_boards streichen, da die bbX_threads bereits die boardid enthält.
Somit gleich mit t.boardid='$boardid'.

Weiters würde ich rein Formal mal aus "COUNT(postid)" ein "COUNT(*)" machen.

Restliches scheint mir eigentlich korrekt.
Was kommt bei dir denn als "$count" raus und was sollte rauskommen?
Beckebans
OK, die beiden Änderungen habe ich noch reingemacht.

Es kommt die Anzahl der Beiträge in dem einen Board heraus. Die Anzahl der Beiträge aus den ganzen Unterboards werden ignoriert. Diese sollten ja eigentlich mit dabei gerechnet sein.
Schrimm
Zitat:
Original von Beckebans
OK, die beiden Änderungen habe ich noch reingemacht.

Es kommt die Anzahl der Beiträge in dem einen Board heraus. Die Anzahl der Beiträge aus den ganzen Unterboards werden ignoriert. Diese sollten ja eigentlich mit dabei gerechnet sein.

Entweder das, oder er geht dir gar nicht wirklich weiter rein.
Mache mal zum Test unter "$count = $count + $postcount[countp];"
Ein echo rein und lass dir "$count" ausgeben.
Beckebans
Es funktioniert großes Grinsen

Die Funktion blieb hier hängen:
code:
1:
if($board[childlist] == 0) return $count;

So funktioniert es jetzt:
code:
1:
if($board[childlist] == "0") return $count;

Was so ne kleine, unscheinbare Änderung alles ausmachen kann...



Edit:
Nachdem wir einen Fehler im wbblite gefunden haben, der mit der childlist zusammenhängt und wir nach dem Fix die Funktion garnicht mehr brauchen, hier der geänderte Code für alle, die dieses Thema irgendwann mal finden:


==> acp/otherstuff.php

Suche:

php:
1:
?>

Darüber einfügen:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
if($action=="boardposts") {
  $result=$db->query("SELECT boardid FROM bb".$n."_boards ORDER BY boardid ASC");
  while($row=$db->fetch_array($result)) {
    $postcount $db->query_first("SELECT COUNT(*) AS countp FROM bb".$n."_posts p LEFT JOIN bb".$n."_threads t ON (p.threadid=t.threadid) WHERE t.boardid='$row[boardid]' AND p.visible=1");
    $board $db->query_first("SELECT childlist FROM bb".$n."_boards WHERE boardid='$row[boardid]'");
    $count $postcount[countp];
    if($board[childlist] != "0") {
     $childlist explode(","$board[childlist]);
     for($i 0$i count($childlist); $i++ ) { 
      if($childlist[$i] != "0") {
       $postcount_childboard $db->query_first("SELECT COUNT(*) AS countp FROM bb".$n."_posts p LEFT JOIN bb".$n."_threads t ON (p.threadid=t.threadid) WHERE t.boardid='$childlist[$i]' AND p.visible=1");
       $count $count $postcount_childboard[countp];
      }
     }
    }
    $db->unbuffered_query("UPDATE bb".$n."_boards SET postcount='$count' WHERE boardid='$row[boardid]'",1);
  }
  eval("print(\"".gettemplate("working_done")."\");");
}




==> acp/templates/otherstuff.htm

Suche:

php:
1:
</body>

Darüber einfügen:

php:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
<form name="form4" action="#" method="post">
 <table cellpadding="4" cellspacing="1" border="0" class="tblborder" width="95%" align="center">
  <tr class="tblhead">
   <td colspan="2">Zählung der Boardbeiträge</td>
  </tr>
  <tr class="secondrow">
   <td colspan="2" align="center"><b>Achtung:</bVor dem Aktualisieren sollten die Foren synchronisiert werdenDabei erfolgt automatisch eine Weiterleitung auf die Forenübersicht.<br><br><input type="button" value="Synchronisieren" onclick="window.location.href='board.php?action=sync&sid=$session[hash]'"> <input type="button" value="Aktualisieren" onclick="update(this.form.action.value,0)"></td>
  </tr>
 </table>
 <input type="hidden" name="action" value="boardposts">
</form>



Danke für die Hilfe Schrimm Prost
Schrimm
Schön, dass es nun funktioniert. Dance

Zur Erklärung für Alle die es nicht wissen:

In der bbX_boards wird die childlist als String, also Text, gespeichert und nicht als Integer(Zahl).
Verwendet man nun diesen mittels Vergleichsoperator muss ein String unter Anführungsstriche und ein Integer nicht.

Da er hier ständig nach der Zahl 0 gesucht hat, anstatt nach dem Text 0, fand er keine Übereinstimmung.
Beckebans
Ich habe den Code nochmals geändert, da die Funktion nicht mehr benötigt wird. Der komplette Code befindet sich in meinem vorherigen Beitrag.