He buscado en muchos temas, pero no pude encontrar la respuesta. Mi objetivo es tener un hipervínculo HTML que llame a una solicitud de publicación AJAX de Javascript en una página PHP para ejecutar una función PHP (opcionalmente con cualquier cantidad de argumentos). Muchos temas resolvieron este problema para funciones definidas (con un nombre específico). Quiero generalizar la función de solicitud posterior de AJAX para pasar el nombre de la función de PHP a la solicitud de AJAX para llamarla, de modo que pueda definir en Javascript qué función de PHP llamar.
Esto es lo que tengo, pero sale mal en el script PHP...
El HTML:
<a onclick="call_php('php_function_name', ['arg_1', 'arg_2']);">call</a> <p id="demo"></p>
El 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 })); }
En Javascript, estoy cuestionando JSON.stringify()
y setRequestHeader()
si se usa correctamente en este caso.
El PHP, que debería llamar a una función en su archivo:
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... }
En PHP, estoy cuestionando el header('Content-Type: application/json')
ya que ya está definido en Javascript. Pero la pregunta principal es: ¿cómo escribir el código PHP para llamar a la función PHP? Por cierto: cuando imprimo echo $post
da una advertencia: json_decode() espera que el parámetro 1 sea una cadena, una matriz dada...
El manual de PHP establece que la variable súper global $_POST
solo contiene los argumentos de publicación para datos de publicación de tipo application/x-www-form-urlencoded
o multipart/form-data
.
Una matriz asociativa de variables pasadas al script actual a través del método HTTP POST cuando se usa application/x-www-form-urlencoded o multipart/form-data como el tipo de contenido HTTP en la solicitud.
Sin embargo, está intentando enviar una solicitud de publicación con el cuerpo de tipo application/json
.
Para leer un cuerpo sin procesar en PHP, puede hacer esto :
$postdata = file_get_contents("php://input");
Esto le dará una cadena de todo el cuerpo de la solicitud. Luego puede json_decode
esta cadena para obtener el objeto JSON deseado.
En cuanto a la parte de llamar a una función proporcionada en la solicitud, call_user_func_array
hará bien el trabajo. Si eso es algo que debe hacer o no, es un tema completamente diferente. Por lo que entiendo, te estás acercando al concepto de un enrutador y un controlador .
He escrito un fragmento simple de lo que creo que quieres hacer:
<?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; } ?>
Comente json_decode y genere su $_POST llamando a print_r ($_POST); debería ver su estructura de datos, si es una matriz simple con claves de datos y valores, entonces no tiene que decodificarla, pero si la matriz tiene una sola columna y su valor son sus datos, tome su clave y úsela para decodificar el contenido