Verwenden von jquery $ .ajax zum Aufrufen einer PHP-Funktion

118

Dies mag eine einfache Antwort sein, aber ich verwende jQuerys $ .ajax, um ein PHP-Skript aufzurufen. Im Grunde möchte ich dieses PHP-Skript in eine Funktion einfügen und die PHP-Funktion aus Javascript aufrufen.

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

dazu

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

Wie würde ich diese Funktion in Javascript nennen? Im Moment verwende ich nur $ .ajax mit der aufgelisteten PHP-Datei.

Wels
quelle
6
Es ist eine sehr schlechte Idee, von PHP-Javascript generierten PHP-Code zur Auswertung zu übergeben oder umgekehrt .
Tyler Carter
Kannst du erklären, warum das schlecht ist?
Wels
3
Weil JEDER JEDEN Code anstelle Ihres Codes einfügen kann und somit Ihrem Server schlechte Dinge antun kann.
Tyler Carter
9
@ Chacha102: Entweder du oder ich verstehen die Frage nicht. Nach meinem Verständnis möchte er einen Remoteprozeduraufruf durchführen.
Felix Kling
Ein Remote-Prozeduraufruf kann akzeptabel sein, wenn Sie eine Whitelist eingerichtet haben, die den Zugriff auf alle außer Ihren zulässigen Funktionen oder "Prozeduren" einschränkt. Dies wäre nicht schwer umzusetzen.
Xaxis

Antworten:

228

Verwenden Sie $.ajaxdiese Option , um einen Serverkontext (oder eine URL oder was auch immer) aufzurufen und eine bestimmte 'Aktion' aufzurufen. Was Sie wollen, ist so etwas wie:

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

Auf der Serverseite sollte der actionPOST-Parameter gelesen werden und der entsprechende Wert sollte auf die aufzurufende Methode verweisen, z.

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

Ich glaube, das ist eine einfache Inkarnation des Befehlsmusters .

karim79
quelle
9
Erwischt. Sie können also nicht direkt mit js auswählen, welche Funktion in PHP aufgerufen werden soll. Sie können PHP nur verwenden, um den Post-Wert abzurufen und eine Funktion auf diese Weise aufzurufen. Vielen Dank
Wels
Dies ist jedoch einfach, wenn Sie ein Framework verwenden. Mit Kohana können Sie beispielsweise einfach den Controller / die Aktion ajax (function () {url: 'Controller / action.php',}) aufrufen.
DeathCoder
1
@MrMesees Es wäre großartig, wenn Sie uns diese modernen Best Practices mitteilen würden.
Francisco Romero
Die Verwendung der HTTP-Abruf-API kann sowohl für das JS-Frontend als auch für die Verwendung von Versprechungen gelten. Zum Bereinigen und Filtern von PHP-Eingaben, möglicherweise mithilfe einer Middleware, damit diese auf mehrere Endpunkte angewendet werden kann. Ich nehme an, wichtig, wenn Sie möchten, dass mein Feedback nicht ~ 2 Jahre wartet, könnte eine gute Option sein.
MrMesees
12

Ich habe ein jQuery-Plugin entwickelt, mit dem Sie jede Kern-PHP-Funktion oder sogar benutzerdefinierte PHP-Funktionen als Methoden des Plugins aufrufen können : jquery.php

Nachdem wir jquery und jquery.php in den Kopf unseres Dokuments aufgenommen und request_handler.php auf unserem Server platziert haben, würden wir das Plugin auf die unten beschriebene Weise verwenden.

Zur Vereinfachung der Verwendung verweisen Sie auf einfache Weise auf die Funktion:

    var P = $.fn.php;

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

Und jetzt einige Nutzungsszenarien:

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

Demonstration der Verkettung von PHP-Funktionen:

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

Demonstration des Sendens eines JSON-Blocks mit PHP-Pseudocode:

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

Die Backend-Konfiguration bietet eine Whitelist, mit der Sie einschränken können, welche Funktionen aufgerufen werden können. Es gibt noch einige andere Muster für die Arbeit mit PHP, die vom Plugin beschrieben werden.

Xaxis
quelle
5

Ich würde mich an den normalen Ansatz halten, die Datei direkt aufzurufen, aber wenn Sie wirklich eine Funktion aufrufen möchten, schauen Sie sich JSON-RPC (JSON Remote Procedure Call) an.

Grundsätzlich senden Sie eine JSON-Zeichenfolge in einem bestimmten Format an den Server, z

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

Dies beinhaltet die aufzurufende Funktion und die Parameter dieser Funktion.

Natürlich muss der Server wissen, wie solche Anfragen zu behandeln sind.
Hier ist das jQuery-Plugin für JSON-RPC und z. B. den Zend JSON-Server als Serverimplementierung in PHP.


Dies kann für ein kleines Projekt oder weniger Funktionen übertrieben sein. Der einfachste Weg wäre Karims Antwort . Andererseits ist JSON-RPC ein Standard.

Felix Kling
quelle
4

Sie können eine PHP-Funktion nicht mit Javascript aufrufen, genauso wie Sie beim Laden einer Seite keine beliebigen PHP-Funktionen aufrufen können (denken Sie nur an die Auswirkungen auf die Sicherheit).

Wenn Sie Ihren Code aus irgendeinem Grund in eine Funktion einschließen müssen, warum setzen Sie auch keinen Funktionsaufruf unter die Funktionsdefinition, z.

function test() {
    // function code
}

test();

Oder verwenden Sie ein PHP gehören:

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

Sie müssen einen Endpunkt (URL) in Ihrem System verfügbar machen, der die POST-Anforderung vom Ajax-Aufruf in jQuery akzeptiert.

Wenn Sie dann diese URL aus PHP verarbeiten, rufen Sie Ihre Funktion auf und geben das Ergebnis im entsprechenden Format zurück (höchstwahrscheinlich JSON oder XML, wenn Sie dies bevorzugen).

casperOne
quelle
3

Sie können meine Bibliothek verwenden, die dies automatisch tut. Ich habe sie in den letzten 2 Jahren verbessert. 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();

Das Javascript wäre einfach wie

phery.remote('phpfunction');

Sie können den gesamten dynamischen Javascript-Teil mit einem Abfrage-Generator wie einer verkettbaren Schnittstelle an den Server übergeben und jede Art von Daten an PHP zurückgeben. Zum Beispiel könnten einige Funktionen, die auf der Javascript-Seite zu viel Platz beanspruchen würden, auf dem Server damit aufgerufen werden (in diesem Beispiel mcrypt, das in Javascript fast unmöglich zu erreichen wäre):

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

und auf dem 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();

Jetzt variablehaben die die verschlüsselten Daten.

Pocesar
quelle