Como chamar uma função PHP com o clique de um botão

151

Eu criei uma página chamada functioncalling.php que contém dois botões, Enviar e Inserir . Como iniciante em PHP, quero testar qual função é executada quando um botão é clicado. Quero que a saída apareça na mesma página. Então eu criei duas funções, uma para cada botão. O código fonte do functioncalling.php é o seguinte:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <body>
        <form action="functioncalling.php">
            <input type="text" name="txt" />
            <input type="submit" name="insert" value="insert" onclick="insert()" />
            <input type="submit" name="select" value="select" onclick="select()" />
        </form>

        <?php
            function select(){
               echo "The select function is called.";
            }
            function insert(){
               echo "The insert function is called.";
            }
        ?>

O problema aqui é que não recebo nenhuma saída depois de clicar em qualquer um dos botões.

Onde exatamente estou errado?

Navalha
fonte
10
O PHP é executado no servidor. Seus manipuladores de clique são executados no cliente. Você não pode executar funções PHP com o clique de um botão como este. Você pode fazer isso em Javascript, no entanto.
1
As perguntas que solicitam código devem demonstrar um entendimento mínimo do problema que está sendo resolvido. Inclua soluções tentadas, por que elas não funcionaram e os resultados esperados.
4
Obrigado por responder. Você poderia me dizer como exatamente chamo essas funções PHP do JavaScript?
Razor
Veja esta resposta .
Amal Murali

Respostas:

93

Sim, você precisa do Ajax aqui. Consulte o código abaixo para obter mais detalhes.

 

Alterar sua marcação como esta

<input type="submit" class="button" name="insert" value="insert" />
<input type="submit" class="button" name="select" value="select" />

 

jQuery:

$(document).ready(function(){
    $('.button').click(function(){
        var clickBtnValue = $(this).val();
        var ajaxurl = 'ajax.php',
        data =  {'action': clickBtnValue};
        $.post(ajaxurl, data, function (response) {
            // Response div goes here.
            alert("action performed successfully");
        });
    });
});

No ajax.php

<?php
    if (isset($_POST['action'])) {
        switch ($_POST['action']) {
            case 'insert':
                insert();
                break;
            case 'select':
                select();
                break;
        }
    }

    function select() {
        echo "The select function is called.";
        exit;
    }

    function insert() {
        echo "The insert function is called.";
        exit;
    }
?>
Roopendra
fonte
Este código não funciona para mim: Uncaught ReferenceError: $ não é definido
Benjamin
Você incluiu a biblioteca JQuery antes de usar este código.
Roopendra 28/05
9
Eu fiz, mas acabei de perceber que //code.jquery.com/...etc não carrega no localhost, https: // faz! código funciona bem desculpe meu erro.
Benjamin
1
Lindo! Exatamente o que eu estava procurando.
1
adoro o manipulador de classes de botão. parabéns pelo código genérico que funciona em muitos cenários.
Pablo Contreras
64

Os cliques no botão são do lado do cliente, enquanto o PHP é executado no servidor , mas você pode fazer isso usando o Ajax :

$('.button').click(function() {
  $.ajax({
    type: "POST",
    url: "some.php",
    data: { name: "John" }
  }).done(function( msg ) {
    alert( "Data Saved: " + msg );
  });
});

No seu arquivo PHP:

<?php
    function abc($name){
        // Your code here
    }
?>
Moeed Farooqui
fonte
5
Obrigado por dar a solução. No snippet de código AJAX que você me forneceu, como chamo as funções PHP na propriedade .done?
Razor
Depois de usar o ajax para chamar o arquivo php, existe alguma maneira de chamar a função php específica? ou terei que colocar cada um em um arquivo diferente?
Lordbug
1
use também JS preventdefault para impedir que o formulário seja enviado para que a página não seja recarregada. w3schools.com/jsref/...
csandreas1
Como iniciante, quero esclarecer minha dúvida. Essas páginas devem ser impedidas de se desenvolver onde os códigos HTML e PHP são mesclados em uma única página, com o HTML servindo ao propósito de interação do cliente, como formulários, e o PHP, que serve como resposta a esses formulários HTML, como imprimir alguns resultados com base no fato de um botão em um o formulário é clicado?
KPMG
Como é que isso deveria funcionar? Eu coloquei uma instrução echo no corpo da função abc e coloquei pontos de interrupção na linha de declaração da função e na chamada de eco na função. Quando clico no botão, o primeiro ponto de interrupção é atingido (ou seja, a função é declarada), mas aquele no corpo nunca bate, o que considero que a função nunca é chamada.
Shaggydog 21/11/19
41

Você deve fazer com que o botão chame a mesma página e, na seção PHP, verifique se o botão foi pressionado:

HTML:

<form action="theSamePage.php" method="post">
    <input type="submit" name="someAction" value="GO" />
</form>

PHP:

<?php
    if($_SERVER['REQUEST_METHOD'] == "POST" and isset($_POST['someAction']))
    {
        func();
    }
    function func()
    {
        // do stuff     
    }
?>
DavidS
fonte
17

Você não pode chamar funções PHP como clicar em um botão do HTML. Porque o HTML está no lado do cliente enquanto o PHP executa no lado do servidor.

Você precisa usar algum Ajax ou fazê-lo como no snippet de código abaixo.

<?php
    if ($_GET) {
        if (isset($_GET['insert'])) {
            insert();
        } elseif (isset($_GET['select'])) {
            select();
        }
    }

    function select()
    {
       echo "The select function is called.";
    }

    function insert()
    {
       echo "The insert function is called.";
    }
?>

Você deve postar os dados do formulário e, em seguida, verificar o botão apropriado que é clicado.

Jason W
fonte
E se eu quiser dar um parâmetro para a função?
Nick Alexander
Você pode passar argumentos para funções como outras funções no php
Jason W
14

Para mostrar $ message em sua entrada:

<?php
    if(isset($_POST['insert'])){
        $message= "The insert function is called.";
    }
    if(isset($_POST['select'])){
        $message="The select function is called.";
    }
?>


<form  method="post">
    <input type="text" name="txt" value="<?php if(isset($message)){ echo $message;}?>" >
    <input type="submit" name="insert" value="insert">
    <input type="submit" name="select" value="select" >
</form>

Para usar o functioncalling.php como um arquivo externo, você deve incluí-lo de alguma forma no seu documento HTML.

user5253060
fonte
8

Tente o seguinte:

if($_POST['select'] and $_SERVER['REQUEST_METHOD'] == "POST"){
    select();
}
if($_POST['insert'] and $_SERVER['REQUEST_METHOD'] == "POST"){
    insert();
}
user2399308
fonte
1
esta é a melhor resposta ao invés de usar estruturas estúpidas
vincent Thorpe
7

Você pode escrever assim em JavaScript ou jQuery Ajax e chamar o arquivo

$('#btn').click(function(){
  $.ajax({
    url:'test.php?call=true',
    type:'GET',
    success:function(data){
    body.append(data);
    }
  });
})
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.0.1/jquery.min.js"></script>
<form  method='get' >

  <input type="button" id="btn" value="click">
</form>

<?php
    if(isset($_GET['call'])){

        function anyfunction(){
            echo "added";

            // Your funtion code
        }
    }
?>

Vipul Tank
fonte
5

O onclickatributo em HTML chama funções JavaScript, não funções PHP.

linesarefuzzy
fonte
4

Eu estava preso nisso e o resolvi com um campo oculto:

<form method="post" action="test.php">
    <input type="hidden" name="ID" value"">
</form>

Em valuevocê pode adicionar o que você deseja adicionar.

No test.php, você pode recuperar o valor $_Post[ID].

Sanya Zahid
fonte
Não deve IDser citado $_Post[ID]? O PHP suporta palavras simples, como no Perl?
Peter Mortensen
3

Use uma chamada recursiva onde a ação do formulário se chama. Em seguida, adicione o código PHP da mesma forma para capturá-lo. Em foo.phpseu formulário vai chamar foo.phpempost

<html>
    <body>
        <form action="foo.php" method="post">

Depois que o formulário for enviado, ele se chamará ( foo.php) e você poderá obtê-lo através da variável predefinida do PHP, $_SERVERconforme mostrado no código abaixo

<?php
    if ($_SERVER['REQUEST_METHOD'] == 'POST') {
        echo "caught post";
    }
?>
        </form>
    </body>
</html>
bradleybrentmeyer
fonte
2

Aqui está um exemplo que você pode usar:

<html>
    <body>
        <form action="btnclick.php" method="get">
            <input type="submit" name="on" value="on">
            <input type="submit" name="off" value="off">
        </form>
    </body>
</html>
<?php
    if(isset($_GET['on'])) {
        onFunc();
    }
    if(isset($_GET['off'])) {
        offFunc();
    }

    function onFunc(){
        echo "Button on Clicked";
    }
    function offFunc(){
        echo "Button off clicked";
    }
?>
Sagar Mali
fonte
0

Você pode simplesmente fazer isso. No php, você pode determinar o clique no botão usando

if(isset($_Post['button_tag_name']){
echo "Button Clicked";
}

Portanto, você deve modificar seu código da seguinte maneira:


<?php

if(isset($_Post['select']){
 echo "select button clicked and select method should be executed"
}
if(isset($_Post['insert']){
 echo "insert button clicked and insert method should be executed"
}

        ?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
    <body>
        <form action="functioncalling.php">
            <input type="text" name="txt" />
            <input type="submit" name="insert" value="insert" onclick="insert()" />
            <input type="submit" name="select" value="select" onclick="select()" />
        </form>

<script>
//This will be processed on the client side
function insert(){
  window.alert("You click insert button");
}

function select(){
  window.alert("You click insert button");
}
</script>
</body>
</html>


trustidkid
fonte