Execute a função PHP com onclick

92

Estou procurando uma solução simples para chamar uma função PHP somente quando uma tag é clicada.

PHP:

function removeday() { ... }

HTML:

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

ATUALIZAÇÃO: o código html e PHP estão no mesmo arquivo PHP

Mike
fonte
5
HTML executa funções Javascript, que são executadas no cliente. PHP é executado no servidor. Você precisa aprender sobre AJAX.
Barmar
mas por que AJAX? todo o código está no mesmo arquivo PHP.
Mike
1
Por que AJAX? Bem, para descobrir isso, você pode simplesmente executar qualquer script php e ver o código de sua execução. Novamente - Ajax é a única maneira de fazer isso .
Yang,
2
A resposta verificada parecerá um botão se você usar <a role="button" href="?action=removeday" class="debatebtn">Delete</a>onde a ação é capturada e executar a função removeday () semelhante a if($action == 'removeday'){ removeday(); }. Sei que está tarde, mas acho que isso ainda pode ajudar alguém com esse problema. C§
CSS

Respostas:

142

Primeiro, entenda que você tem três idiomas trabalhando juntos:

  • PHP: Ele só roda pelo servidor e responde a solicitações como clicar em um link (GET) ou enviar um formulário (POST).

  • HTML e JavaScript: só ​​funciona no navegador de alguém (exceto NodeJS).

Estou presumindo que seu arquivo se parece com algo assim:

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

Como o PHP só responde a solicitações (GET, POST, PUT, PATCH e DELETE via $ _REQUEST), é assim que você deve executar uma função PHP, embora eles estejam no mesmo arquivo. Isso lhe dá um nível de segurança, "Devo executar este script para este usuário ou não?".

Se você não deseja atualizar a página, pode fazer uma solicitação ao PHP sem atualizar por meio de um método chamado Asynchronous JavaScript and XML (AJAX).

Isso é algo que você pode pesquisar no YouTube. Basta pesquisar "jquery ajax"

Eu recomendo o Laravel para qualquer pessoa que comece bem: http://laravel.com/

Michael J. Calkins
fonte
3
Só para mencionar, suponho que você seja novo no PHP. Gostaria de recomendar laravel.com como uma estrutura. Pessoalmente, teria adorado pular todo o 'aprendizado de php genérico' e ir direto para um framework poderoso. Este é o que eu uso agora também.
Michael J. Calkins,
5
Cara, muito obrigado, sua resposta não só me ajudou com essa dúvida, mas também me fez entender muito melhor o php! Obrigado de novo!
Feel The Noise
Obrigado, estou procurando por isso. Como posso implementar isso com o wordpress
Firefog
1
Obrigado, vou começar a me concentrar no laravel por causa da sua menção.
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).Bem, ele incluiu onclickna pergunta, então está bem claro que o objetivo é realizar uma ação sem atualizar. ¬_¬
Synetech
38

Em javascript, faça uma função ajax,

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

      });
 }

Em seguida, ligue de html,

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

E em seu ajax.php,

if($_POST['action'] == 'call_this') {
  // call removeday() here
}
devo
fonte
Só para esclarecer: typedeve ser usado no jQuery anterior a 1.9.0, enquanto methodé um alias e deve ser usado em versões mais recentes.
Alejandro Nava
1
A mesma solução também fornecida no Vanilla JavaScript ajuda muito melhor os iniciantes. Digo isso como um usuário mais experiente de JavaScript, que já foi um iniciante, mas proficiente em PHP.
Ken Ingram
11

Você terá que fazer isso via AJAX . Eu recomendo PESADAMENTE que você use jQuery para tornar isso mais fácil para você ....

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

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

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

AO
fonte
1
porque AJAX? seria o mesmo arquivo PHP (atualizei minha pergunta)
Mike
3
Pelo que @Barmar explicou, não funciona assim. Você vai querer colocar o php em um arquivo separado e, em seguida, fazer referência a esse arquivo em sua solicitação AJAX.
AO
1
O parâmetro "url:" faz referência a um arquivo php externo, como posso fazer referência à função php no mesmo arquivo?
Joe Doe
2
@JoeDoe você não pode, coloque a função em um arquivo externo
AO
11

Pode ser feito e com um php bastante simples se este for o seu botão

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

e este é o seu código php

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

o código get é chamado quando enviar get é postado, o que acontece quando o botão é clicado.

Vampiros
fonte
1

Tente fazer algo assim:

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

Solução sem recarregar a página

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

Esta é a maneira mais fácil possível. Se o formulário for postado por correio, execute a função php. Observe que se você deseja executar a função de forma assíncrona (sem a necessidade de recarregar a página), você precisará do AJAX.

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

    <?php
    if(isset($_POST['test'])){
      //do php stuff  
    }
    ?>
csandreas1
fonte
Note that if you want to perform function asynchronously (without the need to reload the page), then you'll need AJAX.Bem, onclickisso indicaria que é exatamente o que ele quer. ¬_¬
Synetech
0

Aqui está uma alternativa com AJAX, mas sem jQuery, apenas JavaScript normal:

Adicione isso à primeira / página principal do php, de onde você deseja chamar a ação, mas altere-a de uma atag potencial (hiperlink) para um buttonelemento, de modo que não seja clicado por bots ou aplicativos maliciosos (ou qualquer outro).

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

Quando o buttoné clicado, onclickusa a função javascript do head para enviar $sendingValuevia ajax para outra página php, como muitos exemplos anteriores a este. A outra página ajax-php-page.php,, verifica o valor GET e retorna com 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...");
  }

?>

A resposta de print_ré então retornada e exibida com

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

O +=preenche e adiciona aos elementos html existentes, removendo as +atualizações justas e substituindo o conteúdo existente do pelemento html "results".

andyNilson
fonte
-3

Tente isso vai funcionar bem.

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

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

?>

<button onclick="echoHello()">Say Hello</button>
Vidya
fonte
2
Isso não funciona (mesmo se você limpar), mas, além disso, não pode funcionar. O código PHP é pré-processado quando carregado; não é executado em tempo de execução.
Synetech
Ou você não leu a pergunta ou não testou seu código, pois isso não funcionaria.
Sr. PizzaGuy