Ein Limit einbauen

  • Guten Abend,


    ich komme an einer kleinen Stelle mal wieder nicht wirklich weiter. Hab eine Funktion diese sieht wie folgt aus und sorgt dafür, dass ich Kundenmeinungen aus der Datenbank auslese:


    PHP
    function referenzen($mysqli, $sort = "DESC", $limit = "6") {
    	    $stmt = $mysqli->prepare("SELECT ref_id, ref_bild, ref_alt, ref_status FROM web_referenzen 
    									WHERE ref_status = '1' ORDER by ref_bild ". $sort ." LIMIT ". $limit ."");
    		$stmt->execute();
            $stmt->bind_result($ref_id, $ref_bild, $ref_alt, $ref_status);
    
    		while($stmt->fetch()) {
    			echo "<img src="/klein/".htmlspecialchars($ref_bild)."" alt="". htmlspecialchars($ref_alt)."">\n";
              }
    }


    Dann habe ich eine Datei die nennt sich inc.sidebar.kundenmeinungen.php. In dieser steht folgendes:


    PHP
    <?php
    	kundenmeinungen($mysqli);          
    ?>


    Diese Datei wird wieder in bestimmten Ausgabedateien wie z.B. impressum.php eingebunden, dieses geschieht so:


    PHP
    <?php 
    			include_once 'inc.sidebar.kundenmeinungen.php';
    		?>


    Nun habe ich ein kleines Problem. Auf bestimmten Seiten möchte ich z.B. nur zwei oder 5 Kundenmeinungen auslesen. Ich kann dort nicht für jede Abfrage eine eigene Datei anlegen oder? Ich hoffe ihr versteht was ich meine.

  • Du koenntest z.B. vor dem include eine Limit-Variable setzen, die falls gesetzt in der inc.sidebar.kundenmeinungen.php als Funktionsparameter uebergeben und sie nach dem Include sicherheitshalber wieder null setzen.

  • tip am Rande: falls $sort und/oder $limit von außen (vom Benutzer) kommen kann:

  • Du koenntest z.B. vor dem include eine Limit-Variable setzen, die falls gesetzt in der inc.sidebar.kundenmeinungen.php als Funktionsparameter uebergeben und sie nach dem Include sicherheitshalber wieder null setzen.


    Vielen Dank für deine Antwort, wenn ich dich richtig mit dem Limit verstanden habe, dann müsste ich dieses so umsetzten?


    PHP
    $Limit = "4";
    			include_once 'inc.sidebar.kundenmeinungen.php';
    			$Limit = "0";


    Die Frage ist nun, wie bekommt die "inc.sidebar.kundenmeinungen.php" Datei das Limit mit? Und wie wird in dieser Datei dann weiter gearbeitet?

  • Das sollte automatisch passieren - PHP kennt zwischen include und Dateiinhalt-per-copy-und-paste-einfuegen eigentlich keinen Unterschied.


    OK, ich habe es z.B. in meiner index.php so umgesetzt


    PHP
    $Limit = "3";
    			include_once 'inc.sidebar.kundenmeinungen.php';


    Meine include Datei so erweitert


    PHP
    kundenmeinungen($mysqli, $Limit);


    Und meine Funktion so angepasst:


    PHP
    function kundenmeinungen($mysqli, $Limit = "4") {
    		$stmt = $mysqli->prepare("SELECT KdM_id, KdM_name, KdM_nachricht, KdM_status 
    									FROM web_kundenmeinungen  LIMIT ". $Limit ."");


    Klappt auch soweit ganz gut nur ein kleines Problem habe ich. Wenn ich nun eine Seite aufrufe wie z.B. impressum.php wo ich das $Limit nicht gesetzt habe, bekomme ich diese Meldung


    Zitat


    Notice: Undefined variable: Limit in inc.sidebar.kundenmeinungen.php on line 2 Fatal error: Call to a member function execute() on a non-object in /functions/uebersicht.php on line 17


    gibt es eine Option wo ich sagen kann, wenn KEIN Limit angegeben, dass er dann ein default Wert nehmen soll? Ich dachte eigentlich das hätte ich in der funktion schon gesagt. Aber scheinbar nicht. Wenn es nicht anderes geht, dann muss ich das eben in alle Dateien von Hand einfügen.

  • Ich kenne jetzt den Rest vom Code nicht, aber für mich sieht das eher so aus, als läge der Fehler beim Funktionsaufruf in der include Datei.
    Probier das mal aus, indem du in der include Datei das hier machst:

    PHP
    unset($Limit); // Die Variable löschen
    kundenmeinungen($mysqli, $Limit);

    Wenn es jetzt wieder den Fehler gibt, ist dieser Ausfruf schuld, es MUSS eine $Limit geben.


    Zum Lösen gäbe es zB diese variante als include Datei:

    PHP
    if (is_numeric($Limit)) { // Achtung! "13.37" gibt TRUE zurück!
        round($Limit);
        kundenmeinungen($mysqli, $Limit);
    } else {
        kundenmeinungen($mysqli, 4); // Fixes Limit wählen
    }
  • Ich hab es mal so getestet


    PHP
    if (isset($Limit)) {
      kundenmeinungen($mysqli, $Limit);
    } else {
     	kundenmeinungen($mysqli);   
    }


    bekomme auch das Ergebnis das ich wollte, bin ich hier auf dem richtigen Weg bzw. kann ich es so lassen?

  • Probier das mal aus, indem du in der include Datei das hier machst:

    PHP
    unset($Limit); // Die Variable löschen
    kundenmeinungen($mysqli, $Limit);


    Wenn es jetzt wieder den Fehler gibt, ist dieser Ausfruf schuld, es MUSS eine $Limit geben.


    Hier kommt die gleiche Fehlermeldung raus, wie ich die oben bereits geschrieben habe.

  • Naja, wenn ich jetzt $Limit als "Hallo" mitschicken würde (also $Limit ="Hallo"; ) würde isset genauso ein TRUE zurückliefern. Nur kannst du mit dem Wert dann nix anfangen.


    wenn du dir also sicher bist, ABSOLUT sicher, dass die Variable nicht von einem Nutzer manipuliert werden kann, dann reicht deins. Sonst musst du eine Typenprüfung und Filterung vornehmen, da wäre zB meine Variante geeignet (gibt bestimmt auch andere).


    PS: Bei dem Test muss natürlich irgendwo vorher ein $Limit gesetzt worden sein, sollte also so in die Richtung aussehen

    PHP
    $Limit = 5;
    unset($Limit);
    kundenmeinungen($mysqli, $Limit);

    wobei natürlich ein Teil via include eingefügt werden kann.

  • Naja, wenn ich jetzt $Limit als "Hallo" mitschicken würde (also $Limit ="Hallo"; ) würde isset genauso ein TRUE zurückliefern. Nur kannst du mit dem Wert dann nix anfangen.


    wenn du dir also sicher bist, ABSOLUT sicher, dass die Variable nicht von einem Nutzer manipuliert werden kann, dann reicht deins. Sonst musst du eine Typenprüfung und Filterung vornehmen, da wäre zB meine Variante geeignet (gibt bestimmt auch andere).


    Ok, danke für deine Hilfe, dann nehme ich deines :)


    PHP
    if (is_numeric($Limit)) {
        round($Limit);
        kundenmeinungen($mysqli, $Limit);
    } else {
     	kundenmeinungen($mysqli);   
    }


    kann eigentlich sicher sein, dass das Limnit von einem User nicht manipuliert werden kann, wird ja kein GET oder POST übergeben, aber sicher ist sicher.


    EDIT:


    Ich muss natürlich weiterhin prüfen ob mein $Limit gesetzt ist, dachte ich ich kann dieses so machen


    PHP
    if (isset(is_numeric($Limit))) {
    	 round($Limit);
      kundenmeinungen($mysqli, $Limit);
    } else {
     	kundenmeinungen($mysqli);   
    }


    bekomme jetzt aber diese Meldung


    Fatal error: Can't use function return value in write context in

  • kann eigentlich sicher sein, dass das Limnit von einem User nicht manipuliert werden kann, wird ja kein GET oder POST übergeben, aber sicher ist sicher.


    Korrekt, denn später änderst Du mal was am Code und hast "vergessen", dass Du NICHT geprüft hast =)
    (deswegen ja auch mein Kommentar: Ein Limit einbauen)


    Zwecks include_once (oder include, require, require_once):
    Stell Dir vor, dass der Code aus der eingebundenen Datei an diese Stelle geschrieben wird. (denn im Grunde passiert das)

  • Im Grunde kann man das isset() sogar weglassen, da is_numeric() bei nicht gesetzter Variable oder leerem String korrekterweise ebenfalls ein false ausgibt. Soll heißen, isset() ist bei is_Numeric() praktisch schon inklusive ;)

Jetzt mitmachen!

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