utilizzando jquery $ .ajax per chiamare una funzione PHP


118

Questa potrebbe essere una risposta semplice, ma sto usando $ .ajax di jQuery per chiamare uno script PHP. Quello che voglio fare è fondamentalmente mettere quello script PHP all'interno di una funzione e chiamare la funzione PHP da javascript.

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

a questa

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

Come chiamerei quella funzione in javascript? In questo momento sto solo usando $ .ajax con il file PHP elencato.


6
Passando PHP codice PHP JavaScript generati da eval'd, o farlo il contrario, è una molto cattiva idea.
Tyler Carter

Puoi spiegare perché è un male?
Pesce gatto

3
Perché CHIUNQUE può mettere QUALSIASI codice al posto del tuo codice, e quindi possono fare cose cattive al tuo server.
Tyler Carter

9
@ Chacha102: O tu o io non capiamo la domanda. A quanto mi risulta, vuole fare una chiamata a procedura remota.
Felix Kling

Una chiamata di procedura remota potrebbe essere accettabile se si dispone di una whitelist che limita l'accesso a tutte le funzioni o "procedure" consentite. Questo non sarebbe difficile da implementare.
Xaxis

Risposte:


228

Utilizzare $.ajaxper chiamare un contesto del server (o URL, o qualsiasi altra cosa) per invocare una particolare "azione". Quello che vuoi è qualcosa del tipo:

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

Sul lato server, il actionparametro POST dovrebbe essere letto e il valore corrispondente dovrebbe puntare al metodo da invocare, ad esempio:

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

Credo che sia una semplice incarnazione del modello Command .


9
Gotcha. Quindi non puoi scegliere direttamente con js quale funzione chiamare in PHP, puoi solo usare PHP per afferrare il valore del post e chiamare una funzione in questo modo. Grazie
Catfish

Ma questo è semplice se stai usando un framework. con Kohana per esempio puoi semplicemente chiamare il controller / action ajax (function () {url: 'Controller / action.php',});
DeathCoder

1
@MrMesees Sarebbe fantastico se condividessi queste best practice moderne con noi.
Francisco Romero

l'utilizzo dell'API di recupero HTTP potrebbe essere per il frontend JS, nonché per le promesse. Per la sanificazione e il filtraggio dell'input PHP, magari utilizzando un middleware in modo che possa essere applicato a più endpoint. Suppongo che sia importante se desideri che il mio feedback non attenda ~ 2 anni potrebbe essere un'ottima opzione.
MrMesees

12

Ho sviluppato un plugin jQuery che ti permette di chiamare qualsiasi funzione PHP principale o anche funzioni PHP definite dall'utente come metodi del plugin: jquery.php

Dopo aver incluso jquery e jquery.php nell'intestazione del nostro documento e aver posizionato request_handler.php sul nostro server, inizieremo a utilizzare il plugin nel modo descritto di seguito.

Per facilità d'uso, fare riferimento alla funzione in modo semplice:

    var P = $.fn.php;

Quindi inizializza il plugin:

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

E ora alcuni scenari di utilizzo:

// 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/"]

Dimostrazione del concatenamento di funzioni 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 );

Dimostrazione dell'invio di un blocco JSON di pseudo codice 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 configurazione del backend fornisce una whitelist in modo da poter limitare le funzioni che possono essere chiamate. Ci sono anche alcuni altri modelli per lavorare con PHP descritti dal plugin.


5

Vorrei attenermi all'approccio normale per chiamare direttamente il file, ma se vuoi davvero chiamare una funzione, dai un'occhiata a JSON-RPC (JSON Remote Procedure Call).

Fondamentalmente invii una stringa JSON in un formato specifico al server, ad es

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

che include la funzione da chiamare ei parametri di quella funzione.

Ovviamente il server deve sapere come gestire tali richieste.
Ecco il plugin jQuery per JSON-RPC e ad esempio Zend JSON Server come implementazione del server in PHP.


Questo potrebbe essere eccessivo per un piccolo progetto o meno funzioni. Il modo più semplice sarebbe la risposta di Karim . D'altra parte, JSON-RPC è uno standard.


4

Non puoi chiamare una funzione PHP con Javascript, allo stesso modo non puoi chiamare funzioni PHP arbitrarie quando carichi una pagina (pensa solo alle implicazioni sulla sicurezza).

Se hai bisogno di racchiudere il tuo codice in una funzione per qualsiasi motivo, perché non inserisci una chiamata di funzione sotto la definizione della funzione, ad esempio:

function test() {
    // function code
}

test();

Oppure usa un PHP include:

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

3

Dovrai esporre un endpoint (URL) nel tuo sistema che accetterà la richiesta POST dalla chiamata ajax in jQuery.

Quindi, durante l'elaborazione di quell'URL da PHP, dovresti chiamare la tua funzione e restituire il risultato nel formato appropriato (JSON molto probabilmente o XML se preferisci).


3

Puoi usare la mia libreria che lo fa automaticamente, l'ho migliorata negli ultimi 2 anni 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();

Il javascript sarebbe semplice come

phery.remote('phpfunction');

Puoi passare tutta la parte javascript dinamica al server, con un generatore di query come un'interfaccia concatenabile, e puoi ritrasmettere qualsiasi tipo di dati al PHP. Ad esempio, alcune funzioni che occuperebbero troppo spazio nel lato javascript, potrebbero essere chiamate nel server utilizzando questo (in questo esempio, mcrypt, che in javascript sarebbe quasi impossibile da realizzare):

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

e nel server

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

Ora variableavranno i dati crittografati.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.