[PHP] Funktion erfüllt in der Funktion nicht was es soll. In der Datei direkt jedoch schon

  • Hey,
    ich sitze gerade an einer Website. Ich habe eine Funktion "getMaps($sort = 'ASC', $limit = 0);" allerdings erfüllt sie nicht genau was sie soll.
    Die Funktion lautet wie folgt:

    PHP
    function getMaps($sort = 'ASC', $limit = 0) {
            global $mysql_link;
            $query = "SELECT * FROM `maps` ORDER BY `id` " . $sort;
            if($limit > 0 && is_integer($limit)) {
                $query = "SELECT * FROM `maps` ORDER BY `id` " . $sort . " LIMIT " . $limit;
            } 
    
            $result = mysqli_query($mysql_link, $query);
            return $result;
        }


    Und die Abfrage im Code so:

    PHP
    while($row = mysqli_fetch_array(getMaps('ASC', 10), MYSQLI_ASSOC)) {
            echo '<br /><br />id: ' . $row['id'];
            echo '<br />name: ' . $row['name'];
            echo '<br />short_desc: ' . $row['short_desc'];
            echo '<br />long_desc: ' . $row['long_desc'];
            echo '<br />image_name: ' . $row['image_name'];
            echo '<br />file_name: ' . $row['file_name'];
        }


    Ich möchte nämlich 10 Maps aus der Datenbank in der Absteigenden Sortierung aufgelistet haben...
    Leider endet das, wenn ich mir das mysqli_result aus der Funktion ausgeben lasse in einer Endlosschleife: http://puu.sh/7VtXO.png


    Wenn ich allerdings alles aus der Funktion raus kopiere und so ausführe wie folgt, funktioniert alles einwandfrei: http://puu.sh/7Vu2z.png


    Bin verzweifelt :s

  • Du musst dir das mal vorstellen:
    Die While Schleife prüft vor jedem Durchgang die Kondition in den Klammern, in diesem Fall der Rückgabewert von mysqli_fetch_array, welcher solange nicht null ist, bis es in dem result keine Datensätze mehr gibt
    Das funktioniert ja auch in deinem Code ohne die Funktion

    PHP
    while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {

    bei der du der Funktion dein result übergibst.
    Bei deinem Code bei dem du deine Funktion nutzt wird die Kondition natürlich auch genauso überprüft. Hier übergibst du mysqli_fetch_array jedoch nicht direkt das result, sondern das result in Form vom Rückgabewert deiner Funktion. Diese wird also nach jedem Schleifendurchgang neu aufgerufen und nach jedem Schleifendurchgang bekomst du ein neues result, was erklärt, warum du immer nur den ersten Datensatz bekommst.
    Und da mysqli_fetch_array dadurch also nie null zurückgibt, geht das immer so weiter

    PHP
    while($row = mysqli_fetch_array(getMaps('ASC', 10), MYSQLI_ASSOC)) {


    Du musst deine Funktion also vorher einmal aufrufen, und das dann mysqli_fetch_array übergeben

    PHP
    $result = getMaps("ASC", 10);
    while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {