Wykonaj funkcję PHP za pomocą onclick

92

Szukam prostego rozwiązania, aby wywołać funkcję PHP tylko po kliknięciu tagu .

PHP:

function removeday() { ... }

HTML:

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

UPDATE: kod html i PHP znajdują się w tym samym pliku PHP

Mikrofon
źródło
5
HTML uruchamia funkcje Javascript, które działają na kliencie. PHP działa na serwerze. Musisz nauczyć się AJAX.
Barmar
ale dlaczego AJAX? cały kod znajduje się w tym samym pliku PHP.
Mike,
1
Dlaczego AJAX? Aby to sprawdzić, wystarczy uruchomić dowolny skrypt php i zobaczyć kod jego wykonania. Ponownie - Ajax to jedyny sposób, w jaki możesz to zrobić .
Yang
2
Zaznaczona odpowiedź będzie wyglądać jak przycisk, jeśli użyjesz <a role="button" href="?action=removeday" class="debatebtn">Delete</a>miejsca, w którym akcja jest przechwycona, i uruchomisz funkcję removeay () podobną do if($action == 'removeday'){ removeday(); }. Wiem, że to późno, ale myślę, że nadal może pomóc komuś z tym problemem. C§
CSS

Odpowiedzi:

142

Po pierwsze, zrozum, że masz trzy języki współpracujące:

  • PHP: Działa tylko przez serwer i odpowiada na żądania, takie jak kliknięcie linku (GET) lub przesłanie formularza (POST).

  • HTML i JavaScript: działa tylko w czyjejś przeglądarce (z wyłączeniem NodeJS).

Zakładam, że twój plik wygląda mniej więcej tak:

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

Ponieważ PHP odpowiada tylko na żądania (GET, POST, PUT, PATCH i DELETE za pośrednictwem $ _REQUEST), w ten sposób musisz uruchomić funkcję PHP, nawet jeśli znajdują się one w tym samym pliku. Zapewnia to poziom bezpieczeństwa: „Czy powinienem uruchomić ten skrypt dla tego użytkownika, czy nie?”.

Jeśli nie chcesz odświeżać strony, możesz wysłać żądanie do PHP bez odświeżania za pomocą metody o nazwie Asynchronous JavaScript and XML (AJAX).

To jest coś, co możesz sprawdzić na YouTube. Po prostu wyszukaj „jquery ajax”

Polecam Laravel każdemu nowemu, aby zacząć dobrze: http://laravel.com/

Michael J. Calkins
źródło
3
Żeby wspomnieć, zakładam, że jesteś całkiem nowy w PHP. Chciałbym polecić laravel.com jako framework. Osobiście bardzo chciałbym pominąć całą „naukę ogólnego php” i przejść od razu do potężnego frameworka. To jest ten, którego teraz używam.
Michael J. Calkins,
5
Człowieku, bardzo dziękuję, twoja odpowiedź nie tylko pomogła mi z tą wątpliwością, ale także sprawiła, że ​​rozumiem php o wiele lepiej! Jeszcze raz dziękuję!
Feel The Noise
Dzięki, szukam tego. Jak mogę to zaimplementować w wordpressie
Firefog
1
Dziękuję, ze względu na twoją wzmiankę zacznę się koncentrować na 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).Cóż, onclickzawarł w pytaniu, więc jest całkiem jasne, że celem jest wykonanie akcji bez odświeżania. ¬_¬
Synetech
39

W javascript stwórz funkcję Ajax,

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

      });
 }

Następnie zadzwoń z html,

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

A w twoim ajax.php,

if($_POST['action'] == 'call_this') {
  // call removeday() here
}
devo
źródło
Dla wyjaśnienia: typepowinien być używany w jQuery wcześniej niż 1.9.0, a methodjest aliasem i powinien być używany w nowszych wersjach.
Alejandro Nava
1
To samo rozwiązanie dostępne również w Vanilla JavaScript pomaga początkującym znacznie lepiej. Mówię to jako bardziej doświadczony użytkownik JavaScript, który kiedyś był zupełnie początkujący, ale biegły w PHP.
Ken Ingram
12

Można to zrobić i za pomocą raczej prostego php, jeśli to jest twój przycisk

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

a to jest twój kod php

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

kod get jest wywoływany, gdy wysyłany jest komunikat get, co dzieje się po kliknięciu przycisku.

Wampiry
źródło
11

Będziesz musiał to zrobić przez AJAX . BARDZO polecam użycie jQuery, aby ci to ułatwić ....

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

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

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

AO
źródło
1
dlaczego AJAX? byłby to ten sam plik PHP (zaktualizowałem moje pytanie)
Mike
3
Z powodu tego, co wyjaśnił @Barmar, to tak nie działa. Będziesz chciał umieścić php w oddzielnym pliku, a następnie odwołać się do tego pliku w swoim żądaniu AJAX.
AO
1
Parametr „url:” odwołuje się do zewnętrznego pliku php, jak mogę odwołać się do funkcji php w tym samym pliku?
Joe Doe
2
@JoeDoe nie możesz, umieść funkcję w pliku zewnętrznym
AO,
2

Rozwiązanie bez ponownego ładowania strony

<?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>
Kamil Kiełczewski
źródło
1

Spróbuj zrobić coś takiego:

<!--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>
Simpel
źródło
1

Oto alternatywa dla AJAX, ale bez jQuery, tylko zwykły JavaScript:

Dodaj to do pierwszej / głównej strony php, z której chcesz wywołać akcję, ale zmień ją z potencjalnego atagu (hiperłącza) na buttonelement, aby nie klikały go żadne boty ani złośliwe aplikacje (lub cokolwiek).

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

Kiedy buttonzostanie kliknięty, onclickużywa funkcji javascript głowy do wysłania $sendingValueprzez AJAX do innej strony php, jak wiele przykładów wcześniejszych. Druga strona ajax-php-page.phpsprawdza wartość GET i wraca z 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...");
  }

?>

Odpowiedź od print_rjest następnie zwracana i wyświetlana za pomocą

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

W +=zapełnia i dodaje do istniejących elementów HTML, usuwając +tylko aktualizacje i zastępuje istniejące zawartość html pelementu "results".

andiOak
źródło
0

To najłatwiejszy możliwy sposób. Jeśli formularz jest wysyłany pocztą, wykonaj funkcję php. Pamiętaj, że jeśli chcesz wykonywać funkcję asynchronicznie (bez konieczności ponownego ładowania strony), będziesz potrzebować AJAX.

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

    <?php
    if(isset($_POST['test'])){
      //do php stuff  
    }
    ?>
csandreas1
źródło
Note that if you want to perform function asynchronously (without the need to reload the page), then you'll need AJAX.Cóż, onclickoznaczałoby to, że właśnie tego chce. ¬_¬
Synetech
-3

Spróbuj tego, to zadziała dobrze.

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

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

?>

<button onclick="echoHello()">Say Hello</button>
Vidya
źródło
2
To nie działa (nawet jeśli to posprzątasz), ale co więcej, nie może działać. Kod PHP jest wstępnie przetwarzany podczas ładowania; nie jest uruchamiany w czasie wykonywania.
Synetech
Albo nie przeczytałeś pytania, albo nie przetestowałeś swojego kodu, ponieważ to nie zadziała.
Mr PizzaGuy