web-dev-qa-db-fra.com

en utilisant jquery $ .ajax pour appeler une fonction PHP

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

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

pour ça

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

Comment pourrais-je appeler cette fonction en javascript? Pour le moment, j'utilise simplement $ .ajax avec le fichier PHP répertorié.

114
Catfish

Utilisez $.ajax pour appeler un contexte de serveur (ou une URL ou autre) pour appeler une "action" particulière. Ce que tu veux c'est quelque chose comme:

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

Côté serveur, le paramètre action POST doit être lu et la valeur correspondante doit pointer sur la méthode à appeler, 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 de modèle de commande .

225
karim79

J'ai développé un plugin jQuery qui vous permet d'appeler n'importe quelle fonction principale PHP ou même définie par l'utilisateur PHP en tant que méthode du plugin: jquery.php

Après avoir inclus jquery et jquery.php dans l’en-tête de notre document et placé le fichier request_handler.php sur notre serveur, nous commencerions à utiliser le plug-in de la manière décrite ci-dessous.

Pour faciliter l’utilisation, faites référence à la fonction de manière simple:

    var P = $.fn.php;

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

Démonstration de la chaîne 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 );

Démonstration de 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 du backend fournit une liste blanche afin que vous puissiez limiter les fonctions pouvant être appelées. Il existe également quelques autres modèles d'utilisation de PHP décrits par le plug-in.

12
Xaxis

J'en resterais à l'approche normale pour appeler le fichier directement, mais si vous voulez vraiment appeler une fonction, jetez un œil à 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 requêtes.
Voici plugin jQuery pour JSON-RPC et par ex. le Zend JSON Server comme implémentation de serveur en PHP.


Cela peut être excessif pour un petit projet ou moins de fonctions. Le moyen le plus simple serait réponse de Karim . Par contre, JSON-RPC est un standard.

5
Felix Kling

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 (il suffit de penser aux implications en matière de sécurité).

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

function test() {
    // function code
}

test();

Ou utilisez un PHP include:

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

Vous pouvez utiliser ma bibliothèque qui le fait automatiquement, je l’améliore depuis 2 ans 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 transmettre toute la partie javascript dynamique au serveur, avec un constructeur de requêtes semblable à une interface chaînable, et vous pouvez transmettre tout type de données à PHP. Par exemple, certaines fonctions qui prendraient trop de place du côté javascript, pourraient être appelées sur le serveur à l’aide de ceci (dans cet exemple, mcrypt, cela en 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
pocesar

Vous allez devoir exposer un noeud final (URL) dans votre système, qui acceptera la demande POST de l'appel ajax dans jQuery.

Ensuite, lors du traitement de cette URL à partir de PHP, appelez votre fonction et renvoyez le résultat au format approprié (JSON très probablement ou XML si vous préférez).

3
casperOne