PHP関数へのjQuery AJAXリクエストの作成

Creating jQuery AJAX requests to a PHP function


質問 written by jondavidjohn @2011-08-29 20:56:52Z

: 4 : 5 : 3

これまでのところAJAXリクエストを作成するとき、私は別のPHPファイルに投稿しています。 別のページに投稿するのではなく、PHP関数を呼び出すjQuery AJAXリクエストを作成することは可能ですか?

あなたが私に送ることができるならばどんな例またはドキュメンテーションも素晴らしいでしょう。

コメント 1

それは不可能である

written by Jacek Kaniuk 2011 @2011-08-10 19:37:29Z

コメント 2

いいえ、PHPスクリプトを呼び出さない限り。私の知る限りでは、同じページでPHP関数と通信することはできません

written by benhowdle89 @2011-08-10 19:38:08Z

コメント 3

AJAX(JS)は個々のPHP関数を呼び出すことはできません。そのようには動作しません。

written by NullUserException @2011-08-10 19:38:43Z

回答 1 written by jondavidjohn @2011-08-10 19:53:25Z
7

AJAXリクエストはファイルではなく URLを呼び出す(HTTPリクエストを行う)、ほとんどの場合、URLはファイル(またはあなたの場合はphpスクリプト)を指すようにサーバーによって変換されますが、HTTPリクエストから受信した応答はあなた次第です(あなたのサーバー上)。

URLを特定のphp関数にマッピングするPHPフレームワークはたくさんありますが、AJAXはURLにアクセスして応答を受け取るための非同期的な方法です。

このURLにより、サーバーは特定の機能を呼び出して応答を返すことができます。 しかし、あなたのURLとサーバーサイドのコードを構造化するのはあなた次第です。

回答 2 written by Boaz @2014-07-05 09:53:10Z
53

このテクノロジがどのように機能するのかについては、基本的な誤解があると思います。

AJAX(Javascript)、Flash、またはクライアント側のテクノロジは、PHP関数(またはサーバー上で実行されている他の言語)を直接呼び出すことはできません。 これは逆のことも言えることです(例:PHPはJS関数を呼び出すことができません)。

クライアントとサーバーのコードは異なるマシンに存在し、それらはHTTPプロトコル(あるいはあなたが持っているもの)を通して通信します。 HTTPはおおよそ次のように機能します。

クライアントサーバーモデル

クライアント(例:ブラウザ)はリクエスト - >サーバープロセスリクエストを送信し、レスポンス - >クライアントはレスポンスを取得および表示および/または処理します

あなたはこれらの要求と応答をメッセージとして見なければなりません。 メッセージはサーバー側の言語で関数を直接呼び出すことはできません1が 、メッセージを呼び出すために十分な情報を提供し、サーバーから意味のあるメッセージを返すことができます。

そのため、次のように、これらの要求を処理してディスパッチするハンドラを作成できます。

// ajax_handler.php
switch ($_POST['action']) {
    case 'post_comment':
        post_comment($_POST['content']);
        break;
    case '....':
        some_function();
        break;
    default:
        output_error('invalid request');
        break;
}

その後、クライアントに正しいパラメータを指定してこの集中型ハンドラに要求を送信させるだけです。 それからハンドラはサーバサイドでどの関数を呼び出すべきかを決定し、そして最後にそれはクライアントに応答を送り返します。


1技術的にはリモートプロシージャコール(RPC)がありますが、これらは面倒になることがあります。

コメント 1

「このテクノロジがどのように機能するのかについては、基本的な誤解があると思います。」私は心から同意します。「クライアントとサーバーのコードは異なるマシンに常駐しています」...私はこれが多くの人々を切り札する部分だと思います。HTML、Javascript、およびPHPはすべてサーバー上に並んで存在しますが、Javascript クライアント側で実行されます。Javascriptを取得することとJavascript から PHPスクリプトを呼び出すことがサーバーへの2つの別々の要求であることを人々が理解しているとは思いません。イラストは+1。:)

written by ハーバート @2011-09-11 17:49:17Z

回答 3 written by JJJ @2011-08-10 19:39:35Z
1

AJAXで任意のPHP関数を呼び出すことができるかどうかを尋ねているのであれば、明らかなセキュリティ上の理由から(技術的な理由に加えて)答えはno *です。 複数の別々のファイルを作成したくない場合は、与えられたパラメータによって異なる動作をする(たとえば、単一の関数を実行する)PHPスクリプトを作成できます。

*クライアントから来る任意のPHPコマンドを実行するスクリプトを作成することはできますが、それは非常に、非常に、 非常に賢明ではないでしょう。

コメント 1

恣意的とはどういう意味ですか?

written by 11 @2011-08-10 19:41:40Z

コメント 2

@jondavidjohnなんでも、無制限19:46

written by JJJ @2011-08-10 19:46:19Z

コメント 3

私は彼が自分のユーザーに彼のサーバー上で無制限のphpを実行させたくないと思っているのではなく、彼はただ個々のファイル/スクリプトを実行するのではなく彼のphpを機能に編成したいだけです。

written by 11 @2011-08-10 19:47:41Z

コメント 4

「AJAXを使用すると、PHPスクリプトを実行する代わりにPHP関数を実行できます」と質問を読みました。私は間違っているかもしれません。

written by JJJ 2011 @2011-08-10 19:50:06Z

コメント 5

私の見たところでは、セキュリティはここでの問題ではなく、純粋に技術的なものです。つまり、サーバーに直接接続されたクライアント(例:SSH)を持っていて、PHPであろうとなかろうと、任意のコマンドを実行できます。

written by NullUserException @2011-08-10 19:54:27Z

回答 4 written by John Kawakami @2011-08-10 20:01:10Z
1

短い答えは「いいえ」ですが、本当の答えはあなたがそれを偽造できるということです。 NullUserExceptionの答えはいいです。 関数名とそのパラメータを受け取るサーバーを作成します。 その後、サーバーは関数を実行して値を返します。

これはXML-RPCと呼ばれるプロトコルを介してしばらく前に行われました。 いくつかのJS技術を使ったJSON-RPCと呼ばれる試みもありました。

JSのいいところは、次のようなことができるということです。

var base64_decode = create_remote_call('base64_decode');

function create_remote_call(name) {
  return function(x) { 
    jQuery.getJSON('url/server.php',
                   {func:name,arg:x},
                   function(d){return d;}); 
  } 
}

base64_decode( 'sarefdsfsaes')を呼び出すと、ajaxリクエストが行われ、その値が返されます。

このコードはテストされていないのでおそらく機能しないでしょうが、サーバーを呼び出して値を返すような関数を生成する関数です。 複数の引数を処理するには、さらに作業が必要です。

言ったことすべて...私の経験では、通常の機能として偽装するのではなく、すべてのネットワーク通信を明示的にすることをお勧めします。

コメント 1

"base64_decode( 'sarefdsfsaes')への呼び出しはajaxリクエストを行い値を返します" - いいえ、値を返しません。

written by bfavaretto 2012年 @2012-03-30 14:23:45Z

回答 5 written by Community @2017-05-23 12:08:46Z
1

私のpheryライブラリhttp://phery-php-ajax.netのように、Javascriptから直接PHP関数を呼び出して値を処理することができます。 AJAXはDOM要素にバインドされているので、呼び出し側のDOMを操作したり、PHP側からjQueryを使用したりできます。 例は次のとおりです。

Phery::instance()->set(array(
  'phpfunction' => function(){
     return PheryResponse::factory()->jquery('body')->addClass('whoops');
  }
))->process();

JavaScript側(またはHTML)

and in the javascript side (or HTML)

John Kawakamiからのhttps://stackoverflow.com/a/7016986/647380と同等のもので、pheryを使用すると、次のようになります

phery.remote('phpfunction');  
phery.remote('phpfunction');  

AJAXは非同期であり、AJAX呼び出しから値を返すことはできないため、コールバックが必要ですが、これで十分です。