【问题标题】:using jquery $.ajax to call a PHP function使用 jquery $.ajax 调用 PHP 函数
【发布时间】:2011-01-17 04:17:54
【问题描述】:

这可能是一个简单的答案,但我使用 jQuery 的 $.ajax 来调用 PHP 脚本。我想要做的基本上是将 PHP 脚本放在一个函数中,然后从 javascript 调用 PHP 函数。

<?php 
if(isset($_POST['something'] {
    //do something
}
?>

到这里

<?php
function test() {
    if(isset($_POST['something'] {
         //do something. 
    }
}
?>

如何在 javascript 中调用该函数?现在我只是使用 $.ajax 和列出的 PHP 文件。

【问题讨论】:

  • 将 PHP javascript 生成的 PHP 代码传递给 eval'd,或者反过来做,是一个非常的坏主意。
  • 你能解释一下为什么不好吗?
  • 因为任何人都可以用任何代码代替您的代码,因此他们可以对您的服务器做坏事。
  • @Chacha102:你我都不懂这个问题。据我了解,他想做一个远程过程调用。
  • 如果您有一个白名单来限制对除您允许的功能或“过程”之外的所有功能的访问,则可以接受远程过程调用。这并不难实现。

标签: php jquery ajax


【解决方案1】:

使用$.ajax 调用服务器上下文(或URL,或其他)来调用特定的“操作”。你想要的是这样的:

$.ajax({ url: '/my/site',
         data: {action: 'test'},
         type: 'post',
         success: function(output) {
                      alert(output);
                  }
});

在服务器端,应该读取action POST 参数,并且对应的值应该指向要调用的方法,例如:

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch($action) {
        case 'test' : test();break;
        case 'blah' : blah();break;
        // ...etc...
    }
}

我相信这是Command pattern 的简单化身。

【讨论】:

  • 明白了。所以不能直接用js选择PHP中调用哪个函数,只能用PHP抓取post值,那样调用一个函数。谢谢
  • 但是如果您使用的是框架,这很简单。以 Kohana 为例,您可以简单地调用控制器/动作 ajax(function(){ url:'Controller/action.php', });
  • @MrMesees 如果您能与我们分享这些现代最佳实践,那就太好了。
  • 使用 HTTP fetch API 可以用于 JS 前端,也可以使用 Promise。对于 PHP 清理和过滤输入,可能使用中间件,以便可以将其应用于多个端点。我想重要的是,如果您希望我的反馈不等待〜 2 年可能是一个不错的选择。
【解决方案2】:

我开发了一个 jQuery 插件,它允许您调用任何核心 PHP 函数甚至是用户定义的 PHP 函数作为插件的方法:jquery.php

在我们的文档头部包含 jquery 和 jquery.php 并将 request_handler.php 放在我们的服务器上之后,我们将开始以下述方式使用该插件。

为了便于使用,请以简单的方式引用该函数:

    var P = $.fn.php;

然后初始化插件:

P('init', 
{
    // The path to our function request handler is absolutely required
    'path': 'http://www.YourDomain.com/jqueryphp/request_handler.php',

    // Synchronous requests are required for method chaining functionality
    'async': false,

    // List any user defined functions in the manner prescribed here
            // There must be user defined functions with these same names in your PHP
    'userFunctions': {

        languageFunctions: 'someFunc1 someFunc2'
    }
});             

现在还有一些使用场景:

// Suspend callback mode so we don't work with the DOM
P.callback(false);

// Both .end() and .data return data to variables
var strLenA = P.strlen('some string').end();
var strLenB = P.strlen('another string').end();
var totalStrLen = strLenA + strLenB;
console.log( totalStrLen ); // 25

// .data Returns data in an array
var data1 = P.crypt("Some Crypt String").data();
console.log( data1 ); // ["$1$Tk1b01rk$shTKSqDslatUSRV3WdlnI/"]

演示 PHP 函数链:

var data1 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).data();
var data2 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).end();
console.log( data1, data2 );

演示发送 PHP 伪代码的 JSON 块:

var data1 = 
        P.block({
    $str: "Let's use PHP's file_get_contents()!",
    $opts: 
    [
        {
            http: {
                method: "GET",
                header: "Accept-language: en\r\n" +
                        "Cookie: foo=bar\r\n"
            }
        }
    ],
    $context: 
    {
        stream_context_create: ['$opts']
    },
    $contents: 
    {
        file_get_contents: ['http://www.github.com/', false, '$context']
    },
    $html: 
    {
        htmlentities: ['$contents']
    }
}).data();
    console.log( data1 );

后端配置提供了一个白名单,因此您可以限制可以调用哪些函数。该插件还描述了其他一些使用 PHP 的模式。

【讨论】:

    【解决方案3】:

    我会坚持直接调用文件的常规方法,但如果您真的想调用函数,请查看JSON-RPC(JSON 远程过程调用)。

    您基本上是以特定格式向服务器发送 JSON 字符串,例如

    { "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
    

    其中包括要调用的函数和该函数的参数。

    当然,服务器必须知道如何处理此类请求。
    这是jQuery plugin for JSON-RPC,例如Zend JSON Server 作为 PHP 中的服务器实现。


    对于小型项目或较少的功能,这可能是矫枉过正。最简单的方法是karim's answer。另一方面,JSON-RPC 是一种标准。

    【讨论】:

      【解决方案4】:

      你不能用 Javascript 调用 PHP 函数,就像你不能在加载页面时调用任意 PHP 函数一样(想想安全隐患)。

      如果您出于某种原因需要将代码包装在一个函数中,为什么不在函数定义下放置一个函数调用,例如:

      function test() {
          // function code
      }
      
      test();
      

      或者,使用 PHP 包含:

      include 'functions.php'; // functions.php has the test function
      test();
      

      【讨论】:

        【解决方案5】:

        您将不得不在系统中公开和端点 (URL),它将接受来自 jQuery 中的 ajax 调用的 POST 请求。

        然后,当从 PHP 处理该 url 时,您将调用您的函数并以适当的格式返回结果(最有可能是 JSON,或者如果您愿意,也可以是 XML)。

        【讨论】:

          【解决方案6】:

          您可以使用我的库自动执行此操作,过去 2 年我一直在改进它http://phery-php-ajax.net

          Phery::instance()->set(array(
             'phpfunction' => function($data){
                /* Do your thing */
                return PheryResponse::factory(); // do your dom manipulation, return JSON, etc
             }
          ))->process();
          

          javascript 很简单

          phery.remote('phpfunction');
          

          您可以将所有动态 javascript 部分传递给服务器,使用类似可链接接口的查询构建器,您可以将任何类型的数据传递回 PHP。例如,一些在 javascript 端占用太多空间的函数,可以在服务器中使用 this 调用(在本例中,mcrypt,在 javascript 中几乎不可能完成):

          function mcrypt(variable, content, key){
            phery.remote('mcrypt_encrypt', {'var': variable, 'content': content, 'key':key || false});
          }
          
          //would use it like (you may keep the key on the server, safer, unless it's encrypted for the user)
          window.variable = '';
          mcrypt('variable', 'This must be encoded and put inside variable', 'my key');
          

          在服务器中

          Phery::instance()->set(array(
            'mcrypt_encrypt' => function($data){
               $r = new PheryResponse;
          
               $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
               $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
               $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $data['key'] ? : 'my key', $data['content'], MCRYPT_MODE_ECB, $iv);
               return $r->set_var($data['variable'], $encrypted);
               // or call a callback with the data, $r->call($data['callback'], $encrypted);
            }
          ))->process();
          

          现在variable 将拥有加密数据。

          【讨论】:

            猜你喜欢
            • 2011-05-08
            • 1970-01-01
            • 1970-01-01
            • 2013-04-16
            • 1970-01-01
            • 2011-11-10
            相关资源
            最近更新 更多