PHP Seitennavigation: problem beim round()

Blackbenji

Lieutenant
Registriert
Nov. 2009
Beiträge
565
Hallo,

für die Navigation durch den Content möchte ich eine Navigation einbinden. Errechnet werden alle Beiträge, geteilt durch die anzuzeigenen Beiträge. Somit errechnen sich die Seitenzahlen.

PHP:
    public function Navi() {
        $db_result = $this->database->runSQLQuery("SELECT id FROM blog_content WHERE state = 1");
        $count = mysql_num_rows($db_result);
        $round_count = round(($count / ITEM_PRO_SITE) + 0.5, 0);
        $links = '';

        for($i=1; $i<=$round_count; $i++) {
            if($i != $round_count) {
                $links .= '<a href="?site='.$i.'">'.$i.'</a>  &middot; ';
            }
            else {
                $links .= '<a href="?site='.$i.'">'.$i.'</a>';
            }
        }
        return $links;
    }

Mein Problem ist: wenn ich 3 Items pro Seite habe, und 6 Beiträge in der Datenbank vorhanden habe, bekomme ich 3 Seiten angezeigt, wobei Seite 3 komplett leer ist, denn seite 1 und seite 2 zeigen jeweils 3 einträge an.

ich habe versucht mehrfach die formel umzustellen, komme aber zu keinem anderen ergebnis ...?
 
Das liegt eben daran, dass du immer einen um 0,5 zu hohen Wert hast. round() rundet selbstständig auf oder ab, darum musst du dich nicht kümmern. Verwende lieber floor() oder ceil() bei solchen Sachen (in dem Beispiel lieber ceil(), damit du auf volle Seiten kommst).
 
Hallo,

ich würde an deiner Stelle die Abfragen direkt im MySQL Query Filtern (Stichwort: LIMIT), somit sparst du dir unnötigen Code.

LG
 
@Yuuri: danke, funktioniert!

@liKe2k1: mit LIMIT kann ich aber nur x bis y beiträge darstellen und keine navigation für die seiten erstellen, oder? das wäre mir jedenfalls neu.

LIMIT nutze ich bereits zum anzeigen von seite 2, beiträg 4 bis 6.
 
Zuletzt bearbeitet:
LIKE (select * from ... where x LIKE '%asdf%')? Ich denk eher LIMIT (select * from ... LIMIT 11,20)
Mach dein SQL-Query besser zu
Code:
$db_result = $this->database->runSQLQuery("SELECT count(id) FROM blog_content WHERE state = 1");        
$count = mysql_fetch_row($db_result)[0];
Sonst würdest du bei einem Blog mit 1 Mio. Einträgen zuerst 1 Mio Zeilen laden, nur um die Anzahl derer zu bestimmen, lecht ineffizient oder ;).
 
@Hancock sorry, tausche bitte LIKE durch LIMIT, ich war gestern abend einfach zu müde.

mein default aufbau sieht so aus:
PHP:
        default:
            if(!$content->checkData()) {
                $tpl->display(TEMPLATE_DIR.'error.html');
            } else {
                if(!isset($_GET['site'])) {
                    $site = '0';
                } else {
                    $site = $_GET['site'] * ITEM_PRO_SITE - ITEM_PRO_SITE;
                }
                $tpl->assign('navigation', $navigation->Navi());
                $tpl->assign('content_array', $content->fetchContenData($filter_state = 1, $site));
                $tpl->display(TEMPLATE_DIR.'content.html');
            }
            break;

PHP:
    define('ITEM_PRO_SITE', '3');

wobei daraus halt der SQL-Befehl:

PHP:
        $db_result = $this->database->runSQLQuery("
            SELECT *,
            DATE_FORMAT(date, '%d.%m.%Y') AS date_format,
            DATE_FORMAT(date, '%H:%i:%s') AS time_format FROM ".GLOBAL_CONTENT_DB."
            ".($id !== false ? ' WHERE id = ' . $id : '')."
            ".($state !== '' ? ' WHERE state = ' . $state : '')."
            ORDER by date DESC
            ".($site !== '' ? ' LIMIT '.$site.','.ITEM_PRO_SITE : '')."
            ");

default werden also 1-3 datensätze angezeigt.

mir ging es aber um die navigation, die mit @Yuuri berechnung korrekt nun berechnet wird. ich muss ja irgendwo sagen dass ich auf seite 2 bin, und damit eintrag 4-6 angezeigt wird.
 
Zurück
Oben