2009-04-21 15 views
0

ない、これを記述するために正確にどのようにしてください未知の数とコールの動的機能が、ここに行く..のparams

は、私は、APIインターフェースのいくつかの並べ替えを経由して公開する大規模なPHPの関数ライブラリを持っています。例えば

、このクエリ文字列:

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

はこのに変換します:

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

..このクエリ文字列に対し..

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

はこのに変換します:

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

クエリに必要なパラメータを必要な順序で配置するには、クエリ文字列に依存する必要があることに注意してください。

これは実行可能ですか?私はかもしれないといういくつかのアイデアを持っていますが、私はそれをここに載せて、PHPの専門家からいくつかのより良いアイデアを得るだろうと考えました。

おかげ -

+0

あなたのクエリ文字列はまったく同じ呼び出しを生成しますが、順序は保持されません – SilentGhost

+0

私は完全なクエリ文字列を取得して手動で解析する方法を恐れていましたか?ああ! – OneNerd

+0

正気のために...しないでください。あなたがこれをやったなら、誰かがあなたのサーバーを完全にコントロールすることはとても簡単です。これは主要なセキュリティ問題です。非常に多くのより良い(正しい)方法があります。 – KyleFarris

答えて

0

は、アレイにあなたのパラメータを収集し、代わりにあなたの関数にそれを渡します。

2

call_user_func_array functionを使用して、パラメータの配列を持つ関数を呼び出します。

そして、あなたは本当にクエリからパラメータを抽出したい場合は、このようなもの使用することができますちょうどあなたの関数に$ _GETを渡す

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

を。関数内で、必要なparamを探すことができます。それとも今、あなたは、戻り配列を持っていて、このような何か行うことができます

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; 

} 

第2の機能を作成します。しかし、このようなものをやって非常に注意してください... functionNameを、任意の古いものになる可能性が

$mystuff = getFunctionCall($_GET); 

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

$myResult = eval($functionString); 

をfopen、fwritesなどを含む太陽の下で... "承認された関数"リストを作成し、それを呼び出す前に関数名をチェックすることをお勧めします。また、私がparmsをevalに文字列として入れる方法はかなり危険です。渡されたパラメータで文字列をエスケープすることができます。おそらくforループを実行し、可変内容の代わりに変数名を文字列として評価する方がよいでしょう。あなたが実際にあなたの関数への引数の数を知っていれば

最後に、ちょうどように

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

とを使用することがはるかに安全であることouwld。