Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/232.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Javascript AJAX post请求调用任何PHP函数_Javascript_Php_Json_Ajax - Fatal编程技术网

使用Javascript AJAX post请求调用任何PHP函数

使用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

我已经搜索了很多主题,但找不到答案。我的目标是让一个HTML超链接在PHP页面上调用Javascript AJAX post请求,以任意数量的参数运行PHP函数。对于具有特定名称的已定义函数,许多主题都解决了这个问题。我想对AJAX post请求函数进行泛化,以便将PHP函数名传递给要调用它的AJAX请求,这样我就可以在Javascript中定义要调用的PHP函数

这就是我所拥有的,但是它在PHP脚本中出错了

HTML:

<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;
}

?>