2009-04-21 13 views
0

nicht sicher, wie dies zu beschreiben, aber hier geht ..Anruf dynamische Funktion mit unbekannter Anzahl von params

Ich habe eine große PHP-Funktionsbibliothek, die ich über irgendeine Art von api-Schnittstelle verfügbar machen möge.

Zum Beispiel diese Abfrage-String:

api.php?function=myFunction&param1=xxx&param2=xxx& 

in diese übersetzen würde:

$ret = myFunction($param1, $param2); 

.. während diese Abfrage-String ..

api.php?function=myFunction&param2=xxx&param1=xxx& 

Würde in diese übersetzen:

$ret = myFunction($param1, $param2); 

Beachten Sie, dass ich mich auf die Abfragezeichenfolge verlassen muss, um die in der Abfrage erforderlichen Parameter in der erforderlichen Reihenfolge zu platzieren.

Ist das machbar? Ich habe ein paar Ideen, dass kann funktionieren, aber ich dachte, ich würde es hier aufstellen und vielleicht ein paar bessere Ideen von den PHP-Gurus bekommen.

Dank -

+0

Ihre Query-Strings produzieren genau die gleichen Aufrufe, die Reihenfolge ist nicht erhalten – SilentGhost

+0

Ich hatte Angst, dass ~ eine Möglichkeit, den gesamten Abfrage-String zu ziehen und durch sie manuell zu analysieren? Autsch! – OneNerd

+0

Aus Gründen der Gesundheit ... bitte tun Sie das nicht. Es wäre so einfach für jemanden, die totale Kontrolle über Ihren Server zu übernehmen, wenn Sie dies tun würden. Dies wäre ein großes Sicherheitsproblem.Es gibt so viele bessere (richtige) Wege. – KyleFarris

Antwort

0

sammeln Ihre Parameter in ein Array und übergeben Sie es stattdessen auf Ihre Funktion zu.

2

Verwenden Sie die call_user_func_array function, um eine Funktion mit einem Array ihrer Parameter aufzurufen.

Und wenn Sie wirklich die Parameter aus der Abfrage extrahieren möchten, können Sie so etwas wie dies nutzen könnten:

$params = array(); 
foreach ($_GET as $name => $val) { 
    if (preg_match('/^param[1-9]\d*$/', $name)) { 
     $param[$name] = $val; 
    } 
} 
ksort($params); 
0

Gerade $ _GET an Ihre Funktion übergeben. Innerhalb Ihrer Funktion können Sie nach dem gewünschten Parameter suchen. Oder erstellen Sie eine zweite Funktion

function getFunctionCall($getParams) 
{ 
    $function = $getParams['function']; 
    returnArray['functionName'] = $function; 

    $getArraySize = count($getParams); 
    for(i = 1; $i < $getArraySize; $i++) 
    { 
     $param = $getParams['param'. $i]; 
     // do any cleaning you need on $param i ; 
     $param = urldecode($param); 
     returnArray['params']['param'.$i] = $param; 
    } 
    return $returnArray; 

} 

Jetzt Sie eine Rückkehr Array und Sie können so etwas tun:

$mystuff = getFunctionCall($_GET); 

$functionString = $mystuff['functionName'] . '("' . implode($mystuff[params], '","') . '")"; 

$myResult = eval($functionString); 

jedoch sehr vorsichtig sein, diese Dinge zu tun ... functionName- könnte jeder alte Sache sein unter der Sonne einschließlich fopen, fwrites, etc ... Es könnte eine gute Idee sein, eine "approved functions" -Liste zu erstellen und den Funktionsnamen davor zu prüfen, bevor man ihn anruft. Auch die Art und Weise, wie ich die Parms als Saiten in den Eval einlege, ist ziemlich gefährlich. Sie könnten String in den übergebenen Parametern entkommen lassen. Wahrscheinlich ist es besser, eine for-Schleife zu machen und die Variablennamen anstelle der Variableninhalte als Strings auszuwerten.

Schließlich, wenn Sie tatsächlich die Anzahl der Argumente an Ihre Funktion kennen, ouwld es viel sicherer sein, nur

$results = $mystuff['functionName']($mystuff[params][param1]); 

und so weiter zu verwenden.

Verwandte Themen