usando jquery $ .ajax para llamar a una función PHP

118

Esta puede ser una respuesta simple, pero estoy usando $ .ajax de jQuery para llamar a un script PHP. Lo que quiero hacer es básicamente poner ese script PHP dentro de una función y llamar a la función PHP desde javascript.

<?php 
if(isset($_POST['something'] {
    //do something
}
?>

a esto

<?php
function test() {
    if(isset($_POST['something'] {
         //do something. 
    }
}
?>

¿Cómo llamaría a esa función en javascript? Ahora mismo estoy usando $ .ajax con el archivo PHP listado.

Bagre
fuente
6
Pasar código PHP generado por JavaScript para ser evaluado, o hacerlo al revés, es una muy mala idea.
Tyler Carter
¿Puedes explicar por qué eso es malo?
Bagre
3
Porque CUALQUIERA puede poner CUALQUIER código en lugar de su código y, por lo tanto, pueden hacerle cosas malas a su servidor.
Tyler Carter
9
@ Chacha102: O tú o yo no entendemos la pregunta. Según tengo entendido, quiere realizar una llamada a procedimiento remoto.
Felix Kling
Una llamada a procedimiento remoto podría ser aceptable si tuviera una lista blanca que restrinja el acceso a todas las funciones o "procedimientos" excepto a sus permitidos. Esto no sería difícil de implementar.
Xaxis

Respuestas:

228

Úselo $.ajaxpara llamar a un contexto de servidor (o URL, o lo que sea) para invocar una 'acción' en particular. Lo que quieres es algo como:

$.ajax({ url: '/my/site',
         data: {action: 'test'},
         type: 'post',
         success: function(output) {
                      alert(output);
                  }
});

En el lado del servidor, el actionparámetro POST debe leerse y el valor correspondiente debe apuntar al método a invocar, por ejemplo:

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch($action) {
        case 'test' : test();break;
        case 'blah' : blah();break;
        // ...etc...
    }
}

Creo que es una simple encarnación del patrón Command .

karim79
fuente
9
Te tengo. Por lo tanto, no puede elegir directamente con js qué función llamar en PHP, solo puede usar PHP para tomar el valor de publicación y llamar a una función de esa manera. Gracias
Bagre
Pero esto es simple si está utilizando un marco. con Kohana, por ejemplo, puede simplemente llamar al controlador / acción ajax (function () {url: 'Controller / action.php',});
DeathCoder
1
@MrMesees Sería fantástico que compartiera con nosotros esas prácticas recomendadas modernas.
Francisco Romero
el uso de HTTP fetch API podría ser para el frontend JS, así como para usar promesas. Para desinfectar y filtrar entradas de PHP, tal vez utilizando un middleware para que se pueda aplicar a múltiples puntos finales. Supongo que lo más importante es que si desea que mis comentarios no esperen ~ 2 años podría ser una gran opción.
MrMesees
12

Desarrollé un complemento de jQuery que te permite llamar a cualquier función principal de PHP o incluso a funciones PHP definidas por el usuario como métodos del complemento: jquery.php

Después de incluir jquery y jquery.php en el encabezado de nuestro documento y colocar request_handler.php en nuestro servidor, comenzaríamos a usar el complemento de la manera que se describe a continuación.

Para facilitar su uso, consulte la función de manera sencilla:

    var P = $.fn.php;

Luego inicialice el complemento:

P('init', 
{
    // The path to our function request handler is absolutely required
    'path': 'http://www.YourDomain.com/jqueryphp/request_handler.php',

    // Synchronous requests are required for method chaining functionality
    'async': false,

    // List any user defined functions in the manner prescribed here
            // There must be user defined functions with these same names in your PHP
    'userFunctions': {

        languageFunctions: 'someFunc1 someFunc2'
    }
});             

Y ahora algunos escenarios de uso:

// Suspend callback mode so we don't work with the DOM
P.callback(false);

// Both .end() and .data return data to variables
var strLenA = P.strlen('some string').end();
var strLenB = P.strlen('another string').end();
var totalStrLen = strLenA + strLenB;
console.log( totalStrLen ); // 25

// .data Returns data in an array
var data1 = P.crypt("Some Crypt String").data();
console.log( data1 ); // ["$1$Tk1b01rk$shTKSqDslatUSRV3WdlnI/"]

Demostrando el encadenamiento de funciones PHP:

var data1 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).data();
var data2 = P.strtoupper("u,p,p,e,r,c,a,s,e").strstr([], "C,A,S,E").explode(",", [], 2).end();
console.log( data1, data2 );

Demostrando el envío de un bloque JSON de pseudocódigo PHP:

var data1 = 
        P.block({
    $str: "Let's use PHP's file_get_contents()!",
    $opts: 
    [
        {
            http: {
                method: "GET",
                header: "Accept-language: en\r\n" +
                        "Cookie: foo=bar\r\n"
            }
        }
    ],
    $context: 
    {
        stream_context_create: ['$opts']
    },
    $contents: 
    {
        file_get_contents: ['http://www.github.com/', false, '$context']
    },
    $html: 
    {
        htmlentities: ['$contents']
    }
}).data();
    console.log( data1 );

La configuración de backend proporciona una lista blanca para que pueda restringir las funciones que se pueden llamar. También hay algunos otros patrones para trabajar con PHP descritos por el complemento.

Xaxis
fuente
5

Me quedaría con el enfoque normal para llamar al archivo directamente, pero si realmente desea llamar a una función, eche un vistazo a JSON-RPC (Llamada a procedimiento remoto JSON).

Básicamente, envía una cadena JSON en un formato específico al servidor, por ejemplo

{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}

que incluye la función a llamar y los parámetros de esa función.

Por supuesto, el servidor debe saber cómo manejar estas solicitudes.
Aquí está el complemento jQuery para JSON-RPC y, por ejemplo, el servidor Zend JSON como implementación de servidor en PHP.


Esto puede resultar excesivo para un proyecto pequeño o para menos funciones. La forma más fácil sería la respuesta de karim . Por otro lado, JSON-RPC es un estándar.

Felix Kling
fuente
4

No puede llamar a una función PHP con Javascript, de la misma manera que no puede llamar a funciones PHP arbitrarias cuando carga una página (solo piense en las implicaciones de seguridad).

Si necesita envolver su código en una función por cualquier motivo, ¿por qué no coloca una llamada a la función debajo de la definición de la función, por ejemplo:

function test() {
    // function code
}

test();

O use un PHP incluye:

include 'functions.php'; // functions.php has the test function
test();
Cabra descontenta
fuente
3

Tendrá que exponer un punto final (URL) en su sistema que aceptará la solicitud POST de la llamada ajax en jQuery.

Luego, al procesar esa URL desde PHP, llamaría a su función y devolvería el resultado en el formato apropiado (JSON más probablemente, o XML si lo prefiere).

casperOne
fuente
3

Puede usar mi biblioteca que lo hace automáticamente, la he estado mejorando durante los últimos 2 años http://phery-php-ajax.net

Phery::instance()->set(array(
   'phpfunction' => function($data){
      /* Do your thing */
      return PheryResponse::factory(); // do your dom manipulation, return JSON, etc
   }
))->process();

El javascript sería tan simple como

phery.remote('phpfunction');

Puede pasar toda la parte dinámica de JavaScript al servidor, con un generador de consultas como una interfaz encadenable, y puede pasar cualquier tipo de datos a PHP. Por ejemplo, algunas funciones que ocuparían demasiado espacio en el lado de javascript, podrían llamarse en el servidor usando esto (en este ejemplo, mcrypt, que en javascript sería casi imposible de lograr):

function mcrypt(variable, content, key){
  phery.remote('mcrypt_encrypt', {'var': variable, 'content': content, 'key':key || false});
}

//would use it like (you may keep the key on the server, safer, unless it's encrypted for the user)
window.variable = '';
mcrypt('variable', 'This must be encoded and put inside variable', 'my key');

y en el servidor

Phery::instance()->set(array(
  'mcrypt_encrypt' => function($data){
     $r = new PheryResponse;

     $iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB);
     $iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
     $encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $data['key'] ? : 'my key', $data['content'], MCRYPT_MODE_ECB, $iv);
     return $r->set_var($data['variable'], $encrypted);
     // or call a callback with the data, $r->call($data['callback'], $encrypted);
  }
))->process();

Ahora variabletendrá los datos cifrados.

pocesar
fuente