До сих пор при создании запросов AJAX я отправлял их в отдельный файл PHP. Возможно ли создать запрос JQuery AJAX, который вызывает функцию PHP, а не сообщения на отдельной странице?
Если бы вы могли отправить мне какие-либо примеры или документацию, это было бы здорово.
AJAX запрашивает URL-адрес (делает HTTP-запрос), а не файл , в большинстве случаев URL-адрес переводится сервером, указывая на файл (или скрипт php в вашем случае), но все, что происходит от HTTP-запроса до ответ, который получен, зависит от вас (на вашем сервере).
Существует много фреймворков PHP, которые отображают URL-адреса для определенных функций php, AJAX – это просто асинхронный способ доступа к URL-адресу и получения ответа.
Указанный URL-адрес МОЖЕТ запускать сервер для вызова определенной функции и отправки ответа. Но вам нужно структурировать код URL и серверный код как таковой.
Я считаю, что существует фундаментальное непонимание того, как эта технология работает здесь.
AJAX (Javascript), Flash или любая клиентская технология не могут напрямую вызывать функции PHP (или другие языки, запущенные на сервере). Это верно и для других способов (например: PHP не может вызывать функции JS).
Клиентские и серверные коды находятся на разных компьютерах, и они обмениваются данными по протоколу HTTP (или что у вас есть). HTTP работает примерно так:
Клиент (например, браузер) отправляет запрос ЗАПРОС -> Сервер обрабатывает запрос и отправляет 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) , но они могут стать беспорядочными.
Если вы спрашиваете, можете ли вы вызвать любую произвольную функцию PHP с AJAX, ответ не будет *, по очевидным соображениям безопасности (в дополнение к техническим причинам). Вы можете сделать PHP-скрипт, который выполняет разные действия в зависимости от того, какой параметр он дал (например, выполнить одну функцию), если вы не хотите создавать несколько отдельных файлов.
* Хотя вы можете сделать скрипт, который будет выполнять любую произвольную команду PHP, поступающую от клиента, но это было бы очень, очень, очень неразумно.
Короткий ответ – «нет», но реальный ответ заключается в том, что вы можете подделать его . Ответ 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 и вернет значение.
Этот код, вероятно, не будет работать, потому что он не был протестирован, но это функция, которая создает функцию, которая вызовет сервер, а затем вернет значение. Для обработки более одного аргумента требуется больше работы.
Все, что сказало … по моему опыту, обычно полезно сделать все сетевые коммуникации явными, а не скрывать их как обычные функции.
вы можете достичь того же результата с помощью моста, например, моей библиотеки 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 от ответа Джона Каваками, используя phery:
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, вам нужен обратный вызов, но этого было бы достаточно.