使用 jquery $. ajax 调用 PHP 函数

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

407499 次浏览

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

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

我会坚持使用普通的方法直接调用文件,但是如果您真的想调用函数,那么可以看一下 < strong > JSON-RPC (JSON 远程过程调用)。

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

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

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

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


This might be overkill for a small project or less functions. Easiest way would be Karim 的回答. On the other hand, JSON-RPC is a standard.

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

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

On the server side, the action POST parameter should be read and the corresponding value should point to the method to invoke, e.g.:

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

我相信这是 命令模式的简单化身。

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

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

function test() {
// function code
}


test();

或者,使用 PHP 包括:

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

你可以使用我的库,自动做到这一点,我一直在改进它在过去的两年 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');

You can pass all the dynamic javascript part to the server, with a query builder like chainable interface, and you may pass any type of data back to the PHP. For example, some functions that would take too much space in the javascript side, could be called in the server using this (in this example, mcrypt, that in javascript would be almost impossible to accomplish):

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会有加密的数据。

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

And now some usage scenarios:

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