Thực thi hàm PHP với onclick


92

Tôi đang tìm kiếm một giải pháp đơn giản để chỉ gọi một hàm PHP khi một thẻ được nhấp vào.

PHP:

function removeday() { ... }

HTML:

<a href="" onclick="removeday()" class="deletebtn">Delete</a>

CẬP NHẬT: mã html và PHP nằm trong cùng một tệp PHP


5
HTML chạy các hàm Javascript, chạy trên máy khách. PHP chạy trên máy chủ. Bạn cần tìm hiểu về AJAX.
Barmar

nhưng tại sao lại là AJAX? toàn bộ mã nằm trong cùng một tệp PHP.
Mike

1
Tại sao AJAX? Chà, để tìm ra điều đó, bạn chỉ cần chạy bất kỳ tập lệnh php nào và xem mã thực thi của nó. Một lần nữa - Ajax là cách duy nhất bạn có thể làm điều đó .
Yang

2
Câu trả lời đã chọn sẽ trông giống như một nút nếu bạn sử dụng <a role="button" href="?action=removeday" class="debatebtn">Delete</a>nơi bắt hành động và chạy hàm removeay () tương tự như if($action == 'removeday'){ removeday(); }. Tôi biết điều này là muộn, nhưng tôi nghĩ nó vẫn có thể giúp ai đó về vấn đề này. C§
CSS

Câu trả lời:


142

Trước tiên, hãy hiểu rằng bạn có ba ngôn ngữ hoạt động cùng nhau:

  • PHP: Nó chỉ chạy bởi máy chủ và phản hồi các yêu cầu như nhấp vào liên kết (GET) hoặc gửi biểu mẫu (POST).

  • HTML & JavaScript: Nó chỉ chạy trong trình duyệt của ai đó (không bao gồm NodeJS).

Tôi giả sử tệp của bạn trông giống như sau:

<!DOCTYPE HTML>
<html>
<?php
  function runMyFunction() {
    echo 'I just ran a php function';
  }

  if (isset($_GET['hello'])) {
    runMyFunction();
  }
?>

Hello there!
<a href='index.php?hello=true'>Run PHP Function</a>
</html>

Vì PHP chỉ phản hồi các yêu cầu (GET, POST, PUT, PATCH và DELETE qua $ _REQUEST), đây là cách bạn phải chạy một hàm PHP mặc dù chúng nằm trong cùng một tệp. Điều này cung cấp cho bạn một mức độ bảo mật, "Tôi có nên chạy tập lệnh này cho người dùng này hay không?".

Nếu bạn không muốn làm mới trang, bạn có thể đưa ra yêu cầu đối với PHP mà không cần làm mới thông qua một phương thức có tên là JavaScript và XML không đồng bộ (AJAX).

Đó là thông tin bạn có thể tra cứu trên YouTube. Chỉ cần tìm kiếm "jquery ajax"

Tôi giới thiệu Laravel cho bất kỳ ai mới bắt đầu ngay: http://laravel.com/


3
Chỉ cần đề cập, tôi cho rằng bạn còn khá mới với PHP, tôi muốn giới thiệu laravel.com như một khung công tác. Cá nhân tôi rất muốn bỏ qua toàn bộ 'học php chung chung' và chuyển thẳng đến một khuôn khổ mạnh mẽ. Đây là cái tôi cũng sử dụng bây giờ.
Michael J. Calkins

5
Trời ạ, cảm ơn bạn rất nhiều, câu trả lời của bạn không chỉ giúp tôi giải đáp thắc mắc này mà còn khiến tôi hiểu php hơn rất nhiều! Cám ơn bạn một lần nữa!
Feel The Noise

Cảm ơn tôi đang tìm kiếm điều này. Làm thế nào tôi có thể thực hiện điều này với wordpress
Firefog

1
Cảm ơn bạn, tôi sẽ bắt đầu tập trung vào laravel vì bạn đã đề cập đến.
Mohamed Abulnasr

1
If you don't want to refresh the page, you can make a request to PHP without refreshing via a method called Asynchronous JavaScript and XML (AJAX).Vâng, anh ấy đã đưa onclickvào câu hỏi, vì vậy rõ ràng mục tiêu là thực hiện một hành động mà không cần làm mới. ¬_¬
Synetech

38

Trong javascript, hãy tạo một hàm ajax,

function myAjax() {
      $.ajax({
           type: "POST",
           url: 'your_url/ajax.php',
           data:{action:'call_this'},
           success:function(html) {
             alert(html);
           }

      });
 }

Sau đó gọi từ html,

<a href="" onclick="myAjax()" class="deletebtn">Delete</a>

Và trong ajax.php của bạn,

if($_POST['action'] == 'call_this') {
  // call removeday() here
}

Chỉ cần làm rõ: typenên được sử dụng trong jQuery trước 1.9.0, trong khi đó methodlà một bí danh và nên được sử dụng trên các phiên bản mới hơn.
Alejandro Nava

1
Giải pháp tương tự cũng được cung cấp trong Vanilla JavaScript giúp người mới bắt đầu tốt hơn nhiều. Tôi nói điều này với tư cách là một người dùng JavaScript có kinh nghiệm hơn, người đã từng là người mới bắt đầu hoàn chỉnh nhưng thành thạo với PHP.
Ken Ingram

11

Bạn sẽ phải thực hiện việc này thông qua AJAX . Tôi NẶNG LỰC khuyên bạn nên sử dụng jQuery để giúp bạn dễ dàng hơn ....

$("#idOfElement").on('click', function(){

    $.ajax({
       url: 'pathToPhpFile.php',
       dataType: 'json',
       success: function(data){
            //data returned from php
       }
    });
)};

http://api.jquery.com/jQuery.ajax/


1
tại sao AJAX? nó sẽ là cùng một tệp PHP (tôi đã cập nhật câu hỏi của mình)
Mike

3
Vì những gì @Barmar giải thích, nó không hoạt động như vậy. Bạn sẽ muốn đặt php trong một tệp riêng biệt, sau đó tham chiếu tệp đó trong yêu cầu AJAX của bạn.
AO

1
Tham số "url:" tham chiếu đến tệp php bên ngoài, làm cách nào để tôi có thể tham chiếu hàm php trong cùng một tệp?
Joe Doe

2
@JoeDoe bạn không thể, đặt các chức năng trong một tập tin bên ngoài
AO

11

Nó có thể được thực hiện và với php khá đơn giản nếu đây là nút của bạn

<input type="submit" name="submit>

và đây là mã php của bạn

if(isset($_POST["submit"])) { php code here }

mã nhận được được gọi khi gửi nhận được đăng xảy ra khi nút được nhấp.


1

Hãy thử làm điều gì đó như sau:

<!--Include jQuery-->
<script type="text/javascript" src="jquery.min.js"></script> 

<script type="text/javascript"> 
function doSomething() { 
    $.get("somepage.php"); 
    return false; 
} 
</script>

<a href="#" onclick="doSomething();">Click Me!</a>

1

Giải pháp mà không cần tải lại trang

<?php
  function removeday() { echo 'Day removed'; }

  if (isset($_GET['remove'])) { return removeday(); }
?>


<!DOCTYPE html><html><title>Days</title><body>

  <a href="" onclick="removeday(event)" class="deletebtn">Delete</a>

  <script>
  async function removeday(e) {
    e.preventDefault(); 
    document.body.innerHTML+= '<br>'+ await(await fetch('?remove=1')).text();
  }
  </script>

</body></html>

0

Đây là cách dễ nhất có thể. Nếu biểu mẫu được gửi qua bưu điện, hãy thực hiện chức năng php. Lưu ý rằng nếu bạn muốn thực hiện chức năng không đồng bộ (không cần tải lại trang), thì bạn sẽ cần AJAX.

<form method="post">
    <button name="test">test</button>
</form>

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

Note that if you want to perform function asynchronously (without the need to reload the page), then you'll need AJAX.Chà onclicksẽ cho thấy đó chính xác là những gì anh ta muốn. ¬_¬
Synetech

0

Đây là một giải pháp thay thế với AJAX nhưng không có jQuery, chỉ là JavaScript thông thường:

Thêm điều này vào trang php đầu tiên / chính, nơi bạn muốn gọi hành động từ đó, nhưng thay đổi nó từ một athẻ tiềm năng (siêu liên kết) thành một buttonphần tử, để nó không bị bất kỳ bot hoặc ứng dụng độc hại nào (hoặc bất kỳ thứ gì) nhấp vào.

<head>
<script>
  // function invoking ajax with pure javascript, no jquery required.
  function myFunction(value_myfunction) {
    var xmlhttp = new XMLHttpRequest();
    xmlhttp.onreadystatechange = function() {
      if (this.readyState == 4 && this.status == 200) {
        document.getElementById("results").innerHTML += this.responseText; 
        // note '+=', adds result to the existing paragraph, remove the '+' to replace.
      }
    };
    xmlhttp.open("GET", "ajax-php-page.php?sendValue=" + value_myfunction, true);
    xmlhttp.send();
  }

</script>
</head>

<body>

  <?php $sendingValue = "thevalue"; // value to send to ajax php page. ?> 

  <!-- using button instead of hyperlink (a) -->
  <button type="button" onclick="value_myfunction('<?php echo $sendingValue; ?>');">Click to send value</button>

  <h4>Responses from ajax-php-page.php:</h4>
  <p id="results"></p> <!-- the ajax javascript enters returned GET values here -->

</body>

Khi buttonđược nhấp vào, hãy onclicksử dụng hàm javascript của head để gửi$sendingValue qua ajax đến một trang php khác, giống như nhiều ví dụ trước trang này. Trang kia ajax-php-page.php, kiểm tra giá trị GET và trả về print_r:

<?php

  $incoming = $_GET['sendValue'];

  if( isset( $incoming ) ) {
    print_r("ajax-php-page.php recieved this: " . "$incoming" . "<br>");
  } else {
    print_r("The request didn´t pass correctly through the GET...");
  }

?>

Phản hồi từ print_r sau đó được trả lại và hiển thị với

document.getElementById("results").innerHTML += this.responseText;

Các +=populates và thêm vào các yếu tố html hiện có, loại bỏ các +chỉ cập nhật và thay thế các nội dung hiện có của html pyếu tố"results" .


-3

Hãy thử nó sẽ hoạt động tốt.

<script>
function echoHello(){
 alert("<?PHP hello(); ?>");
 }
</script>

<?PHP
FUNCTION hello(){
 echo "Call php function on onclick event.";
 }

?>

<button onclick="echoHello()">Say Hello</button>

2
Điều đó không hiệu quả (ngay cả khi bạn làm sạch nó), nhưng hơn nữa, nó không thể hoạt động. Mã PHP được xử lý trước khi tải; nó không chạy trong thời gian chạy.
Synetech

Có thể bạn đã không đọc câu hỏi hoặc bạn không kiểm tra mã của mình vì điều này sẽ không hoạt động.
Mr PizzaGuy
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.