Einfache Pagination innerhalb einer Funktion

  • Hallo,

    sorry ich muss nochmals etwas fragen. Auf meiner Seite werden gut 200 Einträge ausgeben, einfach viel zu viel für eine Übersicht (vor allem wenn das Internet mal wieder etwas langsamer ist). Deshalb habe ich mich dazu entschlossen eine Pagination einzubauen. Außerhalb einer Funktion funktioniert diese auch, innerhalb einer Funktion verstehe ich nicht so recht, wie ich ein Daten übergeben kann / muss. Ich beschäftige mich erst seit ein paar Wochen mit dem Thema Funktionen. Vielleicht könnt ihr mir hier nochmals weiterhelfen.


    Meine Funktion sieht derzeit so aus

    Hier kommt meine Ausgabe (bis hierhin geht noch alles)

    Jetzt kommen wir zu diesem Punkt der Probleme macht

    Folgende Fehlermeldung erhalte ich: Notice: Undefined variable: amount

    Ist eigentlich auch klar, denn $amount wird _in_ der Funktion festgelegt und wird dann nicht übergeben, die Frage daher, wie kann ich diese übergeben? Der nächste Fehler der wohl anschließend kommen wird ist, dass $pages nicht gefunden wird, denn auch diese Variable wird in der Funktion berechnet. Und zu guter letzt könnte auch noch ein Problem mit LIMIT auftrete?

    Ich hoffe Ihr könnt mir hier nochmals helfen. Vielen Dank schon einmal.

  • Zu Funktionen: http://www.php-kurs.com/funktionen-in-php.htm
    Wenn Du außerhalb einen Wert berechnest (zB $amount) und in die Funktion reinschicken möchtest,
    dann erweiterst Du die Funktion um:

    PHP
    function kundengruppen_test($mysqli, $amount) {
    ...


    Wenn $amount nicht immer übergeben wird, sondern auch mal ein default-Wert genutzt wird,
    dann:

    PHP
    function kundengruppen_test($mysqli, $amount=0) { // default 0, wenn nicht uebergeben
    ...


    Hier mal alles in den Kommentaren beschrieben:

    EDIT:
    hatten wir das hier nicht schon mal?

    HTML
    echo "<div class="pagination">";


    Du siehst schon am code-Highlight, dass die " nicht stimmen =)

  • Hallo,

    danke dir wieder für deine Hilfe. Allerdings bekomme ich jetzt jede Menge an Fehlermeldungen :/

    Warning: Missing argument 2 for kundengruppen_test(), called in /index.php on line 102 and defined in /index.php on line 27 Fatal error: Call to a member function execute() on a non-object in /index.php on line 33

    EDIT: OK der Aufruf der Funktion muss nun so lauten

    PHP
    $kundengruppen_test = kundengruppen_test($mysqli, 'LIMIT');

    'Und dieses habe ich hinzugefügt:

    PHP
    $limit = 'LIMIT';

    Jetzt erhalte ich noch eine Fehlermeldung:

    Warning: Division by zero in

    2 Mal editiert, zuletzt von martin2015 (23. August 2015 um 17:26)

  • Na ... hast Du da etwa einfach den Code kopiert und eingefügt? ;D

    Zitat

    Missing argument 2 for kundengruppen_test()


    Das 2te Argument (Parameter) für Deine Funktion wurde nicht übergeben.

    Zitat

    Call to a member function execute() on a non-object


    $stmt schlug wohl fehl (NULL -- kein object).

    ACHTUNG: hab gerade enn Fehler von mir gefunden:

    PHP
    $stmt->bind_param("ii", $$limit, $offset);


    da ist ein $ zuviel bei limit :huh:

    Der Code den ich gepostet hab ist so nicht zu gebrauchen. Sind alles Beispiele/Erklärungen.
    die Umsetzung musst Du machen. :P


    EDIT uz Deinem EDIT:

    PHP
    $kundengruppen_test = kundengruppen_test($mysqli, 'LIMIT');


    Falsch.
    Du musst Funktionen verstehen. Sieh Dir den Link an (php-kurs) -- das alles hier zu erklären macht keinen Sinn -- es steht ja alles schon dort =)
    EDIT: und/oder dort: https://www.youtube.com/watch?v=t8w18SrkCBc&ab_channel=PHPtutorialDeutsch
    (bzw: https://www.youtube.com/user/PHPtutorialDeutsch/search?query=funktionen%3F&ab_channel=PHPtutorialDeutsch)

    Einmal editiert, zuletzt von cottton (23. August 2015 um 17:31)

  • OK, ich habe es abgeändert, wie es in diesem Video erklärt wird: https://www.youtube.com/watch?v=yan2NKxUu0k

    PHP
    $kundengruppen_test = kundengruppen_test($mysqli, LIMIT);

    Da ich LIMIT irgendwo definiert habe, kann ich auf diesen Wert nun zurückgreifen und der Funktion diesen Wert von außen mitteilen. Jetzt habe ich allerdings GENAU die gleiche Meldung, wie ich sie in meinem ersten Posting hatte

    Notice: Undefined variable: amount in /index.php

  • Und Du weißt nicht, was die Meldung bedeutet, oder ...?
    $amount is nicht defniert.
    Entweder gar nicht, oder erst nach der Zeile, in der Du $amount nutzen willst.
    Oder die Definition von $amount ist durch einem IF (...) umgangen.

  • Ich habe das Gefühl du verstehst nicht wo mein Problem ist obwohl ich es in meinem ersten Posting exakt geschrieben habe :/

    In meiner Funktion function kundengruppen_test($mysqli, $limit) habe ich doch ein $res->bind_result($amount); diesen Wert benötige ich später hier if ($amount > LIMIT).

  • ok, verstehe jetzt.
    Dein Problem: Du definierst die var $amount IN der funktion kundengruppen_test.
    Diese brauchst du außerhalb.
    Dafür gibts mehrere lösungen.
    A)
    du gibst mehr also nur einen Wert aus der Funktion raus: ,

    PHP
    return array(0=>$amount, 1=>$kundengruppen_test)


    was ich allerdings hier NICHT empfehle.
    B)
    Du gibts übernimmst einen Parameter $amount per Referenz:

    PHP
    function kundengruppen_test($mysqli, $limit, &$amount){
        //...
        $amount = 1; // wäre bei dir $res->bind_result($amount);
    }
    $amount = null; // vordefinieren der var
    $... = kundengruppen_test($mysqli, LIMIT, $amount);


    $amount wurde von der Funktion als Referenz übernommen und innerhalb geändert.
    (siehe http://php.net/manual/de/language.references.php)
    C)
    (empfohlen)

    Du nutzt mehr als nur eine Funktion:


    und jetzt der Ablauf:

    PHP
    // du bist "ausserhalb" und irgendwo hattest du LIMIT (Konstante) und $mysqli schon definiert
    $amount = getAmountKdCategory($mysqli);  
    $offset = getOffset(LIMIT);  
    $kundengruppen = kundengruppen_test($mysqli, $offset, LIMIT, $amount);

    EDIT: Funktion getOffset() geändert -- default return Wert

  • Vielen vielen vielen Dank für deine Hilfe. Genau so habe ich es gemeint. Es werden zwar immer mehr Funktionen, aber OK :) Jetzt habe ich noch ein kleines Problem, diesen Wert von

    PHP
    $pages = ceil($amount/$limit);

    Benötige ich auch noch draußen. In meinem if ganz unten siehst du diese Zeile,

    PHP
    for($i=1;$i<=$pages;$i++)

    Habe ich also noch irgendwie die Möglichkeit $pages mit raus zu geben, oder benötigen wir dafür noch eine Funktion?

    EDIT:

    OK, ich habe diese Zeile aus der kundengruppen_test Funktion entfernt und außerhalb der Funktion dieses geschrieben:

    PHP
    $amount = getAmountKdCategory($mysqli);  
    $offset = getOffset(LIMIT);
    $kundengruppen_test = kundengruppen_test($mysqli, $offset, LIMIT, $amount);
    $pages = ceil($amount/LIMIT);


    $page muss ja in keiner Funktion definiert werden.


    Noch eine Nachfrage zu diesem:

    PHP
    define ('LIMIT', 15); 
    $limit = 'LIMIT';

    Muss ich $limit extra nochmals schreiben? Kann ich nicht direkt in den Funktionen überall auf LIMIT zurück greifen?

    Zu deiner Frage "echo "<div class="pagination">";" dieses hatte ich irgendwo hier im Forum kopiert und nun in dieses geändert

    PHP
    echo '<div class="pagination">';

    4 Mal editiert, zuletzt von martin2015 (23. August 2015 um 19:05)

  • Stimmt, hab ich gar nicht bemerkt :)
    Viele Funktionen sind nicht falsch.
    Vieles wird mehrfach gebraucht. Dann macht es Sinn diese Sachen auszulagern.
    Selbst bei $pages kann das Sinn machen, wenn Du die Berechnung dahinter an anderer Stelle nochmal benötigst.

    Du würdest also eine Funktion (Bsp-name) getPages() aufrufen -- un in dem Moment interessiert Dich nicht, was da drin passiert. Du willst nur das Ergebnis.
    Ohne Funktion würdest Du den Code kopieren - an die Stelle, an der Du sie brauchst.
    Und das kann gefährlich werden, wenn die Berechnung mal geändert wird.
    Es könnte passieren, dass Du den Code dann nur an einer Stelle änderst, an der anderen Stelle aber belässt.

    Aber ich will jetzt hier kein Buch schreiben :D

    EDIT zu Deinem EDIT :D

    PHP
    define ('LIMIT', 15); 
    $limit = 'LIMIT';


    Fehler.
    define() definiert eine Konstante LIMIT.
    Den Inhalt der Konstante bekommst Du dann einfach per

    PHP
    $limit = LIMIT;
    // oder constant('LIMIT'), aber das ist im normalfall nicht nötig, es sei denn
    // du hast den namen der const in einer var -- bsp:
    $const_name = 'LIMIT'; // ist string, klar
    $wert = constant($const_name); // siehe http://php.net/manual/de/function.constant.php


    Was Du gemacht hast: $limit den String "LIMIT" zugewiesen.

    Einmal editiert, zuletzt von cottton (23. August 2015 um 19:13)

  • Guten Morgen,

    hab nochmals eine Frage zu deiner Funktion

    PHP
    function getAmountKdCategory($mysqli){
        $sql = "SELECT COUNT(*) AS `amount` FROM kunden_kategorie;";
        $res = $mysqli->prepare($sql);
        $res->execute();
        $res->bind_result($amount);
        $res->fetch();
        $res->close();   
        return $amount; 
    }

    Ist es sinnvoll diese Funktion so umzubauen, dass ich diese auch für weitere Tabellen in meiner Datenbank benutzten kann, sprich dass ich ihr Parameter mitgebe oder sollte ich lieber für jede Tabelle eine eigene Funktion schreiben?

    Meine nächste Funktion wäre z.B. die Kunden, es ändert sich nur "kunden_kategorie" alles andere könnte gleich bleiben.

  • Immer so, wie es "am meisten Sinn macht" -- für Dich.
    Wenn Du auf verschiedenen Tabellen ein COUT brauchst, dann kann das Sinn machen.
    Dann musst Du aber zur Sicherheit prüfen, ob der String für den tbl-name auch in Ordnung ist (injection ...).

    EDIT: wenns and WHERE geht, dann kann es sein, dass es Sinnvoller ist mehrere Funktionen zu nutzen.
    Denn wenn Du in einer Funktion die WHEREs für (übertrieben) 10 verschiedene Queries zusammenbastelst, kann es sein, dass Du später nicht mehr durch siehst.
    Hier im Fall allerdings kein Problem.

  • Eigtl nicht. Wenn doch, dann hab och dort was falsch erklärt, oder falsch ge-script-ed :D
    guck mal hier:

    PHP
    /* **** **** **** create a new PageNav **** **** **** */
    $page_offset_current = isset($_GET['page']) ? $_GET['page'] : 1;
    $lines_count_all = 1001; // here you would use a db query like "SELECT COUNT(*) FROM tbl WHERE ..."
    $lines_per_page = 25; // how many lines per page are viewed
    $n = 5; // how many choices to each direction (left/right) (Nx[link/button] [page_offset_current] Nx[link/button])
    $PageNav = new PageNav($page_offset_current, $lines_count_all, $lines_per_page, $n);
    /* **** **** **** **** **** **** **** **** **** **** */


    Das würde in etwa für Dich bedeuten:

    PHP
    /* **** **** **** create a new PageNav **** **** **** */
    $page_offset_current = isset($_GET['page']) ? $_GET['page'] : 1; // <------- hier deinen GET-key ( $_GET['seite'] oder was du halt nutzt )
    $lines_count_all = getAmountKdCategory($mysqli, 'my_tbl_to_count'); // die maximale anzahl angeben
    $lines_per_page = 25; // wieviele datensätze per seite (zeilen in der liste...)
    $n = 5; // 5 wäre [1][2][3][4][5][-mitte 6-][7][8][9][10][11]
    $PageNav = new PageNav($page_offset_current, $lines_count_all, $lines_per_page, $n); // und nu einfach das ding "starten" -- dabei berechtet die klasse alle möglichen ... naja, den kram halt :D
    /* **** **** **** **** **** **** **** **** **** **** */


    Das HTML-Gerüst muss ich Dir ja hoffentlich nicht erklären :D
    (cottton out ... pennen :D)

  • Hallo,

    sorry ich muss nochmals fragen. Meine erste Funktion klappt sehr gut, bis zu diesem Zeitpunkt wenn ich diese zweimal aufrufen möchte :/

    PHP
    $kategorien = kategorien($mysqli, $offset, LIMIT, $amount);

    Und hier meine Funktion

    Wenn ich jetzt mit der gleichen Funktion ein Dropdown Feld füllen möchte, darf ich kein Limit haben, denn in diesem sollen ALLE Felder ausgelesen werden. Jetzt habe ich ein Problem oder?

    Im Dropdown benötige ich diese $offset, $limit, $amount drei Werte überhaupt nicht. Muss sie aber mit übergeben, denn sonst erhalte ich eine Fehlermeldung.

    EDIT: Meine Idee ist folgende

    scheint auch zu funktionieren. Die Frage ist, ob dieses auch die beste bzw. die richtige Methode ist.

    Mein Aufruf dann so: $kategorien = kategorien($mysqli, $offset, $limit=false, $amount);

    2 Mal editiert, zuletzt von martin2015 (26. August 2015 um 12:20)

  • Mein Aufruf dann so: $kategorien = kategorien($mysqli, $offset, $limit=false, $amount);


    Wenn Du die Funktion so definierst, dass zB der Parameter $limit eine Default-Value hat (also $limit=false),
    dann musst Du diesen Parameter beim Aufruf auch nicht angeben.

    PHP
    $kategorien = kategorien($mysqli);

    Thema Query: gibt wieder verschiedene Wege.
    Ich mach das meistens so:


    So siehst Du sofort, dass

    PHP
    if($limit !== false) ... // wenn also limit reingeschickt wurde (nicht default FALSE ist), dann "mach was damit


    usw.

    EDIT: ist das mit der PageNav zu viel? Frage dehalb, weil es ja verständlich sein soll. Wenn nicht, muss ichs mal ändern.

  • Hallo,

    EDIT: ist das mit der PageNav zu viel? Frage dehalb, weil es ja verständlich sein soll. Wenn nicht, muss ichs mal ändern.

    ich werde das heute Abend in Ruhe testen. Ich melde mich auf alle Fälle zu diesem Thema nochmals. Danke auch für deine Hilfe und der Erklärung.

  • Ich bekomme mit deiner Schreibweise leider einen PHP Fehler: PHP Parse error: syntax error, unexpected T_IF

    EDIT: Ich muss es so machen, dann läuft es wieder

    Edit2: Ok auch das geht nicht mehr. Ich bleibe bei meiner Version, sonst mache ich mehr kapput als alles andere.

    2 Mal editiert, zuletzt von martin2015 (26. August 2015 um 18:55)

Jetzt mitmachen!

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