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

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

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

【问题讨论】:

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

标签: php javascript ajax jquery


【解决方案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://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 调用中返回一个值,因此您需要一个回调,但这已经足够了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-13
      • 2013-07-03
      • 1970-01-01
      • 2013-04-12
      • 1970-01-01
      相关资源
      最近更新 更多