Gọi hàm php từ JavaScript


80

Có cách nào tôi có thể chạy một hàm php thông qua một hàm JS không?

một cái gì đó như thế này:

<script type="text/javascript">
function test(){
document.getElementById("php_code").innerHTML="<?php 
query("hello");       ?>";    
}
</script>

<a href="#" style="display:block; color:#000033; font-family:Tahoma; font-size:12px;"     
onclick="test(); return false;"> test </a>
<span id="php_code"> </span>

Về cơ bản tôi muốn chạy hàm php query("hello"), khi tôi nhấp vào href có tên "Kiểm tra" sẽ gọi hàm php.


4
đơn giản là không, không có cách nào để làm điều này, ngoại trừ việc gọi phương thức được yêu cầu bằng ajax.
TheVillageIdiot

9
Bạn biết không: PHP chạy trên máy chủ, nhưng JS trên máy khách? Điều này không thể hoạt động theo cách này.
KingCrunch

Chờ đã, <?php query("hello"); ?>php không hiển thị khi trang được tải? nếu có thì anh ta có thể nhận được đầu ra của query("hello")hàm js.
TheVillageIdiot

Tôi biết các mã trên là sai, nhưng tôi chỉ sử dụng nó để hiển thị những gì tôi muốn
Jason Russell

1
có thể trùng lặp các chức năng Javascript và PHP
Mark Biek

Câu trả lời:


144

Về bản chất, đây là mục đích của AJAX . Trang của bạn tải và bạn thêm một sự kiện vào một phần tử. Khi người dùng làm cho sự kiện được kích hoạt, giả sử bằng cách nhấp vào một cái gì đó, Javascript của bạn sử dụng đối tượng XMLHttpRequest để gửi yêu cầu đến máy chủ.

Sau khi máy chủ phản hồi (có thể là với đầu ra), một hàm / sự kiện Javascript khác cung cấp cho bạn một nơi để làm việc với đầu ra đó, bao gồm việc chỉ cần dán nó vào trang như bất kỳ đoạn HTML nào khác.

Bạn có thể làm điều đó "bằng tay" với Javascript đơn giản hoặc bạn có thể sử dụng jQuery. Tùy thuộc vào quy mô dự án của bạn và tình huống cụ thể, có thể đơn giản hơn nếu chỉ sử dụng Javascript thuần túy.

Javascript thuần túy

Trong ví dụ rất cơ bản này, chúng tôi gửi một yêu cầu myAjax.phpkhi người dùng nhấp vào một liên kết. Máy chủ sẽ tạo ra một số nội dung, trong trường hợp này là "hello world!". Chúng tôi sẽ đưa vào phần tử HTML với id output.

Javascript

// handles the click event for link 1, sends the query
function getOutput() {
  getRequest(
      'myAjax.php', // URL for the PHP file
       drawOutput,  // handle successful request
       drawError    // handle error
  );
  return false;
}  
// handles drawing an error message
function drawError() {
    var container = document.getElementById('output');
    container.innerHTML = 'Bummer: there was an error!';
}
// handles the response, adds the html
function drawOutput(responseText) {
    var container = document.getElementById('output');
    container.innerHTML = responseText;
}
// helper function for cross-browser request object
function getRequest(url, success, error) {
    var req = false;
    try{
        // most browsers
        req = new XMLHttpRequest();
    } catch (e){
        // IE
        try{
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch(e) {
            // try an older version
            try{
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch(e) {
                return false;
            }
        }
    }
    if (!req) return false;
    if (typeof success != 'function') success = function () {};
    if (typeof error!= 'function') error = function () {};
    req.onreadystatechange = function(){
        if(req.readyState == 4) {
            return req.status === 200 ? 
                success(req.responseText) : error(req.status);
        }
    }
    req.open("GET", url, true);
    req.send(null);
    return req;
}

HTML

<a href="#" onclick="return getOutput();"> test </a>
<div id="output">waiting for action</div>

PHP

// file myAjax.php
<?php
  echo 'hello world!';
?>

Hãy dùng thử: http://jsfiddle.net/GRMule/m8CTk/


Với thư viện javascript (jQuery et al)

Có thể cho rằng, đó là rất nhiều mã Javascript. Tất nhiên, bạn có thể rút ngắn điều đó bằng cách thắt chặt các khối hoặc sử dụng các toán tử logic ngắn gọn hơn, nhưng vẫn còn rất nhiều điều xảy ra ở đó. Nếu bạn có kế hoạch thực hiện nhiều việc kiểu này trong dự án của mình, bạn có thể tốt hơn với thư viện javascript.

Sử dụng cùng một HTML và PHP ở trên, đây là toàn bộ tập lệnh của bạn (với jQuery được bao gồm trên trang). Tôi đã thắt chặt mã một chút để phù hợp hơn với phong cách chung của jQuery, nhưng bạn có ý tưởng:

// handles the click event, sends the query
function getOutput() {
   $.ajax({
      url:'myAjax.php',
      complete: function (response) {
          $('#output').html(response.responseText);
      },
      error: function () {
          $('#output').html('Bummer: there was an error!');
      }
  });
  return false;
}

Hãy dùng thử: http://jsfiddle.net/GRMule/WQXXT/

Đừng vội sử dụng jQuery: việc thêm bất kỳ thư viện nào vẫn đang thêm hàng trăm hoặc hàng nghìn dòng mã vào dự án của bạn chắc chắn như thể bạn đã viết chúng. Bên trong tệp thư viện jQuery, bạn sẽ tìm thấy mã tương tự như mã trong ví dụ đầu tiên, cộng với nhiều mã khác . Đó có thể là một điều tốt, nó có thể không. Lập kế hoạch và xem xét quy mô hiện tại của dự án và khả năng mở rộng trong tương lai và môi trường hoặc nền tảng mục tiêu.

Nếu đây là tất cả những gì bạn cần làm, hãy viết javascript thuần túy một lần và bạn đã hoàn tất.

Tài liệu


3
-1, một nửa câu trả lời, OP hỏi cách gọi một hàm php từ javascript. Pou chỉ cho biết cách gọi một TRANG php. Bạn cần thêm các biến bài đăng trong lệnh gọi ajax và kiểm tra php cho các biến bài đăng đó và sau đó gọi hàm php đó nếu các biến bài đăng đó tồn tại.
MH

6
@Hanoncs Với khả năng sắp xếp gần như vô hạn của mã phía máy chủ, tôi không thể đoán được OP đang sử dụng kiến ​​trúc gì. Nó cũng không phải là điều sai trái đối với câu lệnh vấn đề ngay lập tức, vì OP không tham chiếu đến POST (hoặc GET) hoặc nhu cầu chuyển các giá trị. Tôi nghĩ phiếu phản đối của bạn được đặt không đúng chỗ, và tôi sẽ không thêm vào câu trả lời của mình suy đoán tùy tiện về một chủ đề không có trong OP. Cảm ơn vì đã phản hồi.
Chris Baker

Khi tôi sử dụng mã của bạn, tôi gặp lỗi do sử dụng "var" ở phía trước khai báo hàm. Loại bỏ "var" và nó hoạt động.
Jayden Lawson

16

PHP được đánh giá tại máy chủ; javascript được đánh giá tại máy khách / trình duyệt, do đó bạn không thể gọi trực tiếp một hàm PHP từ javascript . Nhưng bạn có thể đưa ra một yêu cầu HTTP tới máy chủ sẽ kích hoạt một hàm PHP, với AJAX.


3
@Hanoncs: Đây câu trả lời. OP đã hỏi liệu bạn có thể thực thi một hàm PHP thông qua JS hay không. Câu trả lời là - bạn không thể . Nếu anh ta hỏi liệu bạn có thể đưa ra một yêu cầu HTTP khiến máy chủ web kích hoạt một tập lệnh PHP sẽ chạy một hàm PHP hay không - thì có - điều đó là có thể. Nhưng anh ấy không yêu cầu điều này, tôi không viết dữ liệu không liên quan.
Dor

8
Haha đi nào, bạn biết đó là ý của OP trong câu hỏi của anh ấy. nếu anh ta biết cách giải thích nó chính xác như vậy thì anh ta đã biết cách làm.
MH

11

Cách duy nhất để thực thi PHP từ JS là AJAX. Bạn có thể gửi dữ liệu đến máy chủ (ví dụ: GET /ajax.php?do=someFunction) sau đó trong ajax.php bạn viết:

function someFunction() {
    echo 'Answer';
}

if ($_GET['do'] === "someFunction") {
    someFunction();
}

và sau đó, bắt câu trả lời với JS (tôi đang sử dụng jQuery để thực hiện các yêu cầu AJAX)

Có lẽ bạn sẽ cần một số định dạng câu trả lời. Xem JSON hoặc XML, nhưng JSON rất dễ sử dụng với JavaScript. Trong PHP, bạn có thể sử dụng hàm json_encode ($ array); lấy mảng làm đối số.


3

Gần đây tôi đã xuất bản một plugin jQuery cho phép bạn thực hiện các lệnh gọi hàm PHP theo nhiều cách khác nhau: https://github.com/Xaxis/jquery.php

Cách sử dụng ví dụ đơn giản:

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

4
Ngoài sự thiên vị rõ ràng mà mọi người có khi gọi các hàm PHP qua JavaScript, hãy giải thích cho tôi chính xác lý do tại sao câu trả lời của tôi lại bị bỏ phiếu nhiều như vậy? Tôi đang trả lời một cách hợp pháp câu hỏi cùng một giải pháp, phải không?
Xaxis
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.