2017-03-07 14 views
1

私は多くのトピックを検索しましたが、適切な答えは見つかりませんでした。私の目標は、オプションで任意の引数を指定してPHP関数を実行するPHPページでAJAXポストリクエストを実行するJavascript関数を呼び出すHYMLハイパーリンクを持つことです。多くのトピックでは、特定の機能(特定の名前)についてこの問題を解決しました。私はAJAXの投稿要求を、同じ関数を使ってすべての種類のPHP関数を呼び出すように一般化したいと考えています。jQueryを使わないで一般的なajax javascriptを使用してphp関数を呼び出します。

これは私が持っているものであるが、それは、PHPスクリプトでうまくいかない...

HTML:

<a onclick="call_php('php_function_name', ['arg_1', 'arg_2']);">call</a> 
<p id="demo"></p> 

Javascriptを:JavascriptのI」で

function call_php(fname, args) { 
    var xhttp = new XMLHttpRequest(); 
    xhttp.onreadystatechange = function() { 
     if (this.readyState == 4 && this.status == 200) { 
      document.getElementById('demo').innerHTML = this.responseText; 
     } 
    }; 
    xhttp.open('POST', 'includes/functions.php', true); 
    xhttp.setRequestHeader('Content-type', 'application/json'); 
    xhttp.send(JSON.stringify({ 
     'fname': fname, 
     'args': args 
    })); 
} 

この場合正しく使用されている場合は、JSON.stringify()setRequestHeader()と尋ねる。それのファイル内の関数を呼び出す必要があり

PHP、:それはすでにJavascriptをで定義されていますので、PHPで

if ($_SERVER['REQUEST_METHOD'] === 'POST') { 
    //header('Content-Type: application/json'); 
    $post = json_decode($_POST/*, true*/); 
    // DO SOMETHING TO CALL: fname(...args); 
} 
function php_function_name(arg_1, arg_2) { 
    // A FUNCTION... 
} 

私はheader('Content-Type: application/json')に質問しています。しかし、主な質問は、PHP関数を呼び出すためのPHPコードを書く方法です。ところで、echo $postを印刷すると、json_decode()は、パラメータ1が文字列、配列として指定されていることを期待しています...

+1

あなたは[call_user_funcやcall_user_func_array]のようなPHPの機能を探しています(http://php.net/manual/en /function.call-user-func.php)、例えば'call_user_func_array( 'php_function_name'、array(&$ a))'? – gus27

+0

[JavaScriptの名前でPHP関数を呼び出す]の複製があります(http://stackoverflow.com/questions/23039439/call-php-function-by-name-from-javascript) – gus27

+0

@ gus27は、 JSが実際に呼び出す関数が実際に存在するかどうかを調べるには、[method_exists()](http://php.net/manual/en/function.method-exists.php)を使用してください。 – Nukeface

答えて

5

$_POSTスーパーグローバル変数は型のみapplication/x-www-form-urlencodedまたはmultipart/form-dataのポストデータのためのポストの引数が含まれていることをPHPマニュアルstatesをデコードします。

リクエストにHTTPのContent-Typeのようなアプリケーション/ x-www-form-urlencodedで又は マルチパート/フォームデータを使用する場合 HTTP POSTメソッドを介して現在のスクリプトに渡された変数の連想配列。

ただし、application/jsonの本文の投稿依頼を送信しようとしています。

$postdata = file_get_contents("php://input"); 

これはあなたの全体のリクエストボディの文字列を与える:あなたがthisを行うことができますPHPでの生の体を読み取るために

json_decodeこの文字列を使用して、目的のJSONオブジェクトを取得できます。

リクエストで提供された関数を呼び出す部分については、call_user_func_arrayがうまく機能します。それが何かであるかどうかは、でなければなりません。 doは全く別の問題です。私が理解していることから、あなたはrouter and a controllerのコンセプトを踏襲しています。

私は私はあなたがやりたいと思うものの簡単なスニペットを書かれている:

<?php 

switch ($_SERVER['REQUEST_METHOD']) { 
    case 'POST': 
    post_handler(); 
    return; 
    case 'GET': 
    get_handler(); 
    return; 
    default: 
    echo 'Not implemented'; 
    return; 
} 

function post_handler() { 
    $raw_data = file_get_contents("php://input"); 
    $req_body = json_decode($raw_data, TRUE); 
    call_user_func_array($req_body['function'], $req_body['args']); 
} 

function get_handler() { 
    echo 'This page left intentionally blank.'; 
} 

function some_function($arg1, $arg2) { 
    echo $arg1.' '.$arg2; 
} 

?> 
+0

ありがとう、それは完璧に動作します!ただし、IMSoPがコメントしたことを覚えておいてください:PHP関数の呼び出しを許可することは、非常に危険なセキュリティ上の問題です。ブラックリストには許可された機能のホワイトリストがありません」しかし、セキュリティが重要ではない私の小規模なプロジェクトでは、これがそうです。 –

1

コメントjson_decodeとprint_r($ _POST)を呼び出して$ _POSTを出力します。 データ構造を参照する必要があります。データキーと値を持つ単純な配列であれば、それをデコードする必要はありませんが、配列に単一の列があり、その値がデータであれば、それをキーにしてコンテンツ

+0

私は興味深い応答、空の配列を取得します: 'Array()'。それは間違っていますか? –

+1

何らかの理由でAJAXリクエストがデータを送信していない場合、通常のデータとして送信してみてください。このように "key = value&key2 = value2"のように構文解析され、何が起こるかを確認してください。 –

+0

'Array([key] => value [key2] => value2) 「はい、うまくいきます!なぜjson形式ではないのですか? ; p –

関連する問題