Создание запросов jQuery AJAX к функции PHP - PullRequest
4 голосов
/ 10 августа 2011

До сих пор при создании запросов AJAX я публиковал отдельный файл PHP.Можно ли создать JQuery AJAX-запрос, который вызывает функцию PHP, а не отправляет на отдельную страницу?

Ответы [ 5 ]

53 голосов
/ 10 августа 2011

Я считаю, что существует фундаментальное недопонимание того, как эта технология работает здесь.

AJAX (Javascript), Flash или любая другая клиентская технология не может напрямую вызывать функции PHP (или другие языки, работающие на сервере).Это также верно и для обхода ситуации (например, PHP не может вызывать функции JS).

Клиентские и серверные коды находятся на разных машинах и взаимодействуют по протоколу HTTP (или что у вас).HTTP работает примерно так:

Client-server model

Клиент (например, браузер) отправляет запрос REQUEST -> Сервер и отправляет RESPONSE -> Клиент получает и отображает и /или обрабатывает ответ

Вы должны видеть эти запросы и ответы как сообщения.Сообщения не могут напрямую вызывать функции на серверном языке 1 , но могут предоставить им достаточно информации, чтобы сделать это и получить значимое сообщение от сервера.

Таким образом, у вас может быть обработчик, который обрабатывает и отправляет эти запросы, например:

// ajax_handler.php
switch ($_POST['action']) {
    case 'post_comment':
        post_comment($_POST['content']);
        break;
    case '....':
        some_function();
        break;
    default:
        output_error('invalid request');
        break;
}

Затем просто отправьте клиенту запросы в этот централизованный обработчик с правильными параметрами.Затем обработчик решает, какие функции вызывать на стороне сервера, и, наконец, отправляет ответ клиенту.


1 Технически существуют вызовы удаленных процедур (RPC) , но они могут запутаться.

7 голосов
/ 10 августа 2011

AJAX-запросы вызывают URL (делают HTTP-запрос), не файл , в большинстве случаев URL-адрес транслируется сервером для указания на файл (или сценарий php в вашем случае),но все, что происходит от HTTP-запроса до полученного ответа, зависит от вас (на вашем сервере).

Существует множество сред PHP, которые отображают URL-адреса на определенные функции php, AJAX - это просто асинхронный способполучить доступ к URL-адресу и получить ответ.

указанный URL-адрес CAN инициирует запуск сервером определенной функции и отправку ответа.Но вы сами должны структурировать свой URL и код на стороне сервера как таковой.

1 голос
/ 27 ноября 2012

вы можете достичь того же результата, используя мост, как моя библиотека phery http://phery -php-ajax.net вы можете вызывать функции PHP напрямую из Javascript и работать со значением. AJAX связан с элементами DOM, поэтому вы можете манипулировать вызывающим DOM или просто использовать jQuery со стороны PHP. Примером может быть:

Phery::instance()->set(array(
  'phpfunction' => function(){
     return PheryResponse::factory()->jquery('body')->addClass('whoops');
  }
))->process();

и на стороне javascript (или HTML)

phery.remote('phpfunction');  

эквивалент ответа https://stackoverflow.com/a/7016986/647380 от Джона Каваками с использованием Фери:

function base64($data){
  return !empty($data['encode']) ? base64_encode($data['content']) : base64_decode($data['content']);
}

Phery::instance()->set(array(
  'base64' => 'base64'
))->process();
function base64(content, decode, output){
  phery.remote('base64', {'content': content, 'encode': decode ? 1 : 0}, {'type':'text'}).done(output);
}

base64('asdf', false, function(data){
  console.log(data); // or assign to some variable
});

поскольку AJAX является асинхронным и вы не можете просто вернуть значение из вызова AJAX, вам нужен обратный вызов, но этого будет достаточно.

1 голос
/ 11 августа 2011

Короткий ответ - «нет», но реальный ответ состоит в том, что вы можете подделать его .NullUserException ответ хороший.Вы создаете сервер, который будет принимать имя функции и ее параметры.Затем сервер выполняет функцию и возвращает значение.

Это было сделано некоторое время назад по протоколу XML-RPC.Была также попытка под названием JSON-RPC, в которой использовались некоторые методы JS.

В JS есть одна замечательная вещь: вы можете делать такие вещи:

var base64_decode = create_remote_call('base64_decode');

function create_remote_call(name) {
  return function(x) { 
    jQuery.getJSON('url/server.php',
                   {func:name,arg:x},
                   function(d){return d;}); 
  } 
}

Вызов base64_decode ('sarefdsfsaes') сделает запрос ajax и вернет значение.

Этот код, вероятно, не будет работать, поскольку он не был протестирован, но это функция, которая создает функцию, которая будет вызывать сервер, изатем верните значение.Обработка более чем одного аргумента требует больше работы.

Все это говорит ... по моему опыту, обычно хорошо сделать все сетевые коммуникации явными, а не маскировать их как обычную функцию.

1 голос
/ 10 августа 2011

Если вы спрашиваете, можете ли вы вызывать любую произвольную функцию PHP с помощью AJAX, ответ будет отрицательным * по очевидным причинам безопасности (в дополнение к техническим причинам).Если вы не хотите создавать несколько отдельных файлов, вы можете создать PHP-скрипт, который будет выполнять разные действия в зависимости от заданного параметра (например, выполнять одну функцию).

* Хотя вы можете создать сценарийэто выполнит любую произвольную команду PHP, исходящую от клиента, но это будет очень, очень, очень неразумно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...