创建对 PHP 函数的 jQuery AJAX 请求

Posted

技术标签:

【中文标题】创建对 PHP 函数的 jQuery AJAX 请求【英文标题】:Creating jQuery AJAX requests to a PHP function 【发布时间】:2011-10-24 09:46:23 【问题描述】:

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

如果您可以给我发送任何示例或文档,那就太好了。

【问题讨论】:

不,除非您调用 PHP 脚本。据我所知,您无法与同一页面上的 PHP 函数进行通信 AJAX (JS) 无法调用个别 PHP 函数。它不是那样工作的。 【参考方案1】:

我认为对于这项技术的工作原理存在根本性的误解。

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 从技术上讲有remote procedure calls (RPCs),但这些可能会变得混乱。

【讨论】:

“我认为对技术在这里的运作方式存在根本性的误解。”我完全同意。 “客户端和服务器代码驻留在不同的机器上”......我认为这是困扰很多人的部分。 html、Javascript 和 PHP 都驻留在服务器端,而 Javascript 在客户端执行。我认为人们不明白获取 Javascript 和调用 PHP 脚本 from Javascript 是对服务器的两个独立请求。 +1 插图。 :)【参考方案2】:

AJAX 请求调用 URL(发出 HTTP 请求),不是文件,在大多数情况下,URL 由服务器转换为指向文件(或在您的情况下为 php 脚本) ,但从 HTTP 请求到收到响应的所有事情都取决于您(在您的服务器上)。

有许多 PHP 框架将 URL 映射到特定的 php 函数,AJAX 只是一种访问 URL 并接收响应的异步方式。

上述 URL CAN 触发服务器调用特定函数并返回响应。但是,您可以自行构建 URL 和服务器端代码。

【讨论】:

【参考方案3】:

如果您问是否可以使用 AJAX 调用任意 PHP 函数,答案是否定的*,出于明显的安全原因(除了技术原因)。如果您不想创建多个单独的文件,您可以制作一个 PHP 脚本,根据给定的参数(例如,执行单个函数)执行不同的操作。

*虽然你可以编写一个脚本来执行来自客户端的任意 PHP 命令,但这将是非常、非常、非常不明智的。

【讨论】:

任意是什么意思? @jondavidjohn 任何东西,不受限制 我不认为他想让他的用户在他的服务器上运行不受限制的 php,他只是想将他的 php 组织成函数而不是运行单个文件/脚本。 我不知道,我读到的问题是“使用 AJAX 可以执行 PHP 函数而不是运行 PHP 脚本”。不过,我可能是错的。 在我看来,安全不是这里的问题,它纯粹是技术问题。即:您可以让客户端直接连接到服务器(例如:SSH)并执行任意命令,无论是否使用 PHP。【参考方案4】:

简短的回答是“不”,但真正的答案是你可以伪造它。 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 请求并返回值。

该代码可能无法工作,因为它尚未经过测试,但它是一个生成函数的函数,该函数将调用服务器,然后返回值。处理多个参数需要更多工作。

说了这么多...根据我的经验,将所有网络通信明确化而不是将其伪装成常规功能通常会更好。

【讨论】:

“对 base64_decode('sarefdsfsaes') 的调用将发出 ajax 请求并返回值” - 不,它不会返回值。【参考方案5】:

您可以使用桥接器实现相同的结果,例如我的 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://***.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 调用中返回一个值,因此您需要一个回调,但这已经足够了。

【讨论】:

以上是关于创建对 PHP 函数的 jQuery AJAX 请求的主要内容,如果未能解决你的问题,请参考以下文章

如何使用带有 json 和 php 的 jquery 的 $.ajax 函数上传文件

使用 jquery / ajax 在 CodeIgniter 的控制器中调用函数

ajax如何使用?

jQuery.when() 是不是对这些函数调用进行排队?

详细解读Jquery各Ajax函数

如何通过 AJAX 将 jquery 对象数据发送到 php?