использование jquery $.ajax для вызова функции PHP
Это может быть простым ответом, но я использую $.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 answers
Используйте $.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...
}
}
Я разработал плагин 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, описанных плагином.
Я бы придерживался обычного подхода для прямого вызова файла, но если вы действительно хотите вызвать функцию, взгляните на JSON-RPC (JSON-RPC) ( Удаленный вызов процедуры JSON).
Вы в основном отправляете строку JSON в определенном формате на сервер, например
{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
, который включает вызываемую функцию и параметры этой функции.
Конечно, сервер должен знать, как обрабатывать такие запросы.
Вот плагин jQuery для JSON-RPC и например, Сервер Zend JSON как реализация сервера в PHP.
Это может быть излишним для небольшого проекта или меньшего количества функций. Самым простым способом был бы ответ карима. С другой стороны, JSON-RPC является стандартом.
Вы не можете вызвать функцию PHP с помощью Javascript, точно так же, как вы не можете вызывать произвольные функции PHP при загрузке страницы (просто подумайте о последствиях для безопасности).
Если вам по какой-либо причине нужно обернуть свой код в функцию, почему бы вам также не поместить вызов функции под определение функции, например:
function test() {
// function code
}
test();
Или используйте PHP, включающий:
include 'functions.php'; // functions.php has the test function
test();
Вы можете использовать мою библиотеку, которая делает это автоматически, я улучшал ее в течение последних 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
будут зашифрованные данные.
Вам придется предоставить и конечную точку (URL) в вашей системе, которая примет запрос POST от вызова ajax в jQuery.
Затем, при обработке этого URL-адреса с PHP, вы вызовете свою функцию и вернете результат в соответствующем формате (скорее всего, JSON или XML, если вы предпочитаете).