utiliser jquery $ .ajax pour appeler une fonction PHP

118

Cela peut être une réponse simple, mais j'utilise $ .ajax de jQuery pour appeler un script PHP. Ce que je veux faire, c'est mettre 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 appeler cette fonction en javascript? Pour le moment, j'utilise juste $ .ajax avec le fichier PHP répertorié.

Poisson-chat
la source
6
Passer du code PHP généré par JavaScript PHP à évaluer, ou le faire l'inverse, est une très mauvaise idée.
Tyler Carter
Pouvez-vous expliquer pourquoi c'est mauvais?
Catfish
3
Parce que TOUT LE MONDE peut mettre N'IMPORTE QUEL code à la place de votre code, et ainsi ils peuvent faire de mauvaises choses à votre serveur.
Tyler Carter
9
@ Chacha102: Soit vous ou moi ne comprenez pas la question. D'après moi, il souhaite effectuer un appel de procédure à distance.
Felix Kling
Un appel de procédure à distance pourrait être acceptable si vous disposiez d'une liste blanche qui restreint l'accès à toutes les fonctions ou «procédures» autorisées sauf. Cela ne serait pas difficile à mettre en œuvre.
Xaxis

Réponses:

228

Utilisez $.ajaxpour appeler un contexte de serveur (ou une 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);
                  }
});

Côté serveur, le actionparamètre POST 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 modèle Command .

karim79
la source
9
Je t'ai eu. Vous ne pouvez donc pas choisir directement avec js la fonction à appeler en PHP, vous ne pouvez utiliser PHP que pour saisir la valeur de publication et appeler une fonction de cette façon. Merci
Catfish
Mais c'est simple si vous utilisez un framework. avec Kohana par exemple, vous pouvez simplement appeler le contrôleur / action ajax (function () {url: 'Controller / action.php',});
DeathCoder
1
@MrMesees Ce serait formidable si vous partagiez ces meilleures pratiques modernes avec nous.
Francisco Romero
l'utilisation de l'API HTTP Fetch pourrait être destinée au frontend JS, ainsi que l'utilisation de promesses. Pour le nettoyage et le filtrage des entrées PHP, peut-être en utilisant un middleware afin qu'il puisse être appliqué à plusieurs points de terminaison. Je suppose que si vous souhaitez que mes commentaires n'attendent pas ~ 2 ans, cela pourrait être une excellente option.
MrMesees
12

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 avoir inclus jquery et jquery.php dans la tête de notre document et placé request_handler.php sur notre serveur, nous commencerions à utiliser le plugin de la manière décrite ci-dessous.

Pour faciliter l'utilisation, reportez-vous à 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 du chaînage de fonctions 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 restreindre les fonctions pouvant être appelées. Il existe également quelques autres modèles de travail avec PHP décrits par le plugin.

Xaxis
la source
5

Je m'en tiendrai à l'approche normale pour appeler le fichier directement, mais si vous voulez vraiment appeler une fonction, jetez un œil à JSON-RPC (JSON Remote Procedure Call).

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 entendu, le serveur doit savoir comment gérer ces demandes.
Voici le plugin jQuery pour JSON-RPC et par exemple le serveur Zend JSON comme implémentation serveur en PHP.


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

Félix Kling
la source
4

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 simplement aux implications de sécurité).

Si vous avez besoin d'encapsuler votre code dans une fonction pour une raison quelconque, pourquoi ne mettez-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();
Chèvre mécontente
la source
3

Vous allez devoir exposer un point de terminaison (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 appelleriez votre fonction et renvoyer le résultat dans le format approprié (JSON très probablement, ou XML si vous préférez).

casperOne
la source
3

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 générateur de requêtes comme une interface chaînable, et vous pouvez transmettre tout type de données au PHP. Par exemple, certaines fonctions qui prendraient trop de place du côté javascript, pourraient être appelées dans le serveur en utilisant ceci (dans cet exemple, mcrypt, qui 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 variableaura les données cryptées.

pocésar
la source