sử dụng jquery $ .ajax để gọi một hàm PHP


118

Đây có thể là một câu trả lời đơn giản, nhưng tôi đang sử dụng $ .ajax của jQuery để gọi một tập lệnh PHP. Điều tôi muốn làm về cơ bản là đặt tập lệnh PHP đó bên trong một hàm và gọi hàm PHP từ javascript.

<?php 
if(isset($_POST['something'] {
    //do something
}
?>

đến cái này

<?php
function test() {
    if(isset($_POST['something'] {
         //do something. 
    }
}
?>

Làm cách nào để gọi hàm đó trong javascript? Hiện tại tôi chỉ đang sử dụng $ .ajax với tệp PHP được liệt kê.


6
Chuyển mã PHP do PHP tạo javascript để được đánh giá, hoặc làm theo cách khác, là một ý tưởng rất tồi.
Tyler Carter

Bạn có thể giải thích tại sao điều đó lại tệ không?
Catfish

3
Bởi vì BẤT CỨ AI có thể đặt BẤT KỲ mã nào thay cho mã của bạn và do đó họ có thể làm những điều xấu đối với máy chủ của bạn.
Tyler Carter

9
@ Chacha102: Bạn hoặc tôi không hiểu câu hỏi. Theo hiểu biết của tôi, anh ấy muốn thực hiện một cuộc gọi thủ tục từ xa.
Felix Kling

Một cuộc gọi thủ tục từ xa có thể được chấp nhận nếu bạn có một danh sách trắng hạn chế quyền truy cập vào tất cả các chức năng hoặc "thủ tục" được phép của bạn. Điều này sẽ không khó để thực hiện.
Xaxis

Câu trả lời:


228

Sử dụng $.ajaxđể gọi một ngữ cảnh máy chủ (hoặc URL, hoặc bất cứ thứ gì) để gọi một 'hành động' cụ thể. Những gì bạn muốn là một cái gì đó như:

$.ajax({ url: '/my/site',
         data: {action: 'test'},
         type: 'post',
         success: function(output) {
                      alert(output);
                  }
});

Ở phía máy chủ, actiontham số POST sẽ được đọc và giá trị tương ứng phải trỏ đến phương thức để gọi, ví dụ:

if(isset($_POST['action']) && !empty($_POST['action'])) {
    $action = $_POST['action'];
    switch($action) {
        case 'test' : test();break;
        case 'blah' : blah();break;
        // ...etc...
    }
}

Tôi tin rằng đó là một hiện thân đơn giản của Command pattern .


9
Gotcha. Vì vậy, bạn không thể chọn trực tiếp với js hàm nào để gọi trong PHP, bạn chỉ có thể sử dụng PHP để lấy giá trị bài đăng và gọi một hàm theo cách đó. Cảm ơn
Catfish

Nhưng điều này rất đơn giản nếu bạn đang sử dụng một khuôn khổ. với Kohana chẳng hạn, bạn có thể chỉ cần gọi controller / action ajax (function () {url: 'Controller / action.php',});
DeathCoder

1
@MrMesees Sẽ thật tuyệt nếu bạn chia sẻ những phương pháp hay nhất hiện đại đó với chúng tôi.
Francisco Romero

sử dụng API tìm nạp HTTP có thể dành cho giao diện người dùng JS, cũng như sử dụng các hứa hẹn. Đối với đầu vào làm sạch và lọc PHP, có thể sử dụng phần mềm trung gian để nó có thể được áp dụng cho nhiều điểm cuối. Tôi cho rằng quan trọng là nếu bạn muốn phản hồi của tôi không phải chờ đợi ~ 2 năm có thể là một lựa chọn tuyệt vời.
MrMesees

12

Tôi đã phát triển một plugin jQuery cho phép bạn gọi bất kỳ hàm PHP cốt lõi nào hoặc thậm chí là các hàm PHP do người dùng xác định dưới dạng các phương thức của plugin: jquery.php

Sau khi bao gồm jquery và jquery.php vào đầu tài liệu của chúng tôi và đặt request_handler.php trên máy chủ của chúng tôi, chúng tôi sẽ bắt đầu sử dụng plugin theo cách được mô tả bên dưới.

Để dễ sử dụng, hãy tham khảo hàm theo cách đơn giản:

    var P = $.fn.php;

Sau đó khởi tạo plugin:

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'
    }
});             

Và bây giờ là một số tình huống sử dụng:

// 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/"]

Trình diễn chuỗi hàm 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 );

Trình diễn việc gửi một khối mã giả 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 );

Cấu hình phụ trợ cung cấp một danh sách trắng để bạn có thể hạn chế những chức năng nào có thể được gọi. Có một số mẫu khác để làm việc với PHP cũng được mô tả bởi plugin.


5

Tôi sẽ gắn bó với cách tiếp cận thông thường để gọi tệp trực tiếp, nhưng nếu bạn thực sự muốn gọi một hàm, hãy xem JSON-RPC (JSON Remote Procedure Call).

Về cơ bản, bạn gửi một chuỗi JSON ở một định dạng cụ thể đến máy chủ, ví dụ:

{ "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}

trong đó bao gồm hàm để gọi và các tham số của hàm đó.

Tất nhiên máy chủ phải biết cách xử lý các yêu cầu đó.
Đây là plugin jQuery cho JSON-RPC và ví dụ: Máy chủ JSON Zend làm máy chủ triển khai trong PHP.


Điều này có thể là quá mức cần thiết cho một dự án nhỏ hoặc ít chức năng hơn. Cách dễ nhất là câu trả lời của karim . Mặt khác, JSON-RPC là một tiêu chuẩn.


4

Bạn không thể gọi một hàm PHP bằng Javascript, cũng giống như cách bạn không thể gọi các hàm PHP tùy ý khi tải một trang (chỉ cần nghĩ đến các hàm ý bảo mật).

Nếu bạn cần bọc mã của mình trong một hàm vì bất kỳ lý do gì, tại sao bạn không đặt một lệnh gọi hàm dưới định nghĩa hàm, ví dụ:

function test() {
    // function code
}

test();

Hoặc, sử dụng PHP bao gồm:

include 'functions.php'; // functions.php has the test function
test();

3

Bạn sẽ phải hiển thị và điểm cuối (URL) trong hệ thống của bạn sẽ chấp nhận yêu cầu ĐĂNG từ lệnh gọi ajax trong jQuery.

Sau đó, khi xử lý url đó từ PHP, bạn sẽ gọi hàm của mình và trả về kết quả ở định dạng thích hợp (rất có thể là JSON hoặc XML nếu bạn thích).


3

Bạn có thể sử dụng thư viện của tôi để thực hiện điều đó tự động, tôi đã cải thiện nó trong 2 năm qua 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 sẽ đơn giản như

phery.remote('phpfunction');

Bạn có thể chuyển tất cả phần javascript động đến máy chủ, với trình tạo truy vấn như giao diện có thể điều khiển và bạn có thể chuyển bất kỳ loại dữ liệu nào trở lại PHP. Ví dụ: một số hàm chiếm quá nhiều dung lượng trong javascript, có thể được gọi trong máy chủ bằng cách sử dụng điều này (trong ví dụ này là mcrypt, trong javascript hầu như không thể thực hiện được):

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');

và trong máy chủ

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();

Bây giờ di variablechúc có dữ liệu được mã hóa.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.