到目前为止,在创建 AJAX 请求时,我一直在发布到一个单独的 PHP 文件。是否可以创建一个调用 PHP 函数而不是发布到单独页面的 jQuery AJAX 请求?
如果您可以向我发送任何示例或文档,那就太好了。
到目前为止,在创建 AJAX 请求时,我一直在发布到一个单独的 PHP 文件。是否可以创建一个调用 PHP 函数而不是发布到单独页面的 jQuery AJAX 请求?
如果您可以向我发送任何示例或文档,那就太好了。
我相信人们对技术在这里的工作方式存在根本性的误解。
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 请求调用 URL(发出 HTTP 请求),而不是文件,在大多数情况下,服务器将 URL 转换为指向文件(或在您的情况下为 php 脚本),但是从 HTTP 请求到收到的响应取决于您(在您的服务器上)。
有许多 PHP 框架将 URL 映射到特定的 php 函数,AJAX 只是一种访问 URL 并接收响应的异步方式。
所述URL CAN触发服务器调用特定的功能,并发送回一个响应。但是由您来构建您的 URL 和服务器端代码。
简短的回答是“不”,但真正的答案是你可以伪造它。NullUserException 的回答很好。您创建一个将采用函数名称及其参数的服务器。然后服务器执行函数,并返回值。
这是通过一种称为 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 请求并返回值。
该代码可能无法工作,因为它没有经过测试,但它是一个函数,它生成一个函数,该函数将调用服务器,然后返回值。处理多个参数需要更多的工作。
所有这一切……根据我的经验,使所有网络通信明确而不是将其伪装成常规功能通常是好的。
您可以使用桥实现相同的结果,就像我的 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');
相当于John Kawakami 回答的https://stackoverflow.com/a/7016986/647380,使用 phery 是:
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 是异步的,您不能只从 AJAX 调用中返回一个值,因此您需要一个回调,但这就足够了。
如果您问是否可以使用 AJAX 调用任意 PHP 函数,答案是否定的,因为明显的安全原因(除了技术原因)。如果您不想创建多个单独的文件,您可以根据给定的参数(例如,执行单个函数)制作一个执行不同操作的 PHP 脚本。
*虽然您可以制作一个脚本来执行来自客户端的任意 PHP 命令,但这将非常、非常、非常不明智。