Dynamische Userzahlen

  • Nein das stimmt so nicht.


    Denn wenn ich, wie bereits gesagt, von einer Pagination Seite alle User lösche und auf page1 komme wird in der URL immernoch als Parameter page=2 angezeigt.


    Die Überprüfung bezieht sich ja darauf, ob der Wert von diesem Paramter größer als die Anzahl der Paginationlinks sind. Wenn dies der Fall ist, welcher es momentan kmmer ist, wird anstatt 5, 0 draufaddiert. Somit stimmt die Ausgabe wie viel User von ... Usern.


    Lass ich die Überprüfung weg entstehen wieder falsche Keywerte.


    Grüße,

    Stef

  • Sorry, aber wenn ich aufgrund irgendeiner Bedingung sage

    Code
    1. $my_var += 0;

    ändert das nichts an dem Wert der Variablen.

    Den Part kann ich weglassen.


    Dein Script macht das gleiche, wenn Du es so kürzst:

    Der Grund dafür ist ganz einfach der, dass $key sich nie ändert, ausser für $page > $linkKey, also brauchst Du auch nur das berücksichtigen.

  • Ja so im allgemeinen stimmt das.


    Das Problem ist was ich habe, dass wenn von einer Paginationsseite alle User gelöscht werden, zwar die User der anderen Seite angezeigt werden aber in der URL als Parameter nicht page=1 steht sondern weiterhin die leere Seite page=2.


    Beispiel:

    Ich habe 2 Seiten, das heißt $linkKey ist 0 und 1. Es werden deshalb 2 Durchgänge gestartet im ersten wird dann die 0 auf 1 gesetzt und im 2ten die 1 auf die 2.

    In $page ist der Wert des Url-Parameters page. Nun lösche ich auf Seite 2 alle User. In der URL bleibe ich aber auf Seite 2 obwohl mir schon alle User von Seite 1 angezeigt werden.


    Das heißt die Variable $page hat den Wert 2 und $linkKey besitzt nurnoch 1nen Link, also nurnoch den Key 0. Und da nur 1 Schlüssel vorhanden ist wird die foreach-schleife nur einmal durchgegangen. Und somit hat $linkKey nach diesem Durchlauf den Wert 1. Da page immernoch den Wert 2 hat und die Bedingung erfüllt wird werden auf die Variable $key 5 draufaddiert.


    Aus diesem Grund überprüfe ich zusätzlich ob die $page größer als die Anzahl der Paginationslinks ist, ob die $page gleich 1 ist und $page größer als $linkKey ist.

    Die erste Überprüfung führe ich durch damit, wenn $page größer als die Anzahl der Paginationslinks ist, zum $key nichts dazuaddiert wird. Die zweite führe ich durch damit wenn es nurnoch die Seite 1 gibt nichts auf $key dazuaddiert wird und die dritte Überprüfung führe ich durch damit wenn der Wert von $page größer ist als der Wert der Arrayschlüssel des Array $links nach dem addieren auf $key 5 addiert werden.


    Grüße

    Stef

  • Ok, vielleicht habe ich das auch falsch verstanden.


    Dann sollte aber das auch gehen:

    Also Deins wäre dann natürlich genau so korrekt vom Ablauf her. ich persönlich mag nur keine Scripte mit übermässig vielen IF/ELSE-Konstrukten und versuche daher immer den Code etwas leserlicher zu halten.

    ;)

  • Nö, ist gar nicht viel fortgeschrittener, wie Deine Version.

    Ich habe lediglich die beiden Bedingungen

    Code
    1. $page == 1
    2. $page > $PaginationLinks

    mit einer ODER-Verknüpfung zusammengefasst:

    Code
    1. // OR hat die Kurzform ||
    2. $pageCheck = ( $page == 1 || $page > $paginationLinks );

    Man hätte evtl. auch XOR ( explizites ODER, bzw. Entweder-Oder ) verwenden können:

    Code
    1. $pageCheck = ( $page == 1 xor $page > $paginationLinks );

    $pageCheck ist also true, wenn einer der beiden Bedingungen true ist.

    Das nutze ich einfach für eine ternäre Operation, was nichts weiter ist, wie eine zusammengefasste, gekürzte IF-Anweisung:

    Ist alles keine Zauberei, finde es halt nur angenehmer, übersichtlichen Code zu haben. Technisch betrachtet ist es fast identisch mit Deinem.


    Gruß Arne

  • Okay. Du hast recht.


    Ich meinte damit, dass wenn ein Anfänger darauf schaut, dieser es erstmal nicht verstehen würde.


    Ich habe diese Frage schon mehrmals gestellt aber ich verstehe in diesem Zusammenhang nicht die Verwendung der Klammern () umrum der Zuweisungen.

    Wieso benutzt du diese in diesem Fall?


    Gruß,

    Stef

  • Du meinst das hier?

    Code
    1. $pageCheck = ( $page == 1 || $page > $paginationLinks );

    Kann man auch weglassen. Hauptsächlich nutze ich das aber, weil ich es einfach übersichtlicher finde und sofort sehe, wo die Bedingung anfängt und wo sie aufhört. Ist in diesem Fall zwar nur eine Zeile, aber um mal einen anderen Fall zu konstruieren, wo es ohne Klammern zu Problemen führen kann:

    Code
    1. $pageCheck = ( $page == 1 || $page > $paginationLinks ) ? 1 : 0;

    Macht jetzt auf Dein Thema bezogen natürlich keinen Sinn, ist aber als Erklärung ganz gut geeignet.

    Wenn ich die Klammern jetzt weglassen würde:

    Code
    1. $pageCheck = $page == 1 || $page > $paginationLinks ? 1 : 0;

    Dann wird u.U. zunächst folgendes ausgewertet:

    Code
    1. $page > $paginationLinks ? 1 : 0;

    Und das Resultat dann ODER verknüpft mit $page == 1.

    Für diesen Fall mag das noch funktionieren, aber es gibt viele Situationen, in denen man sich wundert woher die unerwarteten Ergebnisse/Werte kommen.


    Daher habe ich mir die Klammerungen einfach angewöhnt.

    Und übersichtlicher finde ich es zudem auch, wie gesagt.

  • Guten Morgen,


    ja genau dies meinte ich.


    Okay.


    Warum wird denn $page > $paginationLinks ? 1 : 0; zuerst überprüft und danach erst $page == 1?


    Bei Rechnungen sollte man ja generell auf Punkt und Strich achten. Das heißt bei Rechnungen wo man multipliziert und addiert, aber man möchte, dass das Addieren zuerst durchgeführt wird setzt man diese Klammern oder aufgrund, wie du bereits geschriebn hast, Übersichtlichkeit.


    Grüße,

    Stef

  • Das macht nicht nur PHP so.

    Wenn Du zwei Bedingungen hast, ganz egal ob ODER, AND, XOR oder wie auch immer verknüpft hast, wird immer jede Einzelbedingung für sich ausgewertet.


    In dem Beispielfall hast Du halt links die Bedingung

    Code
    1. $page == 1

    und rechts

    Code
    1. $page > $paginationLinks ? 1 : 0

    Ob PHP jetzt zunächst die rechte oder die linke Bedingung auswertet, kann ich nicht genau sagen, weil ich das grad nicht getestet habe.

    Auf jeden Fall werden die aber einzeln ausgewertet und dann mit dem logischen Operator verknüpft.


    Um jetzt klar zu definieren, dass die zweite Bedingung explizit nur

    Code
    1. $page > $paginationLinks

    sein soll, gibt man die Klammern an

    Code
    1. ( $page == 1 || $page > $paginationLinks )

    Jetzt weiß der Interpreter, dass er diese beiden Bedingungen für sich und anschließend per ODER auswerten soll.


    Ich will jetzt nichts falsches sagen, aber ohne jetzt großartig nachgeschlagen zu haben, glaube ich sogar, dass die Einzelbedingungen von rechts nach links ausgewertet werden. Kann aber andersrum sein.


    Jedenfalls "erkennt" der Interpreter den logischen Operator und entscheidet im Einzelfall bereits ohne weitere Einzelbedingungen auswerten zu müssen.


    Triviales Beispiel:

    Code
    1. if ( true && false ) {
    2. //...
    3. }

    Wenn von rechts nach links ausgewertet werden würde, wäre die linke Bedingung irrelevant, weil die rechte bereits false ist.

    Und bei && ( AND ) müssen alle Bedingungen true sein, um den Gesamtausdruck true werden zu lassen.

    Der Interpreter springt dann schon vorzeitig aus der Gesamtbedingung, weil sie nicht mehr true werden kann.


    Ich hoffe, das ist jetzt nicht zu verwirrend geschrieben.