这可能是一个简单的答案,但我使用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文件。
答案 0 :(得分:224)
使用$.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的简单化身。
答案 1 :(得分: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 );
演示发送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。
答案 2 :(得分:5)
我会坚持使用常规方法直接调用文件,但如果你真的想调用一个函数,请查看JSON-RPC(JSON远程过程调用)。
您基本上将特定格式的JSON字符串发送到服务器,例如
{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
包括要调用的函数和该函数的参数。
当然,服务器必须知道如何处理此类请求 这是jQuery plugin for JSON-RPC,例如PHP中的Zend JSON Server作为服务器实现。
对于小型项目或更少的功能而言,这可能是过度的。最简单的方法是karim's answer。另一方面,JSON-RPC是标准。
答案 3 :(得分:4)
你不能用Javascript调用PHP函数,就像加载页面时不能调用任意PHP函数一样(只考虑安全隐患)。
如果您因任何原因需要将代码包装在函数中,为什么不在函数定义下放置函数调用,例如:
function test() {
// function code
}
test();
或者,使用PHP包括:
include 'functions.php'; // functions.php has the test function
test();
答案 4 :(得分:3)
您将需要在系统中公开和终止(URL),它将接受来自jQuery中ajax调用的POST请求。
然后,当从PHP处理该url时,您将调用您的函数并以适当的格式返回结果(如果您愿意,最有可能使用JSON,或者返回XML)。
答案 5 :(得分: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
将拥有加密数据。