使用Javascript AJAX发布请求调用任何PHP函数 [英] Call any PHP function using a Javascript AJAX post request
问题描述
我搜索了很多主题,但找不到答案.我的目标是让HTML超链接在PHP页面上调用Javascript AJAX发布请求以运行PHP函数(可选地,可以包含任意数量的参数).很多主题解决了已定义函数(使用特定名称)的问题.我想对AJAX发布请求函数进行概括,以便将PHP函数名称传递给AJAX请求以对其进行调用,因此我可以在Javascript中定义要调用的PHP函数.
I've searched around a lot of topics, but couldn't find the answer. My goal is to have a HTML hyperlink calling a Javascript AJAX post request on a PHP page to run a PHP function (optionally with any amount of arguments). A lot of topics solved this problem for defined functions (with a specific name). I want to generalize the AJAX post request function in order to pass the PHP function name to the AJAX request to call it, so I can define in Javascript what PHP function to call.
这就是我所拥有的,但是在PHP脚本中却出错了...
This is what I have, but it goes wrong at the PHP script...
HTML:
<a onclick="call_php('php_function_name', ['arg_1', 'arg_2']);">call</a>
<p id="demo"></p>
JavaScript:
The Javascript:
function call_php(fname, args) {
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
document.getElementById('demo').innerHTML = this.responseText;
}
};
xhttp.open('POST', 'includes/functions.php', true);
xhttp.setRequestHeader('Content-type', 'application/json');
xhttp.send(JSON.stringify({
'fname': fname,
'args': args
}));
}
在Javascript中,我要问JSON.stringify()
和setRequestHeader()
在这种情况下是否正确使用.
At the Javascript I'm questioning the JSON.stringify()
and setRequestHeader()
if it is used correctly in this case.
PHP,应该在文件中调用一个函数:
The PHP, which should call a function in it's file:
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上,我正在问header('Content-Type: application/json')
,因为它已经在Javascript中定义了.但是主要的问题是:如何编写PHP代码来调用PHP函数?顺便说一句:当我打印echo $post
时,它发出警告:json_decode()期望参数1为字符串,给定数组...
At the PHP I'm questioning the header('Content-Type: application/json')
since it's already defined at the Javascript. But the main question is: how to write the PHP code to call the PHP function? By the way: when I print echo $post
it gives a warning: json_decode() expects parameter 1 to be string, array given...
推荐答案
The PHP Manual states that the $_POST
super global variable only contains the post arguments for post data of type application/x-www-form-urlencoded
or multipart/form-data
.
通过传递给当前脚本的变量的关联数组 使用application/x-www-form-urlencoded或HTTP时的HTTP POST方法 multipart/form-data作为请求中的HTTP Content-Type.
An associative array of variables passed to the current script via the HTTP POST method when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request.
但是,您正在尝试发送正文为application/json
的帖子请求.
However, you are trying to send a post request with the body of type application/json
.
要阅读PHP的原始内容,您可以此:
To read a raw body in PHP you can do this:
$postdata = file_get_contents("php://input");
这将为您提供整个请求正文的字符串.然后,您可以json_decode
此字符串以获取所需的JSON对象.
This will give you a string of the entire request body. You can then json_decode
this string to get the desired JSON object.
对于调用请求中提供的函数的部分,call_user_func_array
可以很好地完成工作.这是否是您应该应该做的事情,是一个完全独立的问题.据我了解,您正在使用路由器和控制器的概念.
As for the part of calling a function supplied in the request, the call_user_func_array
will do the job fine. Whether or not that is something you should do is an entirely separate issue. From what I understand, you are edging on on the concept of a router and a controller.
我已经写了一个我想做的简单片段:
I have writen a simple snippet of what I think you want to do:
<?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;
}
?>
这篇关于使用Javascript AJAX发布请求调用任何PHP函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!