використовуючи jquery $ .ajax для виклику функції PHP


118

Це може бути простою відповіддю, але я використовую $ .ajax jQuery для виклику сценарію PHP. Що я хочу зробити, це в основному поставити цей скрипт PHP всередині функції і викликати функцію PHP з JavaScript.

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

до цього

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

Як би я назвав цю функцію в JavaScript? Зараз я просто використовую $ .ajax із переліченим файлом PHP.


6
Передача PHP-коду, сформованого Javascript, що має бути eval'd, або робити це навпаки - дуже погана ідея.
Тайлер Картер

Чи можете ви пояснити, чому це погано?
Сом

3
Тому що БУДЬ-хто може поставити БУДЬ-який код замість вашого коду, і таким чином вони можуть робити погані речі на вашому сервері.
Тайлер Картер

9
@ Chacha102: Ви чи я не розумієте питання. Наскільки я розумію, він хоче зробити дистанційний дзвінок з процедури.
Фелікс Клінг

Віддалений виклик процедури може бути прийнятним, якби у вас був білий список, який обмежує доступ до всіх, крім дозволених функцій або "процедур". Це не важко здійснити.
Xaxis

Відповіді:


228

Використовуйте $.ajaxдля виклику контексту сервера (або URL-адреси чи будь-якого іншого), щоб викликати певну дію. Те, що ви хочете, є щось на зразок:

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

На стороні сервера actionслід зчитувати параметр POST і відповідне значення повинно вказувати на метод виклику, наприклад:

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

Я вважаю, що це просте втілення схеми Command .


9
Готча. Таким чином, ви не можете безпосередньо вибрати js, яку функцію дзвонити в PHP, ви можете використовувати PHP лише для отримання значення посту та виклику функції таким чином. Спасибі
Сом

Але це просто, якщо ви використовуєте рамку. Наприклад, з Kohana ви можете просто викликати контролер / action ajax (function () {url: 'Controller / action.php',});
DeathCoder

1
@MrMesees Було б чудово, якщо ви поділитесь із нами сучасними найкращими практиками.
Франциско Ромеро

використання API вибору HTTP може бути для інтерфейсу JS, а також з використанням обіцянок. Для PHP санітарії та фільтрації вводу, можливо, з використанням проміжного програмного забезпечення, щоб воно могло застосовуватися до декількох кінцевих точок. Я думаю, що важливо, якщо ви хочете, щоб мої відгуки не чекали ~ 2 роки, можуть бути чудовим варіантом.
MrMesees

12

Я розробив плагін jQuery, який дозволяє викликати будь-яку основну функцію PHP або навіть визначені користувачем функції PHP як методи плагіна: jquery.php

Включивши jquery та jquery.php в голову нашого документа та розмістивши request_handler.php на нашому сервері, ми б почали використовувати плагін у спосіб, описаний нижче.

Для зручності використання функції посилаються на простий спосіб:

    var P = $.fn.php;

Потім ініціалізуйте плагін:

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

А тепер кілька сценаріїв використання:

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

Демонстрація ланцюга функцій 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 );

Демонстрація надсилання блоку JSON псевдокоду 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 );

Резервна конфігурація забезпечує білий список, щоб ви могли обмежити, які функції можна викликати. Існує ще кілька моделей роботи з PHP, описаними плагіном.


5

Я б дотримувався звичайного підходу безпосередньо до виклику файлу, але якщо ви дійсно хочете викликати функцію, подивіться JSON-RPC (JSON Remote Procedure Call).

В основному ви надсилаєте сервер рядок JSON у певному форматі, наприклад

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

яка включає функцію виклику та параметри цієї функції.

Звичайно сервер повинен знати, як обробляти такі запити.
Ось плагін jQuery для JSON-RPC і, наприклад, Zend JSON Server як серверна реалізація в PHP.


Це може бути зайвим для невеликого проекту або менше функцій. Найпростішим способом була б відповідь Каріма . З іншого боку, JSON-RPC - це стандарт.


4

Ви не можете викликати функцію PHP за допомогою Javascript, так само ви не можете викликати довільні функції PHP під час завантаження сторінки (просто подумайте про наслідки для безпеки).

Якщо вам потрібно з будь-якої причини перетворити свій код у функцію, чому б вам не поставити виклик функції під визначення функції, наприклад:

function test() {
    // function code
}

test();

Або використовуйте PHP:

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

3

Вам доведеться відкрити та кінцеву точку (URL) у вашій системі, яка прийме запит POST від виклику ajax у jQuery.

Потім, обробляючи цей URL з PHP, ви б зателефонували на свою функцію та повернули результат у відповідному форматі (скоріше за все JSON або XML, якщо вам зручніше).


3

Ви можете використовувати мою бібліотеку, яка робить це автоматично, я вдосконалював її протягом останніх 2 років 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 буде простий як

phery.remote('phpfunction');

Ви можете передати всю динамічну частину javascript на сервер, за допомогою конструктора запитів, як можливий інтерфейс, і ви можете передавати будь-який тип даних назад до PHP. Наприклад, деякі функції, які займуть занадто багато місця на стороні javascript, можна викликати на сервері за допомогою цього (у цьому прикладі mcrypt, який у JavaScript буде майже неможливо виконати):

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

і на сервері

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

Тепер у variableзаповіту будуть зашифровані дані.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.