Zur Navigation

blätterfunktion

1 tomaschko

meine Blätterfunktion zeigt immer eine seite mehr an als nötig, auf der dann nichts steht...
findet jmd. den Fehler? ich sehe es nicht:

//Anzahl pro Seite
$anzeige=10;
//Prüfen der jeweiligen Seite/anzuzeigende Sätze...
$start=$_GET['page'] * $anzeige;
$ende = $start + $anzeige;
    $result = mysql_query("SELECT * FROM threads WHERE fid=$fid AND tid=$tid ORDER BY date desc LIMIT $start,$ende");

$number = mysql_num_rows($result);


$seiten=ceil($number/$anzeige);

if ($ende>$anzeige) { $ende = $anzeige-1; } 

//Erstellen der Links

if ($_GET['page']>0) {
    $i=$_GET['page']-1;
    echo '<a href="index.php?sid='.$sid.'&subid='.$subid.'&page='.$i.'"></a>';
}
for($i=0; $i<=$seiten; $i++) {
    if ($i==$_GET['page']) {
        echo $i."&nbsp;";
    }
    else {
        echo '<a href="index.php?sid='.$sid.'&subid='.$subid.'&page='.$i.'">'.$i.'</a>&nbsp;';
    }
}
if ($_GET['page']<$seiten) {
    $i=$_GET['page']+1;
    echo '<a href="index.php?sid='.$sid.'&subid='.$subid.'&page='.$i.'"></a>';
}  

Ist er echt?

09.01.2007 13:14

2 Jörg Kruse

Das Problem liegt vielleicht schon in der Datenbank-Abfrage. Das zweite Argument für LIMIT bezeichnet nicht den letzten Datensatz, sondern die Anzahl der Datensätze. Sinnvoller wäre hier also:

$result = mysql_query("SELECT * FROM threads WHERE fid=$fid AND tid=$tid ORDER BY date desc LIMIT $start,$anzeige");

Die Anzahl der tatsächlich vorhandenen Datensätze könntest du stattdessen mit einer zweiten Abfrage ermitteln:

$result2 = mysql_query("SELECT COUNT(*) FROM threads WHERE fid=$fid AND tid=$tid");

list($number) = mysql_fetch_row($result2);

$seiten=ceil($number/$anzeige);

Nachtrag:

für $start würde ich diesen Wert angeben:

$start = (($_GET['page'] - 1) * $anzeige) + 1;

Seite 3 beginnt ja nicht mit dem Datensatz 30, sondern mit dem Datensatz 21

09.01.2007 13:50 | geändert: 09.01.2007 13:58

3 tomaschko


Zitat von Jörg
Das Problem liegt vielleicht schon in der Datenbank-Abfrage. Das zweite Argument für LIMIT bezeichnet nicht den letzten Datensatz, sondern die Anzahl der Datensätze. Sinnvoller wäre hier also:

$result = mysql_query("SELECT * FROM threads WHERE fid=$fid AND tid=$tid ORDER BY date desc LIMIT $start,$anzeige");

Die Anzahl der tatsächlich vorhandenen Datensätze könntest du stattdessen mit einer zweiten Abfrage ermitteln:

$result2 = mysql_query("SELECT COUNT(*) FROM threads WHERE fid=$fid AND tid=$tid");

list($number) = mysql_fetch_row($result2);

$seiten=ceil($number/$anzeige);

Nachtrag:

für $start würde ich diesen Wert angeben:

$start = (($_GET['page'] - 1) * $anzeige) + 1;

Seite 3 beginnt ja nicht mit dem Datensatz 30, sondern mit dem Datensatz 21

Den SQL-Befehl Count kannte ich bisher gar nicht. is das so in der art wie mysql_num_rows...?

Ist er echt?

10.01.2007 08:16

4 Jörg Kruse

COUNT gibt die Anzahl der Datensätze zurück, auf die die WHERE Klausel zutrifft. DAs ist m.E. besser, als mehr Datenabsätze abzurufen, als man benötigt und diese mit mysql_num_rows() zu zählen.

Statt einem * ist es aber vielleicht noch besser, die IDs zählen

$result2 = mysql_query("SELECT COUNT(id) FROM threads WHERE fid=$fid AND tid=$tid");

(den Namen der ID gegebenenfalls noch anpassen)

10.01.2007 09:03

5 tomaschko

seit ich die berechnung für $start geändert habe fehlt in jedem thread der erste beitrag! Obwohl deine Berechnungsweise logischer ist

Ist er echt?

10.01.2007 09:18

6 Jörg Kruse

Da hatte ich aber noch einen Denkfehler fabriziert: der erste Wert des ersten Argumentes von LIMIT ist 0 und nicht 1. Das +1 war also zuviel des Guten, so sollte es korrekt sein:

$start = ($_GET['page'] - 1) * $anzeige;

10.01.2007 09:43

7 tomaschko

So es funktioniert, nun brauch ich nur noch eine Hilfe:
Wenn ich auf den Link "last post" in der Threadübersicht klicke, soll er auch zum letzten post springen. Denn anker im Link hab ich, nur wie bewerkstellige ich es im Thread selbst und muss ich durch die blätterfunktion nicht auch irgendwie die page mit übergeben?

Link:
<a href="discuss.php?fid='.$fid.'&tid='.$thread_id.'&pid='.$lid.'#pid'.$lid.'">letzter Post</a>, <b>'.$luser.'</b><br><small>'.$date.'</small>'

posts:

echo '<table class="posts"><tr>';
    echo '<td class="post_head" >'.$user.' am '.$date.' Uhr</td></tr>';
    echo '<tr><td class="post_content">'.nl2br(trim($content)).'<td></tr>';
    echo '<tr><td class="post_foot">'.$email.' | '.$website.'; </td></tr>';
    echo '</table>';
    

Ist er echt?

10.01.2007 10:08

8 Jörg Kruse

Wo möchtest du denn mit dem Anker hinspringen: zum letzten Post auf der selben Seite oder auf letzten Seite des Threads? Im ersten Fall ist die Seitenzahl $_GET['page'], im zweiten Fall $seiten

Edit:

achso ich verstehe, dir fehlen noch die Anker innerhalb der Posts..

Die musst du in der Schleife, in welcher du die Posts ausgibst, hochzählen (z.B. $j++). Wobei du mit folgenden Wert für den Anker starten könntest:

$j = $start + 1;

10.01.2007 10:21 | geändert: 10.01.2007 10:28

9 tomaschko

ich brauch auch die übergabe der seite...habe es mit $seite gemacht. jedoch kann er die nich übergeben, weil die später definiert wird. Muss vorher $_GET nutzen???

Habe auch eine andere - evt. sinnvollere Lösung für den anker genommen. habe die post id genommen.
ich geb mal den code des forums:

<?php
include('../../includes/auth.inc.php');
include('../../includes/db_connect.inc.php');
include('discuss_fns.inc.php');
include('../../includes/functions.inc.php');
$fid = $_GET['fid'];
$tid = $_GET['tid'];


//Kopf auslesen bis div für menucontainer
html_head();    
//forenmenue auslesen
  foren_menu();
   
//content html
html_content();

    if(empty($fid)) {
    //anzeige der forenuebersicht
    $result = mysql_query("SELECT * FROM foren");
    while($row = mysql_fetch_object($result)){
    $fid = $row->id;
    $name = $row->name;
    $description = $row->description;
    
    echo '<b><a href="discuss.php?fid='.$fid.'">'.$name.'</a> </b><br>';
    echo ''.$description.' <br>';
    
    } 
    }
    else if(empty($tid)) {
    //anzeige der themen des forums   
    foren_breadcrumb($fid, $name);
    $result = mysql_query("SELECT * FROM threads WHERE fid=$fid GROUP BY tid ORDER BY date DESC");
    while($row = mysql_fetch_object($result)){
    $id = $row->id;
    $thread_id = $row ->tid;
    $topic = $row->topic;
    $description = $row->description;
    $user = $row->user;
    $date = $row->date;
//letzter post auslesen
    $lresult = mysql_query("SELECT id, topic, user, date FROM threads WHERE fid=$fid AND tid=$thread_id ORDER BY date DESC LIMIT 1");
     while($row = mysql_fetch_object($lresult)){
     $lid = $row->id;
     $ltopic = $row->topic;
     $luser = $row->user;
     $ldate = $row->date;
     //ergebniszähler
   $num_result = mysql_query("SELECT * FROM threads WHERE fid=$fid AND tid=$thread_id");
    $posts = mysql_num_rows($num_result);
   //ausgabe    

    echo '<table class="threads" border="0"><tr>';
    echo '<td class="thread_topic"><b><a href="discuss.php?fid='.$fid.'&tid='.$thread_id.'&page=1">'.$topic.'</a></b><br>'.$description.'</td>';
    echo '<td class="thread_user">eröffnet von: '.$user.'</td>';
    echo '<td class="thread_posts">Posts: '.$posts.'</td>';
    echo '<td class="thread_date">am: '.$date.'</td>';
    echo '<td class="thread_lpost">'.($lid ? ' <a href="discuss.php?fid='.$fid.'&tid='.$thread_id.'&page='.$seite.'&pid='.$lid.'#pid'.$lid.'">letzter Post</a>, <b>'.$luser.'</b><br><small>'.$date.'</small>' : 'Last Post:<br>keine Einträge').'</td></tr>'; 
    echo '</table>'; 
    
    }
    }echo ' <a href="discuss_new.php?fid='.$fid.'">neues thema</a>';
    }
    else {
    //anzeige der beitraege    
    foren_breadcrumb($tid);
    echo '<br>';

//Seitensteuerung(Einträge/Seite)
//Eingabe der gewünschten Anzahl pro Seite
$anzeige=4;
//Prüfen der jeweiligen Seite/anzuzeigende Werte
$start=($_GET['page']-1) * $anzeige;
$ende = $start + $anzeige;
    $result = mysql_query("SELECT * FROM threads WHERE fid=$fid AND tid=$tid ORDER BY date asc LIMIT $start,$anzeige");



$result2 = mysql_query("SELECT * FROM threads WHERE fid=$fid AND tid=$tid");

$number = mysql_num_rows($result2);

$seiten=ceil($number/$anzeige);



if ($ende>$number) { $ende = $number; } 

//Erstellen von Links

if ($_GET['page']>0) {
    $i=$_GET['page']-1;
    echo '<a href="discuss.php?fid='.$fid.'&tid='.$tid.'&page='.$i.'"></a>';
}
for($i=1; $i<=$seiten; $i++) {
    if ($i==$_GET['page']) {
        echo $i."&nbsp;";
    }
    else {
        echo '<a href="discuss.php?fid='.$fid.'&tid='.$tid.'&page='.$i.'">'.$i.'</a>&nbsp;';
    }
}
if ($_GET['page']<$seiten) {
    $i=$_GET['page']+1;
    echo '<a href="discuss.php?fid='.$fid.'&tid='.$tid.'&page='.$i.'"></a>';
}  


//ausgabe
    echo '<table class="posts"><tr>';
    while($row = mysql_fetch_object($result)){
    $id = $row->id;
    $fid = $row->fid;
    $tid = $row->tid;
    $topic = $row->topic;
    $description = $row->description;
    $user = $row->user;
    $email = $row->email;
    $website = $row->website;
    $date = $row->date;
    $content = $row->content;
    

    bbcode($content);

    echo '<a name="pid'.$id.'"><td class="post_head" >'.$user.' am '.$date.' Uhr</td></tr>';
    echo '<tr><td class="post_content">'.nl2br(trim($content)).'<td></tr>';
    //echo '<tr><td class="post_foot">'.$email.' | '.$website.' <a href="discuss_new.php?fid='.$fid.'&tid='.$tid.'&pid='.$id.'"></a></td></tr>';

    }


    echo '</table>';
    echo '<table><tr><td class="foren_footer" width="50%"><a href="discuss_new.php?fid='.$fid.'&tid='.$tid.'">antwort</a></td> ';
    echo ' <td class="foren_footer" width="50%"><a href="discuss_new.php?fid='.$fid.'">neues thema</a></td></tr>';
    }

    ?>
</div>
  </body>
</html>


Ist er echt?

10.01.2007 11:40

10 Jörg Kruse

ich brauch auch die übergabe der seite...habe es mit $seite gemacht. jedoch kann er die nich übergeben, weil die später definiert wird.

Aber dann könntet du diese Definition im Script vorziehen, bzw. die Ausgabe mit dem Ankerlink nach hinten schieben?

Habe auch eine andere - evt. sinnvollere Lösung für den anker genommen. habe die post id genommen.

Um welche Variable handelt es sich dabei - $id? die ID in der Datenbanktabelle bezieht sich ja auf alle Posts in allen Threads und nicht nur auf einen einzelnen und ändert sich auch nicht, wenn mal ein vorangehende Post gelöscht wird. Oder meinst du eine andere Variable?

10.01.2007 11:57