이것은 간단한 대답 일 수 있지만 jQuery의 $ .ajax를 사용하여 PHP 스크립트를 호출하고 있습니다. 내가하고 싶은 것은 기본적으로 PHP 스크립트를 함수 안에 넣고 자바 스크립트에서 PHP 함수를 호출하는 것입니다.
<?php
if(isset($_POST['something'] {
//do something
}
?>
이에
<?php
function test() {
if(isset($_POST['something'] {
//do something.
}
}
?>
자바 스크립트에서 그 함수를 어떻게 호출합니까? 지금은 PHP 파일이 나열된 $ .ajax를 사용하고 있습니다.
답변
사용하여 $.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 패턴 의 단순한 화신이라고 믿습니다 .
답변
핵심 PHP 함수 또는 사용자 정의 PHP 함수를 플러그인의 메소드로 호출 할 수있는 jQuery 플러그인을 개발했습니다. 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 );
PHP 의사 코드의 JSON 블록 전송 시연 :
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 원격 프로 시저 호출)를 살펴보십시오 .
기본적으로 특정 형식의 JSON 문자열을 서버에 보냅니다.
{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
여기에는 호출 할 함수와 해당 함수의 매개 변수가 포함됩니다.
물론 서버는 이러한 요청을 처리하는 방법을 알아야합니다.
다음은 JSON-RPC 용 jQuery 플러그인 과 예를 들어 PHP에서 서버 구현으로서 Zend JSON Server 입니다.
이것은 소규모 프로젝트 또는 기능이 적은 경우 과잉 일 수 있습니다. 가장 쉬운 방법은 카림의 대답 입니다. 반면 JSON-RPC는 표준입니다.
답변
페이지를로드 할 때 임의의 PHP 함수를 호출 할 수없는 것과 같은 방식으로 Javascript로 PHP 함수를 호출 할 수 없습니다 (보안 관련 사항을 생각해보십시오).
어떤 이유로 든 함수에 코드를 래핑해야하는 경우 함수 정의 아래에 함수 호출을 두는 것이 좋습니다. 예 :
function test() {
// function code
}
test();
또는 PHP 포함을 사용하십시오.
include 'functions.php'; // functions.php has the test function
test();
답변
jQuery의 ajax 호출에서 POST 요청을 수락하는 시스템에서 엔드 포인트 (URL)를 노출해야합니다.
그런 다음 PHP에서 해당 URL을 처리 할 때 함수를 호출하고 결과를 적절한 형식 (대부분의 경우 JSON 또는 원하는 경우 XML)으로 반환합니다.
답변
자동으로 수행하는 내 라이브러리를 사용할 수 있으며 지난 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();
자바 스크립트는 다음과 같이 간단합니다.
phery.remote('phpfunction');
체인 가능한 인터페이스와 같은 쿼리 작성기를 사용하여 모든 동적 자바 스크립트 부분을 서버에 전달할 수 있으며 모든 유형의 데이터를 PHP로 다시 전달할 수 있습니다. 예를 들어, 자바 스크립트 측에서 너무 많은 공간을 차지하는 일부 함수는 다음을 사용하여 서버에서 호출 될 수 있습니다 (이 예에서는 mcrypt, 자바 스크립트에서 수행하기 거의 불가능합니다).
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
암호화 된 데이터를 갖게됩니다.