jquery $ .ajaxを使用してPHP関数を呼び出す


118

これは簡単な答えかもしれませんが、私はjQueryの$ .ajaxを使用してPHPスクリプトを呼び出しています。私がしたいことは、基本的にはそのPHPスクリプトを関数内に置き、JavaScriptからPHP関数を呼び出すことです。

<?php 
if(isset($_POST['something'] {
    //do something
}
?>

これに

<?php
function test() {
    if(isset($_POST['something'] {
         //do something. 
    }
}
?>

JavaScriptでその関数を呼び出すにはどうすればよいですか?現在、私は$ .ajaxを使用して、リストされているPHPファイルを使用しています。


6
PHPのjavascriptで生成されたPHPコードをeval化して渡す、またはその逆を行うのは非常に悪い考えです。
タイラーカーター

それが悪い理由を説明できますか?
ナマズ

3
誰でもコードの代わりに任意のコードを配置できるため、サーバーに悪影響を及ぼす可能性があります。
タイラーカーター

9
@ Chacha102:あなたも私も質問を理解できません。私の理解では、彼はリモートプロシージャコールを実行したいと考えています。
Felix Kling

許可された機能または「プロシージャ」以外のすべてへのアクセスを制限するホワイトリストが設定されている場合、リモートプロシージャコールは受け入れられる可能性があります。これを実装するのは難しくありません。
Xaxis 2013年

回答:


228

$.ajaxサーバーコンテキスト(またはURLなど)を呼び出して特定の「アクション」を呼び出すために使用します。あなたが欲しいものは次のようなものです:

$.ajax({ url: '/my/site',
         data: {action: 'test'},
         type: 'post',
         success: function(output) {
                      alert(output);
                  }
});

サーバー側では、actionPOSTパラメータを読み取り、対応する値が呼び出すメソッドを指している必要があります。例:

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch($action) {
        case 'test' : test();break;
        case 'blah' : blah();break;
        // ...etc...
    }
}

これはコマンドパターンの単純な化身だと思います。


9
ゴッチャ。したがって、PHPで呼び出す関数をjsで直接選択することはできません。PHPを使用して、post値を取得し、その方法で関数を呼び出すことができます。ありがとう
ナマズ、

しかし、フレームワークを使用している場合、これは簡単です。たとえば、コハナでは、コントローラー/アクションを呼び出すだけですajax(function(){url: 'Controller / action.php'、});
DeathCoder 2014

1
@MrMeseesこれらの最新のベストプラクティスを私たちと共有していただければ幸いです。
フランシスコロメロ

HTTPフェッチAPIの使用は、JSフロントエンド用であると同時に、promiseを使用することもできます。PHPの入力のサニタイズとフィルタリングのために、おそらくミドルウェアを使用して複数のエンドポイントに適用できるようにします。重要なのは、もし私のフィードバックが2年も待たないようにしたいなら、素晴らしい選択肢かもしれません。
MrMesees

12

プラグインのメソッドとして任意のコアPHP関数またはユーザー定義のPHP関数を呼び出すことができるjQueryプラグインを開発しました:jquery.php

ドキュメントの先頭にjqueryとjquery.phpを含め、サーバーにrequest_handler.phpを配置した後、以下で説明する方法でプラグインの使用を開始します。

使いやすいように、簡単な方法で関数を参照します。

    var P = $.fn.php;

次に、プラグインを初期化します。

P('init', 
{
    // The path to our function request handler is absolutely required
    'path': 'http://www.YourDomain.com/jqueryphp/request_handler.php',

    // Synchronous requests are required for method chaining functionality
    'async': false,

    // List any user defined functions in the manner prescribed here
            // There must be user defined functions with these same names in your PHP
    'userFunctions': {

        languageFunctions: 'someFunc1 someFunc2'
    }
});             

そして今、いくつかの使用シナリオ:

// Suspend callback mode so we don't work with the DOM
P.callback(false);

// Both .end() and .data return data to variables
var strLenA = P.strlen('some string').end();
var strLenB = P.strlen('another string').end();
var totalStrLen = strLenA + strLenB;
console.log( totalStrLen ); // 25

// .data Returns data in an array
var data1 = P.crypt("Some Crypt String").data();
console.log( data1 ); // ["$1$Tk1b01rk$shTKSqDslatUSRV3WdlnI/"]

PHP関数チェーンのデモ:

var data1 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).data();
var data2 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).end();
console.log( data1, data2 );

PHP疑似コードのJSONブロックの送信を示す:

var data1 = 
        P.block({
    $str: "Let's use PHP's file_get_contents()!",
    $opts: 
    [
        {
            http: {
                method: "GET",
                header: "Accept-language: en\r\n" +
                        "Cookie: foo=bar\r\n"
            }
        }
    ],
    $context: 
    {
        stream_context_create: ['$opts']
    },
    $contents: 
    {
        file_get_contents: ['http://www.github.com/', false, '$context']
    },
    $html: 
    {
        htmlentities: ['$contents']
    }
}).data();
    console.log( data1 );

バックエンド構成はホワイトリストを提供するため、呼び出すことができる関数を制限できます。プラグインで記述されているPHPを操作するためのパターンは他にもいくつかあります。


5

私は通常の方法でファイルを直接呼び出しますが、本当に関数を呼び出したい場合は、JSON-RPC(JSON Remote Procedure Call)を参照してください。

基本的に、特定の形式のJSON文字列をサーバーに送信します。

{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}

これには、呼び出す関数とその関数のパラメーターが含まれます。

もちろん、サーバーはそのようなリクエストを処理する方法を知っている必要があります。
ここに、JSON-RPCのjQueryプラグインと、PHPのサーバー実装としてのZend JSONサーバーがあります。


これは、小規模なプロジェクトや機能が少ない場合にはやりすぎかもしれません。最も簡単な方法は、カリムの答えです。一方、JSON-RPCは標準です。


4

ページをロードするときに任意のPHP関数を呼び出すことができないのと同じように、JavaScriptでPHP関数を呼び出すことはできません(セキュリティへの影響を考えてください)。

何らかの理由でコードを関数にラップする必要がある場合は、関数定義の下に関数呼び出しを配置し​​てみてください。例:

function test() {
    // function code
}

test();

または、PHPインクルードを使用します。

include 'functions.php'; // functions.php has the test function
test();

3

jQueryのajax呼び出しからのPOSTリクエストを受け入れるシステムのエンドポイント(URL)を公開する必要があります。

次に、PHPからそのURLを処理するときに、関数を呼び出して適切な形式(JSONの可能性が高い、またはXMLを希望する場合)で結果を返します。


3

あなたは自動的にそれを行う私のライブラリを使用することができます、私は過去2年間それを改善してきましたhttp://phery-php-ajax.net

Phery::instance()->set(array(
   'phpfunction' => function($data){
      /* Do your thing */
      return PheryResponse::factory(); // do your dom manipulation, return JSON, etc
   }
))->process();

JavaScriptは次のように簡単です。

phery.remote('phpfunction');

チェーン可能なインターフェースのようなクエリビルダーを使用して、すべての動的JavaScript部分をサーバーに渡すことができます。また、任意のタイプのデータをPHPに戻すことができます。たとえば、JavaScript側で多くのスペースを必要とする一部の関数は、これを使用してサーバーで呼び出すことができます(この例では、mcrypt、JavaScriptで実行することはほとんど不可能です)。

function mcrypt(variable, content, key){
  phery.remote('mcrypt_encrypt', {'var': variable, 'content': content, 'key':key || false});
}

//would use it like (you may keep the key on the server, safer, unless it's encrypted for the user)
window.variable = '';
mcrypt('variable', 'This must be encoded and put inside variable', 'my key');

そしてサーバーで

Phery::instance()->set(array(
  'mcrypt_encrypt' => function($data){
     $r = new PheryResponse;

     $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
     $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $data['key'] ? : 'my key', $data['content'], MCRYPT_MODE_ECB, $iv);
     return $r->set_var($data['variable'], $encrypted);
     // or call a callback with the data, $r->call($data['callback'], $encrypted);
  }
))->process();

これでvariable暗号化されたデータができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.