到目前为止,在创建AJAX请求时,我一直在发布到单独的PHP文件中。是否可以创建一个调用PHP函数而不是发布到单独页面的jQuery AJAX请求?
如果你能给我发送任何例子或文件会很棒。
答案 0 :(得分:53)
我认为对这项技术的运作方式存在根本性的误解。
AJAX(Javascript),Flash或任何客户端技术都无法直接调用PHP函数(或在服务器上运行的其他语言)。 这也适用于反过来(例如:PHP无法调用JS函数)。
客户端和服务器代码驻留在不同的计算机上,它们通过HTTP协议(或您拥有的)进行通信。 HTTP的工作方式大致如下:
客户端(例如:浏览器)发送请求 - >服务器处理请求并发送RESPONSE - >客户端获取并显示和/或处理响应
您必须将这些请求和响应视为消息。消息不能直接用服务器端语言 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 从技术上讲,有remote procedure calls (RPCs),但这些可能会变得混乱。
答案 1 :(得分:7)
AJAX请求调用URL(发出HTTP请求),不是文件,在大多数情况下,服务器将URL转换为指向文件(或者您的案例中的PHP脚本) ,但从HTTP请求到收到的响应的所有事情都取决于您(在您的服务器上)。
有许多PHP框架将URL映射到特定的php函数,AJAX只是一种访问URL并接收响应的异步方式。
所述URL CAN 触发服务器调用特定功能并发回响应。但是由你自己构建你的URL和服务器端代码。
答案 2 :(得分:1)
如果您问是否可以使用AJAX调用任意PHP函数,答案是否*,出于明显的安全原因(除了技术原因)。如果你不想创建多个单独的文件,你可以创建一个PHP脚本,根据它给出的参数(例如,执行一个函数)执行不同的操作。
*虽然你可以创建一个脚本来执行任何来自客户端的任意PHP命令,但这非常非常非常不明智。
答案 3 :(得分:1)
简短回答是“不”,但真正的答案是你可以伪造。 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请求并返回该值。
该代码可能无法正常工作,因为它尚未经过测试,但它是一个函数,它会生成一个函数来调用服务器,然后返回该值。处理多个参数需要更多的工作。
所有这些......根据我的经验,通常将所有网络通信都显式化,而不是将其伪装成常规功能。
答案 4 :(得分: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)
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调用返回一个值,你需要一个回调,但这就足够了。