为PHP函数创建jQuery AJAX请求

时间:2011-08-10 19:36:08

标签: php javascript ajax jquery

到目前为止,在创建AJAX请求时,我一直在发布到单独的PHP文件中。是否可以创建一个调用PHP函数而不是发布到单独页面的jQuery AJAX请求?

如果你能给我发送任何例子或文件会很棒。

5 个答案:

答案 0 :(得分:53)

我认为对这项技术的运作方式存在根本性的误解。

AJAX(Javascript),Flash或任何客户端技术都无法直接调用PHP函数(或在服务器上运行的其他语言)。 这也适用于反过来(例如:PHP无法调用JS函数)。

客户端和服务器代码驻留在不同的计算机上,它们通过HTTP协议(或您拥有的)进行通信。 HTTP的工作方式大致如下:

Client-server model

客户端(例如:浏览器)发送请求 - >服务器处理请求并发送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调用返回一个值,你需要一个回调,但这就足够了。