2010-02-15 58 views
103

Esto puede ser una respuesta simple, pero estoy usando jquery $ .ajax 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 este

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

cómo iba a llamar a esa función en javascript? En este momento solo estoy usando $ .ajax con el archivo PHP listado.

+5

Pasar PHP código PHP generado por JavaScript para ser evaluado, o hacerlo al revés, es ** una ** mala idea. –

+0

¿Puedes explicar por qué es malo? – Catfish

+3

Porque CUALQUIERA puede poner CUALQUIER código en lugar de su código, y así pueden hacer cosas malas a su servidor. –

Respuesta

207

Utilice $.ajax para llamar a un contexto del servidor (o URL, o lo que sea) para invocar una 'acción' en particular. Lo que queremos es algo así como:

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

En el lado del servidor, el parámetro action puesto debe ser leído 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 encarnación simple de Command pattern.

+8

Gotcha. Por lo tanto, no puede elegir directamente con js que funcionan para llamar en PHP, solo puede usar PHP para tomar el valor de la publicación y llamar a una función de esa manera. Gracias – Catfish

+0

Pero esto es simple si está usando un marco. con Kohana, por ejemplo, puede simplemente llamar al controlador/acción ajax (función() { url: 'Controlador/acción.php', }); – DeathCoder

+3

Debe actualizarse para reflejar las mejores prácticas modernas – MrMesees

2

Deberá exponer y punto final (URL) en su sistema que aceptará la solicitud POST desde la llamada ajax en jQuery.

Luego, al procesar esa url de PHP, debe llamar a su función y devolver el resultado en el formato apropiado (JSON es más probable, o XML, si lo prefiere).

4

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, p.

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

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

Por supuesto, el servidor tiene que saber cómo manejar esas solicitudes.
Aquí está jQuery plugin for JSON-RPC y p. Ej. el Zend JSON Server como implementación del servidor en PHP.


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

+0

Muchas gracias, estaba buscando esta solución hace mucho tiempo ... –

3

No puede llamar a una función de PHP con Javascript, de la misma forma 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 razón, ¿por qué no poner ya sea una llamada de función bajo la definición de la función, por ejemplo:

function test() { 
    // function code 
} 

test(); 

O bien, utilizar un PHP incluye:

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

es posible utilizar mi biblioteca que lo hace automáticamente, he ido 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 simple como

phery.remote('phpfunction'); 

Puede pasar toda la parte Javascript dinámica al servidor, con un generador de consultas como interfaz de conexión en cadena, y usted puede pasar cualquier tipo de datos de nuevo al PHP. Por ejemplo, algunas de las funciones que tomarían demasiado espacio en el lado javascript, podrían ser llamados en el servidor utilizando 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 de

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 el variable tendrá los datos cifrados.

10

he desarrollado un plugin de jQuery que te permite llamar a cualquier función básica de PHP o incluso funciones de PHP definidas por el usuario como métodos del plugin: jquery.php

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

Para facilidad de uso hacen referencia a la función de una manera sencilla:

var P = $.fn.php; 

Entonces inicializar 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 PHP función de encadenamiento:

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

que demuestra el envío de un bloque de JSON PHP pseudo-código:

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 la dorsal proporciona una lista blanca para que pueda restringir qué funciones se pueden llamar. También hay algunos otros patrones para trabajar con PHP descritos por el complemento.

+0

gracias has hecho un buen efecto. –

Cuestiones relacionadas