Falsche Rückgabe aus Funktion

dark_ghost

Erfahrenes Mitglied
Hallo zusammen,

ich habe mir eine Funktion geschrieben, die für jeden Monat einen speziellen Datensatz aus der DB selektiert.

Es kann aber auch vorkommen, dass für den aktuellen Monat noch kein Datensatz vorhanden ist. In diesem Fall soll sich die Funktion nocheinmal selbst aufrufen und den Datensatz vom vorherigen Monat selektieren - Rekursiv quasi.

Problem ist folgendes.
Die Funktion ruft sich zwar selbst auf und gibt auch den richtigen Parameter mit nur funktioniert die rückgabe per return nicht (ich kann mir die selektierten daten innerhalb der funktion allerdings mit print_r ausgeben lassen).

Hier der Code
PHP:
function GetPotm($month)
{
    //Aktuelles POTM ermitteln
    $data = mysql_query("SELECT `pic_id`, `album_id`, `pic_filename`, `pic_views`
                         FROM `media_pics`
                         WHERE `album_id`=(SELECT `album_id` FROM `media_albums` WHERE `album_type`='potm' AND `album_date`='".date("Y")."')
                         AND `pic_date`='".mktime(0, 0, 0, $month, 1, date("Y"))."' ");
    
    if(mysql_num_rows($data) == 0){
        GetPotm(date("m")-1);
    }
    else{
        return mysql_fetch_assoc($data);
        #print_r(mysql_fetch_assoc($data));
    }

} //end GetPotm

Aufgerufen wird die Funktion so -> GetPotm(date("m"));
Soll also den Datensatz für den aktuellen Monat selektieren, in meinem Falle (zum testen eben) ist für den aktuellen Monat kein Datensatz vorhanden. Die Funktion sollte sich also selbst aufrufen, was sie auch tut - denn die Daten kann ich per print_r ausgeben lassen. Nur die Übergabe der Daten funktioniert leider nicht und ich komm nicht dahinter.

Noch zu erwähnen ist, dass wenn ich die Funktion gleich mit GetPotm(date("m")-1); aufrufe, also dass gleich der Datensatz vom letzten Monat selektiert werden soll, funktioniert die übergabe.


Über Tipps und Anregungen freue ich mich.
Gruß
 
Zuletzt bearbeitet:
Hallo,

du musst vor dem rekursiven Aufruf deiner Funktion noch ein return setzen, sonst weiß die Funktion ja nicht, welchen Wert sie zurückgeben soll.

Grüße,
Matthias
 
Hi,

danke für deine Antwort. Allerdings kann ich diese nicht ganz nachvollziehen.

Ich rufe ja die Funktion auf und geben einen anderen Parameter mit und anahnd von diesem Parameter kann die Funktion den neuen Datansatz selektieren.

Trozdem habe ich deinen Vorschlag ausprobiert nur bringt das leider auch nichts wenn ich einen return vor dem rekursiven Aufruf setze. (oder ich hab dich falsch verstanden)

Gruß
 
Hallo,

mit dem Aufruf GetPotm(date("m")-1); alleine wird nur die Funktion GetPotm aufgerufen und der Rückgabewert verworfen. Erst wenn du ein return davorsetzt, wird der Rückgabewert des rekursiven Aufrufs als Rückgabewert für den aktuellen Aufruf verwendet. Warum es bei dir trotzdem nicht funktioniert, kann ich leider nicht sagen.

Grüße,
Matthias
 
Hallo Matthias,

vielen Dank nochmals für deine Hilfe.
Jetzt klappt es!

Das Problem war, dass ich dich wirklich missverstanden hatte.
Ich habe anstelle von return GetPotm() return $irgendeinwert; GetPotm(); geschrieben.

Nun funktioniert der rekursive aufruf und ich hab's verstanden.
Danke!

Gruß
 
Zurück