使用Javascript AJAX post请求调用任何PHP函数
我已经搜索了很多主题,但找不到答案。我的目标是让一个HTML超链接在PHP页面上调用Javascript AJAX post请求,以任意数量的参数运行PHP函数。对于具有特定名称的已定义函数,许多主题都解决了这个问题。我想对AJAX post请求函数进行泛化,以便将PHP函数名传递给要调用它的AJAX请求,这样我就可以在Javascript中定义要调用的PHP函数 这就是我所拥有的,但是它在PHP脚本中出错了 HTML:使用Javascript AJAX post请求调用任何PHP函数,javascript,php,json,ajax,Javascript,Php,Json,Ajax,我已经搜索了很多主题,但找不到答案。我的目标是让一个HTML超链接在PHP页面上调用Javascript AJAX post请求,以任意数量的参数运行PHP函数。对于具有特定名称的已定义函数,许多主题都解决了这个问题。我想对AJAX post请求函数进行泛化,以便将PHP函数名传递给要调用它的AJAX请求,这样我就可以在Javascript中定义要调用的PHP函数 这就是我所拥有的,但是它在PHP脚本中出错了 HTML: <a onclick="call_php('php_function
<a onclick="call_php('php_function_name', ['arg_1', 'arg_2']);">call</a>
<p id="demo"></p>
在Javascript中,我询问JSON.stringify和setRequestHeader在本例中是否正确使用
PHP应该调用其文件中的函数:
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
//header('Content-Type: application/json');
$post = json_decode($_POST/*, true*/);
// DO SOMETHING TO CALL: fname(...args);
}
function php_function_name(arg_1, arg_2) {
// A FUNCTION...
}
在PHP中,我质疑标题“Content-Type:application/json”,因为它已经在Javascript中定义了。但主要问题是:如何编写PHP代码来调用PHP函数?顺便说一句:当我打印echo$post时,它会给出一个警告:json\u decode期望参数1是字符串,数组给定…注释json\u decode并通过调用print\u r$\u post输出$\u post;
您应该看到您的数据结构,如果它是一个带有数据键和值的简单数组,那么您不必对其进行解码,但是如果该数组只有一列,并且它的值是您的数据,那么使用它的键对内容进行解码Comment json\u decode,并通过调用print\u r$\u POST输出您的$\u POST; 您应该看到您的数据结构,如果它是一个包含数据键和值的简单数组,则不必对其进行解码,但如果该数组只有一列,且其值是您的数据,则取其键并使用其对PHP手册中的内容进行解码,$\u POST super全局变量仅包含类型为的POST数据的POST参数应用程序/x-www-form-urlencoded或多部分/表单数据 通过传递给当前脚本的变量的关联数组 使用application/x-www-form-urlencoded或 多部分/表单数据作为请求中的HTTP内容类型 但是,您正在尝试发送一个post请求,其主体类型为application/json 要在PHP中读取原始正文,可以执行以下操作: 这将为您提供整个请求正文的字符串。然后可以对该字符串进行json_解码,以获得所需的json对象 至于调用请求中提供的函数的部分,call\u user\u func\u数组可以很好地完成这项工作。你是否应该这样做是一个完全不同的问题。据我所知,你正在接近一个新的概念 我写了一段我认为你想做的事情:
<?php
switch ($_SERVER['REQUEST_METHOD']) {
case 'POST':
post_handler();
return;
case 'GET':
get_handler();
return;
default:
echo 'Not implemented';
return;
}
function post_handler() {
$raw_data = file_get_contents("php://input");
$req_body = json_decode($raw_data, TRUE);
call_user_func_array($req_body['function'], $req_body['args']);
}
function get_handler() {
echo 'This page left intentionally blank.';
}
function some_function($arg1, $arg2) {
echo $arg1.' '.$arg2;
}
?>
PHP手册指出$\u POST super全局变量仅包含类型为application/x-www-form-urlencoded或multipart/form data的POST数据的POST参数
通过传递给当前脚本的变量的关联数组
使用application/x-www-form-urlencoded或
多部分/表单数据作为请求中的HTTP内容类型
但是,您正在尝试发送一个post请求,其主体类型为application/json
要在PHP中读取原始正文,可以执行以下操作:
这将为您提供整个请求正文的字符串。然后可以对该字符串进行json_解码,以获得所需的json对象
至于调用请求中提供的函数的部分,call\u user\u func\u数组可以很好地完成这项工作。你是否应该这样做是一个完全不同的问题。据我所知,你正在接近一个新的概念
我写了一段我认为你想做的事情:
<?php
switch ($_SERVER['REQUEST_METHOD']) {
case 'POST':
post_handler();
return;
case 'GET':
get_handler();
return;
default:
echo 'Not implemented';
return;
}
function post_handler() {
$raw_data = file_get_contents("php://input");
$req_body = json_decode($raw_data, TRUE);
call_user_func_array($req_body['function'], $req_body['args']);
}
function get_handler() {
echo 'This page left intentionally blank.';
}
function some_function($arg1, $arg2) {
echo $arg1.' '.$arg2;
}
?>
您是否正在搜索PHP函数,例如call_user_func_array'PHP_function_name',array&$a?可能重复@gus27所说的内容,尽管您可能想先检查您的JS试图调用的函数是否确实存在,请使用它。谢谢,我将查看call_user_func函数,但是我如何将post数据变量name和args放入该函数中呢?请确保这一点很清楚:允许调用任何PHP函数都是一个非常糟糕的主意。考虑一下如果我在你的站点上打开一个JS控制台并键入一些类似于CaluxPHP'Excel,[RM- Rf/']的情况会发生什么。希望你能看到,对我来说,以这种方式真正扰乱你的系统的可能性是无穷的。不要尝试和黑名单,也不要有一个允许函数的白名单,只需对任何其他输入做出错误的响应。您是否正在搜索PHP函数,例如,call_user_func_array'PHP_function_name',array&$a?可能重复@gus27所说的内容,尽管您可能想首先检查JS试图调用的函数是否确实存在,但请使用它。谢谢,我将查看call_user_func函数,但是如何将post数据变量名称和参数放入该函数中?请确保清楚:允许调用任何PHP函数
d是一个非常糟糕的主意。考虑一下如果我在你的站点上打开一个JS控制台并键入一些类似于CaluxPHP'Excel,[RM- Rf/']的情况会发生什么。希望你能看到,对我来说,以这种方式真正扰乱你的系统的可能性是无穷的。也不要尝试使用黑名单,它有一个允许函数的白名单,只需对任何其他输入进行错误响应即可。我得到了一个有趣的响应,一个空数组:array。你知道哪里出了问题吗?出于某种原因,你的ajax请求没有发送任何数据,试着将其作为手动解析的正常数据发送,就像这个key=value&key2=value2一样,看看发生了什么array[key]=>value[key2]=>value2是的,工作正常!为什么不使用json格式;pi不知道我也有同样的问题,但使用angularjs,我使用来自JQueryTanks的formData来解决它,我总是尝试在没有jQuery的情况下解决它;我得到了一个有趣的回答,一个空数组:array。你知道哪里出了问题吗?出于某种原因,你的ajax请求没有发送任何数据,试着将其作为手动解析的正常数据发送,就像这个key=value&key2=value2一样,看看发生了什么array[key]=>value[key2]=>value2是的,工作正常!为什么不使用json格式;pi不知道我也有同样的问题,但使用angularjs,我使用来自JQueryTanks的formData来解决它,我总是尝试在没有jQuery的情况下解决它;谢谢,它工作得很好!不过,请记住IMSoP的评论:允许调用任何PHP函数是一个极其危险的安全问题。不要尝试黑名单,也不要有一个允许函数的白名单。但是对于我的小项目来说,安全性不是很重要,这就可以了。谢谢,它工作得很好!不过,请记住IMSoP的评论:允许调用任何PHP函数是一个极其危险的安全问题。不要尝试黑名单,也不要有一个允许函数的白名单。但是对于我的小项目来说,安全性不是很重要,这就可以了。
<?php
switch ($_SERVER['REQUEST_METHOD']) {
case 'POST':
post_handler();
return;
case 'GET':
get_handler();
return;
default:
echo 'Not implemented';
return;
}
function post_handler() {
$raw_data = file_get_contents("php://input");
$req_body = json_decode($raw_data, TRUE);
call_user_func_array($req_body['function'], $req_body['args']);
}
function get_handler() {
echo 'This page left intentionally blank.';
}
function some_function($arg1, $arg2) {
echo $arg1.' '.$arg2;
}
?>