เรียกใช้ฟังก์ชัน PHP ด้วย onclick


92

ฉันกำลังค้นหาวิธีง่ายๆในการเรียกใช้ฟังก์ชัน PHPเฉพาะเมื่อมีการคลิกa-tag

PHP:

function removeday() { ... }

HTML:

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

อัปเดต:โค้ด html และ PHP อยู่ในไฟล์ PHP เดียวกัน


5
HTML เรียกใช้ฟังก์ชัน Javascript ซึ่งทำงานบนไคลเอนต์ PHP ทำงานบนเซิร์ฟเวอร์ คุณต้องเรียนรู้เกี่ยวกับ AJAX
Barmar

แต่ทำไม AJAX? โค้ดทั้งหมดอยู่ในไฟล์ PHP เดียวกัน
Mike

1
ทำไมต้อง AJAX เพื่อที่จะทราบว่าคุณสามารถเรียกใช้สคริปต์ php ใดก็ได้และดูรหัสของการดำเนินการ อีกครั้ง - อาแจ็กซ์เป็นวิธีเดียวที่คุณสามารถทำได้
ยาง

2
คำตอบการตรวจสอบจะทำงานออกมามองเช่นปุ่มถ้าคุณใช้<a role="button" href="?action=removeday" class="debatebtn">Delete</a>การกระทำที่ถูกจับได้และวิ่ง removeday () if($action == 'removeday'){ removeday(); }ฟังก์ชั่นที่คล้ายกับ ฉันรู้ว่ามันช้าไป แต่ฉันคิดว่ามันยังสามารถช่วยคนอื่นในเรื่องนี้ได้ C§
CSS

คำตอบ:


142

ขั้นแรกเข้าใจว่าคุณมีสามภาษาที่ทำงานร่วมกัน:

  • PHP: ทำงานโดยเซิร์ฟเวอร์และตอบสนองต่อคำขอเช่นคลิกที่ลิงค์ (GET) หรือส่งแบบฟอร์ม (POST)

  • HTML & JavaScript: ทำงานในเบราว์เซอร์ของผู้อื่นเท่านั้น (ยกเว้น NodeJS)

ฉันสมมติว่าไฟล์ของคุณมีลักษณะดังนี้:

<!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>

เนื่องจาก PHP ตอบสนองต่อคำขอเท่านั้น (GET, POST, PUT, PATCH และ DELETE ผ่าน $ _REQUEST) นี่คือวิธีที่คุณต้องเรียกใช้ฟังก์ชัน PHP แม้ว่าจะอยู่ในไฟล์เดียวกันก็ตาม ซึ่งจะช่วยให้คุณมีระดับความปลอดภัย "ฉันควรเรียกใช้สคริปต์นี้สำหรับผู้ใช้รายนี้หรือไม่"

หากคุณไม่ต้องการรีเฟรชหน้านี้คุณสามารถขอ PHP ได้โดยไม่ต้องรีเฟรชด้วยวิธีการที่เรียกว่า Asynchronous JavaScript และ XML (AJAX)

นั่นคือสิ่งที่คุณสามารถค้นหาได้ใน YouTube เพียงค้นหา "jquery ajax"

ฉันแนะนำ Laravel ให้กับทุกคนที่เพิ่งเริ่มต้นได้ทันที: http://laravel.com/


3
ฉันคิดว่าคุณค่อนข้างใหม่กับ PHP ฉันอยากจะแนะนำlaravel.comเป็นเฟรมเวิร์ก โดยส่วนตัวแล้วฉันชอบที่จะข้าม 'การเรียนรู้ php ทั่วไป' ทั้งหมดและตรงไปยังกรอบที่มีประสิทธิภาพ นี่คือสิ่งที่ฉันใช้ตอนนี้เช่นกัน
Michael J.Calkins

5
ขอบคุณมากคำตอบของคุณไม่เพียงช่วยให้ฉันคลายข้อสงสัยนี้ แต่ยังทำให้ฉันเข้าใจ php ดีขึ้นมาก! ขอขอบคุณอีกครั้ง!
Feel The Noise

ขอบคุณฉันกำลังมองหาสิ่งนี้ ฉันจะนำสิ่งนี้ไปใช้กับ wordpress ได้อย่างไร
Firefog

1
ขอบคุณฉันจะเริ่มมีสมาธิกับ laravel เพราะการพูดถึงของคุณ
Mohamed Abulnasr

2
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).เขารวมonclickไว้ในคำถามด้วยดังนั้นจึงค่อนข้างชัดเจนว่าเป้าหมายคือการดำเนินการโดยไม่รีเฟรช ¬_¬
Synetech

39

ในจาวาสคริปต์ให้สร้างฟังก์ชัน ajax

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

      });
 }

จากนั้นโทรจาก html

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

และใน ajax.php ของคุณ

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

เพียงเพื่อชี้แจง: typeควรใช้ใน jQuery ก่อนหน้า 1.9.0 ในขณะที่methodเป็นนามแฝงและควรใช้กับเวอร์ชันที่ใหม่กว่า
Alejandro Nava

1
โซลูชันเดียวกันที่มีให้ใน Vanilla JavaScript ช่วยให้ผู้เริ่มต้นดีขึ้นมาก ฉันพูดแบบนี้ในฐานะผู้ใช้ JavaScript ที่มีประสบการณ์มากขึ้นซึ่งครั้งหนึ่งเคยเป็นผู้เริ่มต้นที่สมบูรณ์ แต่เชี่ยวชาญกับ PHP
Ken Ingram

12

สามารถทำได้และด้วย php ที่ค่อนข้างง่ายหากนี่คือปุ่มของคุณ

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

และนี่คือรหัส php ของคุณ

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

รหัสถูกเรียกเมื่อโพสต์ของ submit get ซึ่งจะเกิดขึ้นเมื่อคลิกปุ่ม


11

คุณจะต้องทำเช่นนี้ผ่านAJAX ฉันขอแนะนำให้คุณใช้ jQuery เพื่อทำให้สิ่งนี้ง่ายขึ้นสำหรับคุณ ....

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

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

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


1
ทำไมต้อง AJAX มันจะเป็นไฟล์ PHP เดียวกัน (ฉันอัปเดตคำถามแล้ว)
Mike

3
เพราะสิ่งที่ @Barmar อธิบายมันไม่ได้เป็นเช่นนั้น คุณจะต้องวาง php ในไฟล์แยกต่างหากจากนั้นอ้างอิงไฟล์นั้นในคำขอ AJAX ของคุณ
AO

1
พารามิเตอร์ "url:" อ้างอิงไฟล์ php ภายนอกฉันจะอ้างอิงฟังก์ชัน php ในไฟล์เดียวกันได้อย่างไร
Joe Doe

2
@JoeDoe คุณไม่สามารถวางฟังก์ชันในไฟล์ภายนอกได้
AO

2

วิธีแก้ไขโดยไม่ต้องโหลดหน้าซ้ำ

<?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>

1

ลองทำสิ่งนี้:

<!--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

นี่เป็นทางเลือกอื่นสำหรับ AJAX แต่ไม่มี jQuery เพียงแค่ JavaScript ปกติ:

เพิ่มสิ่งนี้ลงในหน้า php แรก / หลักซึ่งคุณต้องการเรียกการดำเนินการจาก แต่เปลี่ยนจากaแท็กที่เป็นไปได้ (ไฮเปอร์ลิงก์) เป็นbuttonองค์ประกอบดังนั้นบอทหรือแอปที่เป็นอันตรายจะไม่คลิก (หรืออะไรก็ตาม)

<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>

เมื่อbuttonคลิกแล้วให้onclickใช้ฟังก์ชัน head js javascript เพื่อส่ง$sendingValueผ่าน ajax ไปยัง php-page อื่น ๆ ดังตัวอย่างก่อนหน้านี้ อีกหน้าหนึ่งajax-php-page.phpตรวจสอบค่า GET และส่งกลับด้วย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...");
  }

?>

การตอบกลับจากprint_rนั้นจะถูกส่งกลับและแสดงด้วย

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

+=populates และเพิ่มองค์ประกอบ html ที่มีอยู่เอา+การปรับปรุงเพียงและแทนที่เนื้อหาที่มีอยู่ของของ html องค์ประกอบp"results"


0

นี่เป็นวิธีที่ง่ายที่สุดที่เป็นไปได้ หากโพสต์แบบฟอร์มผ่านโพสต์ให้ทำฟังก์ชัน php โปรดทราบว่าหากคุณต้องการใช้ฟังก์ชันแบบอะซิงโครนัส (โดยไม่จำเป็นต้องโหลดหน้าซ้ำ) คุณจะต้องมี 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.ดีonclickจะแสดงให้เห็นว่าสิ่งที่เขาต้องการ ¬_¬
Synetech

-3

ลองใช้วิธีนี้จะได้ผล

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

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

?>

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

2
ไม่ได้ผล (แม้ว่าคุณจะทำความสะอาดแล้วก็ตาม) แต่ยิ่งไปกว่านั้นก็ไม่สามารถทำงานได้ โค้ด PHP ได้รับการประมวลผลล่วงหน้าเมื่อโหลด มันไม่ทำงานที่รันไทม์
Synetech

คุณไม่ได้อ่านคำถามหรือไม่ได้ทดสอบโค้ดเพราะจะไม่ได้ผล
Mr PizzaGuy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.