使用jquery $ .ajax调用PHP函数


118

这可能是一个简单的答案,但是我正在使用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文件。


6
传递要评估的JavaScript javascript生成的PHP代码,或者反之亦然,这是一个非常糟糕的主意。
泰勒·卡特

您能解释一下为什么不好吗?
fish鱼2010年

3
因为任何人都可以将任何代码代替您的代码,因此它们可以对您的服务器造成不良影响。
泰勒·卡特

9
@ Chacha102:您或我都不明白这个问题。据我了解,他想进行远程过程调用。
菲利克斯·克林

如果您有一个白名单限制了对除允许的功能或“过程”之外的所有访问的访问权限,则可以接受远程过程调用。这将不难实现。
Xaxis

Answers:


228

使用$.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模式的简单化身。


9
知道了 因此,您不能直接使用js选择要在PHP中调用的函数,而只能使用PHP来获取post值并以这种方式调用函数。谢谢
fish鱼2010年

但这很简单,如果您使用的是框架。以Kohana为例,您可以简单地调用controller / action ajax(function(){url:'Controller / action.php',});
DeathCoder 2014年

1
@MrMesees如果您与我们分享这些现代的最佳实践,那就太好了。
弗朗西斯科·罗梅罗

使用HTTP fetch API既可以用于JS前端,也可以用于promises。对于PHP清理和过滤输入,可能使用中间件,以便可以将其应用于多个端点。我想重要的是,如果您希望我的反馈意见不等待〜2年,则可能是个不错的选择。
MrMesees '18

12

我开发了一个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 );

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

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的模式。


5

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

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

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

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

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


对于一个较小的项目或较少的功能,这可能是过大的。最简单的方法就是karim的答案。另一方面,JSON-RPC是标准。


4

您不能使用Javascript调用PHP函数,就像加载页面时不能调用任意PHP函数一样(考虑一下安全性)。

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

function test() {
    // function code
}

test();

或者,使用PHP包括:

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

3

您将必须在系统中公开和终结点(URL),这将接受来自jQuery中ajax调用的POST请求。

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


3

您可以使用自动执行此操作的库,过去两年来我一直在对其进行改进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端占用太多空间,因此可以使用此函数在服务器中调用(在本例中为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将具有加密的数据。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.