en utilisant jquery $.ajax pour appeler une fonction PHP

c'est peut-être une réponse simple, mais j'utilise les $de jQuery.ajax pour appeler un script PHP. Ce que je veux faire, c'est essentiellement mettre ce script PHP dans une fonction et appeler la fonction PHP à partir de javascript.

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

à ce

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

comment appellerais-Je cette fonction en javascript? Droit maintenant, je suis juste en utilisant $.ajax avec le fichier PHP listé.

108
demandé sur Johnny Rockex 2010-02-16 01:15:57

6 réponses

utilisez $.ajax pour appeler un contexte serveur (ou URL, ou autre) pour invoquer une "action" particulière. Ce que vous voulez, c'est quelque chose comme:

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

du côté du serveur, le paramètre action doit être lu et la valeur correspondante doit pointer vers la méthode à invoquer, par exemple:

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

je crois que c'est une simple incarnation du Command pattern .

216
répondu karim79 2010-02-15 22:30:54

j'ai développé un plugin jQuery qui vous permet d'appeler n'importe quelle fonction php de base ou même des fonctions PHP définies par l'utilisateur comme méthodes du plugin: jquery.php

après jquery et jquery inclus.php dans la tête de notre document et placer request_handler.php sur notre serveur nous commencerions à utiliser le plugin de la manière décrite ci-dessous.

Pour la facilité d'utilisation de référence de la fonction d'une manière simple:

    var P = $.fn.php;

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

et maintenant quelques scénarios d'utilisation:

// 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 ); // ["$Tk1b01rk$shTKSqDslatUSRV3WdlnI/"]

faire preuve de PHP de la fonction de chaînage:

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

démontrant l'envoi d'un bloc JSON de pseudo-code 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 configuration d'arrière-plan fournit une liste blanche de sorte que vous pouvez restreindre quelles fonctions peuvent être appelées. Il y a quelques autres modèles pour travailler avec PHP décrit par le plugin.

10
répondu Xaxis 2013-01-08 15:32:21

Je m'en tiendrais à l'approche normale pour appeler le fichier directement, mais si vous voulez vraiment appeler une fonction, jetez un oeil à JSON-RPC (appel de procédure à distance JSON).

vous envoyez essentiellement une chaîne JSON dans un format spécifique au serveur, par exemple

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

qui inclut la fonction à appeler et les paramètres de cette fonction.

bien sûr le serveur doit savoir comment gérer de telles demandes.

Voici jQuery plugin pour JSON-RPC et par exemple le Zend JSON Server comme implémentation du serveur en PHP.


cela peut être excessif pour un petit projet ou moins de fonctions. La façon la plus facile serait réponse de karim . D'un autre côté, JSON-RPC est une norme.

4
répondu Felix Kling 2018-05-20 15:04:08

vous ne pouvez pas appeler une fonction PHP avec Javascript, de la même manière que vous ne pouvez pas appeler des fonctions PHP arbitraires lorsque vous chargez une page (pensez aux implications de sécurité).

si vous devez envelopper votre code dans une fonction pour quelque raison que ce soit, pourquoi ne mettez-vous pas un appel de fonction sous la définition de la fonction, par exemple:

function test() {
    // function code
}

test();

Ou, utiliser PHP include:

include 'functions.php'; // functions.php has the test function
test();
3
répondu DisgruntledGoat 2010-02-15 22:37:56

vous pouvez utiliser Ma bibliothèque qui le fait automatiquement, Je l'améliore depuis les 2 dernières années 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();

le javascript serait simple comme

phery.remote('phpfunction');

vous pouvez passer toute la partie dynamique javascript au serveur, avec un constructeur de requête comme l'interface à chaîne, et vous pouvez passer n'importe quel type de données en arrière au PHP. Par exemple, certaines fonctions qui prendrait trop de place du côté javascript, pourrait être appelé dans le serveur en utilisant ceci (dans cet exemple, mcrypt, qui dans javascript serait presque impossible à accomplir):

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

et dans le serveur

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

maintenant le variable aura les données cryptées.

3
répondu pocesar 2012-12-06 13:23:58

vous allez devoir exposer et endpoint (URL) dans votre système qui acceptera la requête POST de l'appel ajax dans jQuery.

ensuite, lors du traitement de cette url à partir de PHP, vous appellerez votre fonction et retournerez le résultat dans le format approprié (JSON très probablement, ou XML si vous préférez).

2
répondu casperOne 2010-02-15 22:17:42