创build一个PHP函数的jQuery AJAX请求
到目前为止,当创buildAJAX请求时,我已经发布到一个单独的PHP文件。 是否有可能创build一个jQuery的AJAX请求调用一个PHP函数,而不是张贴到一个单独的页面?
如果你可以给我任何例子或文件将是伟大的。
AJAX请求调用一个URL(做一个HTTP请求), 而不是一个文件 ,在大多数情况下,服务器翻译的URL指向一个文件(或者你的情况下的一个php脚本),但是从HTTP请求到收到的响应取决于您(在您的服务器上)。
有许多PHP框架将URL映射到特定的PHP函数,AJAX只是一个访问URL并接收响应的asynchronous方式。
所述URL CAN触发服务器调用特定function并发送回应。 但是由你自己来构build你的URL和服务器端代码。
我相信这个技术在这里的工作有一个根本性的误解。
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) ,但这些可能会变得混乱。
如果您问是否可以使用AJAX调用任意PHP函数,则出于明显的安全原因(除了技术原因),答案不是*。 如果你不想创build多个独立的文件,你可以创build一个PHP脚本来完成不同的事情,具体取决于给定的参数(例如,执行一个函数)。
*尽pipe你可以创build一个脚本来执行任何来自客户端的任意PHP命令,但是这将是非常非常不明智的。
简短的答案是“不”,但真正的答案是, 你可以伪造它 。 NullUserException的答案是好的。 您创build一个服务器将采取函数名称及其参数。 然后服务器执行该函数,并返回该值。
这是通过称为XML-RPC的协议完成的。 还有一个名为JSON-RPC的工作,使用了一些JS技术。
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请求并返回值。
该代码可能不会工作,因为它没有被testing,但它是一个函数,产生一个函数,将调用服务器,然后返回值。 处理多个参数需要更多的工作。
所有这些……按照我的经验,通常是明确地使所有的networking通信,而不是把它伪装成一个常规的function。
你可能会使用一个网桥达到相同的结果,就像我的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)
phery.remote('phpfunction');
相当于https://stackoverflow.com/a/7016986/647380从约翰Kawakami回答,使用奇瑞是:;
function base64($data){ return !empty($data['encode']) ? base64_encode($data['content']) : base64_decode($data['content']); } Phery::instance()->set(array( 'base64' => 'base64' ))->process();
function base64(content, decode, output){ phery.remote('base64', {'content': content, 'encode': decode ? 1 : 0}, {'type':'text'}).done(output); } base64('asdf', false, function(data){ console.log(data); // or assign to some variable });
因为AJAX是asynchronous的,你不能只是从AJAX调用返回一个值,你需要一个callback,但这就足够了。