Inhalt auf mehrere Seiten aufteilen [Blättern]

  • Ich bin grade dabei eine Art Blätternavigation / Seitennavigation oder wie man das ganze auch nennen mag zu erstellen aber ich kriege das mit dem aufteilen der Daten auf mehrere Seiten nicht hin.Konkret dabei die Anzeige der Seiten und die Weiterleitung dahin. So sieht das ganze derzeit aus:



    Es existieren derzeit schon so knapp 10 Testeinträge aber es werden nur 5 Einträge angezeigt und die Anzahl der Seiten beläuft sich auch nur auf 1, obwohl es ja jetzt eigentlich 2 sein müssten? Es wird nur ausgegeben Seite: 1 und mehr nicht. Zudem ist oben in der url aber auch keine seite (page) zu sehen, müsste die nicht auch gesetzt sein?
    Aktiv steht dafür, das der Eintrag ebend aktiv oder nicht ist, weil ich es von vornherein mit einbauen wollte, das der Admin Einträge deaktvieren kann oder dergleichen.
    Das mit der Anzahl der Seiten hat sich jetzt erledigt, das war ein kleiner Fehler der Query, allerdings fehlt mir noch etwas ..
    So müsste das ganze nämlich aussehen:


    PHP
    $query = $dbz->query("SELECT * FROM guestbook WHERE aktiv = '1' ORDER BY id DESC LIMIT $start, $entrysAPage");
    $entryAmmount = $dbz->query("SELECT COUNT(id) FROM guestbook WHERE aktiv = '1'")->fetchColumn();


    Jetzt wird auch die richtige Anzahl der Einträge ausgegeben und die Seiten wie gesagt auch, allerdings benutze ich ja auch $_GET um zwischen den Seiten zu wechseln und um ungültige Links direkt auf die Indexseite zu leiten aber wie kriege ich die page da jetzt rein? Sonst habe ich nichts verändert.


    So sieht die index.php aus:


    und so dann der link zum gästebuch:

    PHP
    <a href="index.php?site=guestbook">Gästebuch</a>


    Wenn ich dann jetzt aber auf Seite 2 klicke, dann komme ich auf die index.php. Oben in der Adresszeile steht dann:
    IP/testseite/index.php?page=2 aber ich will ja auf dem Gästebuch bleiben aber dann natürlich mit der "page".
    Sollte das dann oben mit dem $_GET so nicht passen ... ?

  • Da wird kein key "guestbook" in der url sein, wenn der switch dort nicht reinspringt.
    siehe:

    PHP
    $page = $i + 1;   
        if($site == $page) // If user is on that page, print no link
        {
            echo " $page ";
        }
        else // If user is not on that page, create link
        {
            echo " <a href="?page=$page">$page</a> ";
        }


    beim letzen echo sollte sowas rauskommen:

    Zitat


    {host}?page=2


    probier mal das hier:

    PHP
    $page = $i + 1;   
        if($site == $page) // If user is on that page, print no link
        {
            echo " $page ";
        }
        else // If user is not on that page, create link
        {
            echo " <a href="?site=guestbook&page=$page">$page</a> "; // beachte das & zeichen
        }


    natürlich auch überall, wo du einen link anbietest der zum GB führen soll.


    Hinweis:
    Du nutzt PDO, schreibst dann aber doch wieder $vars in die Query.
    Auch wenn Du mysql_realy_esc ....() nutzt.
    Irgendwann - bei nem update o.ä. - schleicht sich ein Schusselfehler ein und in die Query wird eine unmaskierte $var geschrieben.
    Lösung:
    - nutze Platzhalter, wie es die PDO - Prepared Statements vorsieht,
    - im Fall LIMIT nur Ganzzahlen zulassen: "SELECT .... LIMIT " . (int)$start . ", " . $entrysAPage . ";"
    Selbst verständlich ersteres empfohlen =)


    Noch ein Hinweis:
    falls Du doch mal $vars in die Query schreiben musst (dynamsch tablenames - können ja nicht mit Platzhaltern genutzt werden),
    dann die maskierung (mysql_real_esc..., (int), oder was auch immer) direkt in oder über der Query.
    Andere und du selbst brauchen dann nicht in anderen Files/Zeilen suchen, um zu erfahren ob die $var bereits behandelt wurde.


    EDIT:
    Hinweis 3

    PHP
    if(isset($_GET['page']))    
                $site = 'guestbook?' . $_GET['page'];


    "Kann man machen, muss man aber nicht".
    Nicht Klammern nutzen ist nicht cooler als Klammern nutzen. Aber Klammern nutzen ist sicherer.
    Letztes Populäres Bsp war "apple goto bug"

    Code
    // code 1ster google treffer: http://opensource.apple.com/source/Security/Security-55471/libsecurity_ssl/lib/sslKeyExchange.c
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0)
            goto fail;
            goto fail;
        if ((err = SSLHashSHA1.final(&hashCtx, &hashOut)) != 0)


    EDIT: Du kannst bei kuzen Sachen natürlich auch das hier nutzen:

    PHP
    (isset($_GET['page'])) and ($site='guestbook?' . $_GET['page']);


    Ich lasse dabei die Klammern () um die Bedingungen und Zuweisungen, um es "Blockweise" zu erkennen.
    Auch das $site='guestbook' ohne Leerzeichen soll deutlich machen, dass hier kein Vergleich, sondern eine gewollte Zuweisung passiert.
    Das hier würde auch funktionieren:

    PHP
    isset($_GET['page']) and $site='guestbook?' . $_GET['page'];
  • Ja, das kam auch beim letzten echo raus, da hast du Recht.


    Das mit dem & zwischen den Get Parametern hatte ich auch mal wieder total verlegt, danke. -,-
    Bei dir fehlte noch das escapen der " aber das habe ich natürlich mal ergänzt. Einen link zur ersten Seite des GB's muss man doch nicht unbedingt mitschicken? Ich habe ja auch schließlich das am Anfang stehen:

    PHP
    $site = isset($_GET["page"]) ? mysql_real_escape_string($_GET["page"]) : 1;


    von daher ist das doch sonst nicht unbedingt nötig oder liege ich da jetzt falsch?


    Ich habe auch noch einmal unter dem $site = .... das hier eingefügt, weil ja ein Limit schließlich negativ sein darf, hatte ich nämlich zwischendurch auch irgendwie mal hingekriegt. :D

    PHP
    if($site <= 0)
    	$site = 1;


    Gibt es eigentlich bei der Kurzschreibweise ein else / else if, sodasss man das oben in den Teil einfügen kann?


    Zu der PDO Sache:
    Ja, wo du es ja jetzt auch sagst sollte man da warscheinlich auf jeden Fall ein Prepared Statement verwenden, vor allem da $site ja eine Benutzereingabe ist aber bei $entryAPage müsste man das doch nicht unbedingt machen? Sollte man $site dann eigentlich auch noch zu einem int casten, also bei der BindParam Methode oder ist das dann unnötig?


    Zu dem Hinweis mit der $_GET['page] ..
    Naja, ist doch bestimmt sauberer, wenn man das so macht? Ansonsten würde man ja auch nicht bei manueller Eingabe der url zum GB kommen?
    Das mit den Klammer weiß ich auch nie genau aber das ist ja auch Stilabhängig? Man kann es ja letzendlich sowieso nur bei einer Anweisung in der if-Kontrollstruktur machen? Wasa du mir jetzt konkret mit dem Beispiel sagen willst weiß ich nicht? Ich sehe da erstens keinen fail Punkt oder wie man das bei goto nennt oder geht es darum, dass das untere if statement und die goto Anweisungen eigentlich in der if-Kontrollstruktur sein sollten? ;)


    Das mit der Überprüfung in der index.php Datei sollte übrigens so lauten: Da habe ich doch glatt wieder das & vergessen.

    PHP
    if(isset($_GET['page']))	
    	$site = 'guestbook&page' . $_GET['page'];


    Du hast meinen Fehler auch mitkopiert aber ist ja auch egal.


    Das mit deinem letzten Tipp habe ich ja noch nie gesehen (also auch, das man da in der if Bedingung? eine Variable setzt). Wenn eine if-Struktur mal zu lang wird, dann setze ich auch ab und zu noch extra Klammern, damit man das ganze noch einigermaßen lesen kann. Kann man denn bei deinem Beispiel da einfach das if weglassen?


    Wie könnte man es eigentlich erreichen, das nur die nächsten 10 Seiten von der aktuellen ausgehend angezeigt werden? Dazu müsste man ja warscheinlich die page mit allPages vergleichen?

  • Zitat

    Einen link zur ersten Seite des GB's muss man doch nicht unbedingt mitschicken? Ich habe ja auch schließlich das am Anfang stehen:
    ...
    von daher ist das doch sonst nicht unbedingt nötig oder liege ich da jetzt falsch?


    Versteh ich nicht , also verstehe dir Frage nicht :D


    Wegen negativ Wert: ja, Du ziehst ja glaub ich ab ( - einträgeProSeite), da kann das bei Seite 1 passieren.


    Zitat

    Gibt es eigentlich bei der Kurzschreibweise ein else / else if, sodasss man das oben in den Teil einfügen kann?


    Versteh ich auch nicht ganz :D
    meinst Du:

    PHP
    $var = ($wenn <= 0) ? $dann : $sonst /* und hier noch ein else if ? */; 
    // else if gibts in der schreibweise nicht, aber man kann (einigen wird das evtl nicht gefallen =)
    $var = ($wenn <= 0) 
        ? $dann 
        : (                   
            ($wenn > 0)
                ? $dies
                : $das
        );


    Ich nenne das die traurigen :D


    Zu PDO:
    auf jeden Fall BindParam nutzen. (int) muss nicht, da über bindParam(, PDO::PARAM_INT) ein integer an die Stelle des Platzhalters "gesetzt" wird.

    Zitat von http://php.net/manual/de/pdo.constants.php

    PDO::PARAM_INT (integer)
    Stellt den Datentyp SQL INTEGER dar.


    Auch deswegen bindParam, weil über die "normale" Art und Weise (also ohne bindPara) ein String an die Stelle gepackt wird.
    Dann käme sowas raus:

    SQL
    SELECT ... LIMIT '1', '21';


    ... was ja invalid ist.
    Behalt Dir einfach immer im Hinterkopf: ohne bind wird ein String an die Stelle geschrieben.


    Zu goto:
    Ich dachte Du kennst das evtl.
    Das war ein Bug bei Apple, bei dem:

    Code
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0) // hier keine klammern genutzt, also NUR die nächste anweisung zählt
            goto fail; // <--- das hier sollte so sein (springt zu einem punkt der den namen fail bekam)
            goto fail; // <--- copy/paste fehler oder shortcut fail für "dupliziere zeile" ? -- jedenfalls wird das hier ausgeführt


    Mit klammern hätten beide in den Klammern gestanden -- nix wäre passiert.

    Code
    if ((err = SSLHashSHA1.update(&hashCtx, &signedParams)) != 0){
        goto fail;
        goto fail;
    } // würde man zB durch copy/paste die Klammer "wegkopieren, dann gäbe es einen fehler beim compilieren/ausführen (fatal error)
    // klammern ^= mehr sicherheit


    Zum letzten Bsp:
    Nich teinfach weglassen.
    Ich versuchs mal zu erklären:


    Zitat

    Wie könnte man es eigentlich erreichen, das nur die nächsten 10 Seiten von der aktuellen ausgehend angezeigt werden?


    Du meinst wenn es 100000 Seiten wären, dass nicht alle über dir Nav angezeigt werden?
    Also
    [ANFANG][1][2]...[10001][10002][ENDE]
    Das bekomme ich heute nicht mehr hin :D

  • Naja, du hast doch das hier geschrieben:



    Daraufhin habe ich ja geschrieben:

    Code
    Einen link zur ersten Seite des GB's muss man doch nicht unbedingt mitschicken? Ich habe ja auch schließlich das am Anfang stehen:
    [code=php]$site = isset($_GET["page"]) ? mysql_real_escape_string($_GET["page"]) : 1;

    [/code]


    Deine Aussage bezog sich doch auf den Link oder nicht? Das heißt wenn ich irgendwo auf der Seite einen Link zum Menü habe dann brauche ich doch nicht unbedingt das hier machen?

    HTML
    <a href="index.php?site=guestbook&page=1">Gästebuch</a>


    Das hier sollte doch dann reichen?

    HTML
    <a href="index.php?site=guestbook">Gästebuch</a>



    Warum du das mit der else, else if Abzeigung nicht versteht, verstehe ich aber jetzt mal gar nicht. :D
    Naja, man hat ja normalerweise das hier:


    PHP
    $site;
    if(isset($_GET["page"])
    	$site = $_GET["page"]
    else
    	$site = $_GET["page"] . 1;


    und das ist ja dann die Kurzschreibweise:

    PHP
    $site = isset($_GET["page"]) ? mysql_real_escape_string($_GET["page"]) : 1;


    Und da wollte ich wissen, ob man das auch mit der

    PHP
    if($site <= 0)
    	$site = 1;


    da einbauen kann, als else if würde man das ja warscheinlich machen, jetzt klar? ;)


    Würdest du das dann lieber nicht mehr in der Kurzschreibweise erledigen? Man könnte ja auch oben noch die "page" eingeben, von daher ist es ja sicherlich schon sehr sinvoll das abzufragen?!


    Zu PDO
    Sollte man denn da immer den Typen hinten mit anhängen, also bei der BindParam Methode? Ich habe das nämlich bei den meisten querys nicht gemacht, also das ich noch hinten geschrieben habe PDO::PARAM_INT oder was auch immer. Dazu noch einmal eine kleine Verständisfrage: Der Typ ist doch der, dem die Variable entspricht oder ist damit nachher der Typ in der Datenbank gemeint?


    Zu goto
    Ja, ich kenne goto, allerdings habe ich das nie benutzt, damit soll man doch auch Spaghetticode produzieren? ;)
    Von daher kenne ich mich eher mit dem goto nur sehr wenig aus, da es nie irgendwo empfohlen wird und weil viele auch einfach von der Verwendung abraten.


    Das mit dem Block meinte ich ja so, wie du es da gezeigt hast, dann habe ich das ja doch richtig interpretiert.
    ... Was soll ich sagen kann halt sowieso immer mal passieren, das man eine Klammer vergisst oder nicht? Zwar würde der Server direkt bei einer einzelnen Fehlenden Klammer meckern aber bei der Schreibweise ohne Klammern ja nicht. Ist schon ein berechtigtet Einwand aber wie gesagt, da kann man sich ja lange drüber streiten?


    Noch einmal eine extra Frage zu PDO:
    Muss man eigentlich bei PDO auch sowas hier machen ?

    PHP
    $query->execute();
    $entries = $query->fetchAll();


    gehört da auch irgendwie ein or die("PDO Fehler") oder so hin, eigentlich ja nicht oder? Schließlich hat man ja bei PDO try-catch


    Zum letztem Beispiel
    Puuh, ich dachte schon, hehe ...
    Danke für die Beispiele aber in der Regel mache ich das auch nur bei größeren Sachen oder wenn die Abfrage kompliziert wird aber auch da lässt sich drüber streiten?


    Zu deiner letzten Frage:
    Ja, das meine ich damit. Wenn man irgendwie mehr als 30 Seiten (oder noch viel mehr) hat, würde das ganze sicherlich sehr interessant aussehen. :D


    Was anderes:
    Eigentlich gehört das ja nicht zu dem Thema hier aber höchstens indirekt aber ich frage ich einfach mal.
    Ich weiß zwar nicht, ob du dich so mit HTML & CSS auskennst aber wenn nicht ist auch egal, warscheinlich dann ja jemand anders hier.


    Es geht um HTML und CSS und zwar habe ich ein Element, was zwischen einem float: left Element und einem text-align: center Element sein soll und das wirklich dazwischen, also in einer Linie. Rechts ist zudem noch ein float: left Element aber wenn ich jetzt bspw. ein span Element einfüge und das dann ebenfalls float: left mache, dann ist das doch okay oder? Man kann ja zwei Elemente nebeneinander floaten lassen oder geht das auch irgendwie einfacher?


    Empfiehlt es sich eigentlich auch XHTML konform zu Strukturieren? HTML ist ja keine Programmeirsprache, von daher sage ich an dieser Stelle mal nicht "programmieren".
    Ich frage mich bspw. immer, ob ich input Elemente so schließen sollte > oder so? />
    Eigentlich ist man ja letzteres auch generell von HTML gewöhnt, wie bei allen Elementen schließt man ein Tag ja mit />, also sollte man das so machen, obwohl > bei input Elementen ja normal ist?

  • Zu Link: ja.


    Zu else if:
    oO?

    PHP
    $site = isset($_GET["page"]and (int)$_GET["page"] > 0) ? (int)$_GET["page"] : 1;  // mysql_real_escape_string lass ich absichtlich weg =)


    Ich glaube das wolltest Du erreichen - dass site nicht kleiner als 1 sein kann?


    Zu PDO
    Mir fällt gerade ein - ich glaub Du hattest mysqli_... genutzt.
    Dann wird das anders gehandhabt.
    bsp mysqli_

    PHP
    // http://php.net/manual/de/mysqli-stmt.bind-param.php
    $stmt = $mysqli->prepare("SELECT ... LIMIT ?,?"); // mysqli_ kann nur mit "?"-platzhaltern umgehen
    $stmt->bind_param('ii', $start, $entrysAPage); // "ii" gibt an, dass 2 integer an stelle der platzhalter eingefügt werden
    // info: jedes zeichen zählt für den jeweiligen platzhalter.
    // bsp: 
    $stmt->bind_param('isd', $integer, $string, $double_which_if_also_float);


    bsp PDO::


    Es geht hier als nicht um den Typ, den die Variable hat, sondern darum,
    als was für ein Typ der Wert der Variable an die Stelle des Platzhalters geschrieben wird.


    Wenn Du nun mysqli_ nutzt, dann sollte man egtl "i" fpr integer nutzen, wenn man eine Ganzzahl zuweisen will.
    (Man muss, wenn man LIMIT mit Platzhaltern nutzt)


    Zu dem Schreibweisen:
    japp, es gibt (gerade in PHP) viele Varianten - viele Schreibweisen. Jeder macht es anders.



    Zu fetchAll:
    ich würde anstatt ->query ->prepare und Platzhalter nutzen =)
    http://php.net/manual/de/mysqli.prepare.php
    (
    musst nicht. aber ich find es "richtiger", wenn man
    a) immer die gleiche Art nutzt (also prepare/execute)
    b) wenn gnadenlos alle Werte per Platzhalter in Queries gesteckt werden
    )
    Aber auf jeden Fall die Fehler abfangen.
    Beim connecten können Fehler auftreten,
    beim preparen, und beim executen.
    (kommt natürlich auf die Variante an - also mysqli_ oder PDO::)


    HTML/CSS ist dann in der Tat nicht mein Ding.
    Ich kenne es, mag es aber nicht :D

  • Also muss man bei eimen Link in einem Menü nicht unbedingt die "page" mitgeben? Das war mit ja gemeint?


    Müsst das nicht eigentlich so aussehen mit dem Ausdruck?

    PHP
    $site = (isset($_GET["page"]) and (int)$_GET["page"] > 0) ? (int)$_GET["page"] : 1;


    Bei deiner Version gibt es auch übrigens einen Fehler (unexpected T_LOGICAL_AND expecting '' or ')'
    Sollte man das nicht auch lieber mit dem casten lassen, also zumindest in dem Fall? Das gibt doch einen Fehler, wenn da kein int steht?
    Wieso denn 8| ? ?(


    Wieso hatte ich den mysqli genutzt? Bis jetzt benutze ich, zumindest soweit wie ich das sehen kann nur PDO? ?(
    Ich hatte das ganze dann auch übrigens direkt geändert und jetzt sieht das so aus. Das ist doch PDO oder werde ich jetzt verrückt? ;)

    PHP
    $query = $dbz->prepare("SELECT * FROM guestbook WHERE aktiv = '1' ORDER BY id DESC LIMIT :start, :entrysAPage");
    $query->bindParam(':start', $start, PDO::PARAM_INT); 
    $query->bindParam(':entrysAPage', $entrysAPage, PDO::PARAM_INT); 
    
    
    
    
    $query->execute();
    $entries = $query->fetchAll();


    Diese Platzhalter oder Prepared Statement benutze ich bei Benutzereingaben ja auch immer, wie empfohlen aber eigentlich auch nur dann. Ist es nicht sonst auch eigentlich eher unnötig? Meistens hat man zwar sowieso Benutzereingaben da stehen, zumindest bei mir aber wieso nutzen, wenn man's nicht braucht? Ich werde mich da auch noch einmal ein wenig umschauen.


    Zu den Fehlern:
    Die Fehler beim connect etc fange ich aber brauche ich denn auch noch ein or die() hier bspw, also wenn das schon in einem try-catch Block ist?


    Das prepare könnte man doch auch außerhalb des Blockes legen oder kann da auch eine Exception auftreten. o.O?
    BTW: HTML / CSS mag ich auch nur bedingt und in solchen Fällen meist eher nicht. :D

  • Nein, wieso. Wenn &page nicht reinkommt, dann will/soll Nutzer doch sicherlich auf die Seite 1 von guestbook.


    Ja, hab da nicht aufgepasst und das and ... in isset() geschrieben :D


    Zitat

    Das gibt doch einen Fehler, wenn da kein int steht?


    oO? Wo steht kein int?


    Ja, das ist PDO. Ich komme manchmal durcheinander wer waqs hatte und nutze ... =)
    mysqli_ ist ja "auch PDO" -- genauer: mysqli_ baut auf der von PHP vordefinierten Klasse PDO:: auf
    (...und verwirrt nur unnötig mMn mit vielen vielen Funktionen und ... egal - nicht das Thema hier :D )


    Zitat

    Ist es nicht sonst auch eigentlich eher unnötig?


    Naja ... wenn Du mich fragst: nein :D
    Sobald Du den Code updaten willst, und dort auf einmal einen Platzhalter brauchst, dann schreibst Du wieder alles um.
    Aber - wie immer - Ansichtssache.


    Zitat

    brauche ich denn auch noch ein or die()


    Nein, das die() wird doch meistens nur in Beispielen verwendet.
    Allerdings wird echo '' . $e; nicht funktionieren.
    Wenn Du eine Exception (in diesem Fall eine Erweiterte Exception mit dem Namen "PDOException") fängst,
    dann hast Du ein Object.
    Du kannst ja zB mal beim Login der db mit Absicht ein Fehler einbauen (zB falsche pw) und dann fängst Du die Exception (PDOException)
    und gibst sie mit var_dump($e) aus. Dann siehst Du, was da drin steckt.
    Siehe auch: http://php.net/manual/de/class.pdoexception.php
    So bekommst Du zB die Fehlermeldung:

    PHP
    {
    ...
    }
    catch(PDOException $e)
    {
        echo $e->getMessage(); // $e ist ein objekt der klasse "PDOException" und wir rufen dessen methode ->getMessage() auf
    }
    getMessage



    ->prepare() wirft (im Normalfall) keine Exception.
    Aber:

  • Gut, dann wären die ersten Sachen ja schon einmal geklärt, also muss das nicht.
    Das mit dem vergessen der Klammer ist ja auch nicht so schlimm, schließlich gucke ich mir das ganze ja auch noch an. :D


    Zu der Sache mit dem casten:
    Ich meine bspw. wenn man oben dann page=hallo eingibt, gibt das dann nicht einen Fehler beim casten, denn das kann ja nicht in einen int wert gecastet werden?!

    Zu den Abfangen der Fehler:
    Höh? Ich hatte doch schon ein zwei mal einen Fehler und da stand der Fehler ausführlich ausgeschrieben? Ich gucke mir das mti dem var_dump dennoch gleich mal an.Was ist denn ifs? Kenne ich nicht. ;)
    Was willst du mir denn dann mit dem letztem Teil sagen? War das jetzt nur ein Beispiel, wie man dann an den Fehler rankommt? Sollte man das Error Handling denn dann ändern?
    Die prepare und BindParam Methoden können aber jetzt wie gesagt außen bleiben?


    Das war's dann auch eigentlich mit diesem Thread hier. Fehlt eigentlich
    nur noch das mit dem anzeigen der aktuellen Seite + 10 vor und zurück
    oder so.
    Hast du da auch noch einen Tipp für mich?

  • Zu der Sache mit dem casten:
    Doch, oder wir meinen nicht das gleiche.


    Du erzwingst also den Typ und bekommst die Value, die für diesen Typ "passt".



    Zu den Abfangen der Fehler:
    error-handling ändern: wenn Du das willst und brauchst.
    Empfehlen würde ich es nicht.


    Also ja, ->prepare und ->execute können ohne try/catch-Block genutzt werden.
    Dafür waren auch die Beispiele - Du bekommst ja keinen Fehler vom catch(), sondern musst die Objekte ($dbh / $stmt) nutzen.


    Wegen der Nav:
    Eigtl ist es ja einfach. ... eigentlich =) Ich tu mich damit aber auch oft schwer.
    Mal angenommen Du hast 1000 Einträge. Dann willst Du
    a) nicht alle 1000 via Sql laden (könnte vorallem php max memory limit übersteigen)
    b) nicht 1000 Buttons/Links in der Nav


    a) hast Du ja schon gelöst - Du fängst bei $start an, und lädst nur $entrysAPage Datensätze.
    b) ist ein bissl Rechnerei:


    (folgendes Script kannst Du als Test direkt starten)

  • Hm .. ich dachte, das ich das mal anders gelesen hatte aber das ist wohl C#, da gibt auf jeden Fall einen Fehler. :D


    Ist das === in Zeile 25 eigentlich Absicht? Ich schätze mal nicht oder? Ich habe nämlich da jetzt ein == hingesetzt.


    Das mit dem Anzeigen der nächsten paar Seiten funktionierrt jetzt auch fast, allerdings gibt es da noch zwei Fehler, zumindest bei mir.
    1. Wenn ich 5 Einträge aus der DB hole, dann kriege ich die 3. Seite angezeigt, obwohl ich $n = 1 habe. Bei der letzten Seite kriege ich dann auch noch die zweite davor angezeigt.
    2. Wenn ich 10 Einträge aus der DB hole, dann gibt es keine Seite 1, also nichts wird dafür ausgegeben aber die Einträge werden angezeigt. Wenn ich dann auf die zweite Seite gehe, dann wird die erste Seite wieder angezeigt. ($n ist auch = 1)


    ich poste das ganze noch einmal hier, vielleicht habe ich auch was falsch gemacht.


    Das ganze wollte ich natürlich an eine bestimme Stelle einfügen, also habe ich das natürlich mit smarty und ohne echo gemacht:


    Du hättest mir auch nicht unbedingt das ganze machen müssen aber auf jeden Fall ein dickes Danke.


    P.S: Ist die Query oben so okay?
    Du hast dich ja beschwert, das ich nicht alles holen soll, also *. :thumbup:

  • Zitat

    Du hättest mir auch nicht unbedingt das ganze machen müssen aber auf jeden Fall ein dickes Danke.


    Kein Problem. Wollte das sowieso mal schreiben.
    Hatte das schon mal angefangen, aber das wurde zu umfangreich und war für ein CMS angepasst. Das konnte man unmöglich mal auf "die schnelle" wieder verwenden.
    Hab das Ganze mal in eine Klasse gepackt und ein Bsp erstellt -> Einfache Seitennavigation (PageNav)


    Ich denke mal einfacher kann man die Links nicht erstellen.


    BTW: die Version die ich Dir vorher gegeben hatte war verbuggt :D


    EDIT: ja, die Query sieht gut aus =)

  • Mh, ich hatte heute auch noch nicht geguckt und bin selber dran geblieben und ich habe es auch hingekriegt.
    So funktioniert es auch, jedenfalls habe ich bis jetzt noch keinen Fehler gefunden. ;)


    Ja, die Version die du mir gegeben hast war echt verbuggt. :D
    Meine Lösung ist auch ziemlich einfach aber halt nicht Objektorientiert oder ist da noch irgendwo ein Fehler? Wäre gut, wenn du oder jemand anders noch einmal einen Blick darauf werfen könntest.

  • naja, wenn man diese nicht verigisst werden die ja automatisch hinzugefügt.
    Bei jeweils nur 1 Bedingung bin ich mir nie sicher, ob ich die nun dahin machen soll oder nicht.


    Ich brauchte die Seitennavigation nun jetzt auch doch auf mehereren Seiten und damit ich das ganze nicht auf jeder Seite manuell prüfen muss, habe ich mir das ganze auch mal ein wenig zurecht gelegt aber auf der Basis von cottons Lösung.
    Das ganze sieht bei mir so aus.



    Allerdings habe ich irgendwie einen kleinen Fehler. Wenn eine Seite eingegeben wird die größer ist als die letze, soll ja die letzte ausgewählt werden, was auch funktioniert aber leider wird der Inhalt der letzten Seite dann nicht geladen und der Inhalt der Seite bleibt dann leer, wieso? Ich überprüfe dies doch auch oben? Bei einer negativen Zahl funktioniert es seltsamerweise.


    Hier mal die Erzeugung der instanz der Klasse:

  • Zur calc kann ich jetzt nix sagen. Aber Du kannst ja mal prüfen ob alles ok ist wenn
    - du -1 als Seite in die URL eingibst (page)
    - du a, oder irgendwas nicht numerisches als Seite in die URL eingibst (page)
    - du eine sehr große Zahl (zB 11111111111111111111111111) als Seite in die URL eingibst (page)
    - keine seite (URL page=) angegeben wurde
    usw ...


    Der try/catch block ist (default Einstellungen PDO) unnötig/nicht wirksam.
    prepare und execute werfen keine Exceptions (by default).
    Du musst prüfen, ob execute und prepare erfolgreich waren.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!