Я искал множество тем, но не нашел подходящего ответа. Моя цель – иметь гиперссылку HYML, которая вызывает функцию Javascript, выполняющую запрос на отправку AJAX на странице PHP, для выполнения функции PHP, опционально с любым количеством аргументов. Многие темы решали эту проблему для конкретных функций (с определенным именем). Я хочу обобщить запрос на отправку AJAX для использования этой же функции для вызова всех функций PHP.
Это то, что у меня есть, но это не так на PHP-скрипте …
HTML:
<a onclick="call_php('php_function_name', ['arg_1', 'arg_2']);">call</a> <p id="demo"></p>
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()
вопросы 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 я задаю вопрос header('Content-Type: application/json')
поскольку он уже определен в Javascript. Но главный вопрос: как написать PHP-код для вызова функции PHP? Кстати: когда я печатаю echo $post
он дает предупреждение: json_decode () ожидает, что параметр 1 будет строкой, массив задан …
В руководстве PHP указано, что супер глобальная переменная $_POST
содержит только аргументы post для данных типа application/x-www-form-urlencoded
или multipart/form-data
.
Ассоциативный массив переменных передается текущему скрипту с помощью метода HTTP POST при использовании приложений / x-www-form-urlencoded или multipart / form-data в качестве HTTP Content-Type в запросе.
Однако вы пытаетесь отправить сообщение с телом типа application/json
.
Чтобы прочитать исходное тело в PHP, вы можете сделать это :
$postdata = file_get_contents("php://input");
Это даст вам строку всего тела запроса. Затем вы можете json_decode
эту строку, чтобы получить желаемый объект JSON.
Что касается части вызова функции, предоставленной в запросе, call_user_func_array
будет выполнять работу отлично. Независимо от того, что вы должны делать, это совершенно отдельная проблема. Насколько я понимаю, вы опираетесь на концепцию маршрутизатора и контроллера .
Я написал простой фрагмент того, что, как я думаю, вы хотите сделать:
<?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; } ?>
Комментируйте json_decode и выведите свой $ _POST, вызвав print_r ($ _POST); вы должны увидеть свою структуру данных, если это простой массив с ключами данных и значениями, то вам не нужно его декодировать, но если в массиве есть один столбец, и это значение – ваши данные, тогда возьмите его ключ и используйте его для декодирования Контент