używając jquery $ .ajax do wywołania funkcji PHP

118

To może być prosta odpowiedź, ale używam $ .ajax jQuery do wywołania skryptu PHP. To, co chcę zrobić, to po prostu umieścić ten skrypt PHP wewnątrz funkcji i wywołać funkcję PHP z javascript.

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

do tego

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

Jak wywołać tę funkcję w javascript? W tej chwili używam tylko $ .ajax z wymienionym plikiem PHP.

Kocia ryba
źródło
6
Przekazywanie kodu PHP wygenerowanego przez javascript do ewaluacji lub zrobienie tego na odwrót to bardzo zły pomysł.
Tyler Carter
Czy możesz wyjaśnić, dlaczego to jest złe?
Sum
3
Ponieważ KAŻDY może umieścić DOWOLNY kod w miejscu twojego kodu, a tym samym może zrobić złe rzeczy na twoim serwerze.
Tyler Carter
9
@ Chacha102: Albo ty, albo ja nie rozumiemy pytania. W moim rozumieniu chce wykonać zdalne wywołanie procedury.
Felix Kling
Zdalne wywołanie procedury mogłoby być dopuszczalne, gdybyś miał białą listę, która ogranicza dostęp do wszystkich funkcji lub „procedur” oprócz dozwolonych. Nie byłoby to trudne do wykonania.
Xaxis

Odpowiedzi:

228

Służy $.ajaxdo wywoływania kontekstu serwera (lub adresu URL itp.) W celu wywołania określonej „akcji”. To, czego chcesz, to coś takiego:

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

Po stronie serwera actionnależy odczytać parametr POST, a odpowiadająca mu wartość wskazywać metodę do wywołania, np .:

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

Uważam, że jest to proste wcielenie wzorca Command .

karim79
źródło
9
Mam cię. Więc nie możesz bezpośrednio wybrać za pomocą js, którą funkcję wywołać w PHP, możesz użyć PHP tylko do pobrania wartości wiadomości i wywołania funkcji w ten sposób. Dzięki
Catfish
Ale jest to proste, jeśli używasz frameworka. na przykład w Kohanie możesz po prostu wywołać kontroler / akcję ajax (function () {url: 'Controller / action.php',});
DeathCoder
1
@MrMesees Byłoby wspaniale, gdybyś podzielił się z nami tymi nowoczesnymi najlepszymi praktykami.
Francisco Romero
użycie API pobierania HTTP może być przeznaczone dla interfejsu JS, a także przy użyciu obietnic. Do czyszczenia i filtrowania danych wejściowych PHP, być może przy użyciu oprogramowania pośredniego, aby można je było zastosować do wielu punktów końcowych. Myślę, że co ważne, jeśli chcesz, aby moja opinia nie czekała ~ 2 lata, może być świetną opcją.
MrMesees
12

Opracowałem wtyczkę jQuery, która umożliwia wywołanie dowolnej podstawowej funkcji PHP, a nawet funkcji PHP zdefiniowanych przez użytkownika jako metod wtyczki: jquery.php

Po umieszczeniu jquery i jquery.php w nagłówku naszego dokumentu i umieszczeniu request_handler.php na naszym serwerze zaczęliśmy używać wtyczki w sposób opisany poniżej.

Aby ułatwić użytkowanie, odwołaj się do funkcji w prosty sposób:

    var P = $.fn.php;

Następnie zainicjuj wtyczkę:

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

A teraz kilka scenariuszy użytkowania:

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

Demonstracja tworzenia łańcuchów funkcji 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 );

Demonstracja wysyłania bloku JSON pseudokodu 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 );

Konfiguracja zaplecza zapewnia białą listę, dzięki czemu można ograniczyć wywoływanie funkcji. Jest kilka innych wzorców pracy z PHP opisanych przez wtyczkę.

Xaxis
źródło
5

Chciałbym trzymać się normalnego podejścia do bezpośredniego wywoływania pliku, ale jeśli naprawdę chcesz wywołać funkcję, spójrz na JSON-RPC (zdalne wywołanie procedury JSON).

W zasadzie wysyłasz na serwer ciąg JSON w określonym formacie, np

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

który zawiera funkcję do wywołania i parametry tej funkcji.

Oczywiście serwer musi wiedzieć, jak obsłużyć takie żądania.
Oto wtyczka jQuery do JSON-RPC i np. Zend JSON Server jako implementacja serwera w PHP.


Może to być przesada w przypadku małego projektu lub mniejszej liczby funkcji. Najłatwiej byłaby odpowiedź Karima . Z drugiej strony JSON-RPC to standard.

Felix Kling
źródło
4

Nie możesz wywołać funkcji PHP za pomocą JavaScript, w ten sam sposób, w jaki nie możesz wywoływać dowolnych funkcji PHP podczas ładowania strony (wystarczy pomyśleć o konsekwencjach dotyczących bezpieczeństwa).

Jeśli z jakiegoś powodu chcesz opakować swój kod w funkcję, dlaczego nie umieścisz wywołania funkcji pod definicją funkcji, np .:

function test() {
    // function code
}

test();

Lub użyj PHP, w tym:

include 'functions.php'; // functions.php has the test function
test();
Niezadowolony Kozioł
źródło
3

Będziesz musiał ujawnić punkt końcowy (URL) w swoim systemie, który zaakceptuje żądanie POST z wywołania ajax w jQuery.

Następnie, podczas przetwarzania tego adresu URL z PHP, wywołałbyś swoją funkcję i zwrócił wynik w odpowiednim formacie (najprawdopodobniej JSON lub XML, jeśli wolisz).

casperOne
źródło
3

Możesz skorzystać z mojej biblioteki, która robi to automatycznie, ulepszałem ją przez ostatnie 2 lata 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();

JavaScript byłby prosty jak

phery.remote('phpfunction');

Możesz przekazać całą dynamiczną część javascript do serwera za pomocą narzędzia do tworzenia zapytań, takiego jak interfejs łańcuchowy, a także możesz przekazać dowolny typ danych z powrotem do PHP. Na przykład niektóre funkcje, które zajmowałyby zbyt dużo miejsca po stronie javascript, można wywołać na serwerze za pomocą tego (w tym przykładzie mcrypt, które w javascript byłoby prawie niemożliwe do wykonania):

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

i na serwerze

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

Teraz variablebędzie miał zaszyfrowane dane.

pocesar
źródło