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.


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 .


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ę.


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.


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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.