использование jquery $ .ajax для вызова функции PHP


118

Это может быть простой ответ, но я использую jQuery $ .ajax для вызова 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, для оценки или наоборот - очень плохая идея.
Тайлер Картер,

Вы можете объяснить, почему это плохо?
Catfish,

3
Потому что ЛЮБОЙ может поместить ЛЮБОЙ код вместо вашего, и, таким образом, они могут сделать с вашим сервером плохие вещи.
Тайлер Картер,

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

Удаленный вызов процедуры может быть приемлемым, если у вас есть белый список, ограничивающий доступ ко всем, кроме разрешенных функций или «процедур». Это было бы несложно реализовать.
Xaxis 08

Ответы:


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 только для получения значения сообщения и вызова функции таким образом. Спасибо
Catfish

Но это просто, если вы используете фреймворк. например, с помощью Kohana вы можете просто вызвать контроллер / действие ajax (function () {url: 'Controller / action.php',});
DeathCoder

1
@MrMesees Было бы здорово, если бы вы поделились с нами этими современными передовыми практиками.
Франсиско Ромеро

использование HTTP fetch API может быть для интерфейса 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:

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.