Cómo llamar a una función PHP con solo hacer clic en un botón

151

He creado una página llamada functioncalling.php que contiene dos botones, Enviar e Insertar . Como principiante en PHP, quiero probar qué función se ejecuta cuando se hace clic en un botón. Quiero que la salida aparezca en la misma página. Entonces creé dos funciones, una para cada botón. El código fuente de functioncalling.php es el siguiente:

<!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.";
            }
        ?>

El problema aquí es que no obtengo ningún resultado después de hacer clic en cualquiera de los botones.

¿Dónde exactamente me estoy equivocando?

Maquinilla de afeitar
fuente
10
PHP se ejecuta en el servidor. Sus controladores de clics se ejecutan en el cliente. No puede ejecutar funciones PHP con solo hacer clic en un botón como este. Sin embargo, puedes hacerlo en Javascript.
1
Las preguntas que solicitan código deben demostrar una comprensión mínima del problema que se está resolviendo. Incluya las soluciones intentadas, por qué no funcionaron y los resultados esperados.
44
Gracias por responder. ¿Podría decirme cómo exactamente llamo a estas funciones PHP desde JavaScript?
Navaja
Mira esta respuesta .
Amal Murali

Respuestas:

93

Sí, necesitas Ajax aquí. Consulte el código a continuación para obtener más detalles.

 

Cambia tu marcado así

<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");
        });
    });
});

En 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
fuente
Este código no funciona para mí: Error de referencia no capturado: $ no está definido
Benjamin
¿Incluyó la biblioteca JQuery antes de usar este código?
Roopendra
9
Lo hice, pero me di cuenta de que //code.jquery.com/...etc no se carga en localhost, ¡https: // sí! El código funciona bien, lo siento, mi error.
Benjamin
1
¡Hermoso! Exactamente lo que estaba buscando.
1
Me encanta el controlador de clase de botón. Felicitaciones por el código genérico que funciona en muchos escenarios.
Pablo Contreras
64

Los clics en los botones son del lado del cliente, mientras que PHP se ejecuta del lado del servidor , pero puede lograr esto usando Ajax :

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

En su archivo PHP:

<?php
    function abc($name){
        // Your code here
    }
?>
Moeed Farooqui
fuente
55
Gracias por dar la solución. En el fragmento de código AJAX que me ha proporcionado, ¿cómo llamo a las funciones de PHP en la propiedad .done?
Navaja
una vez que usa ajax para llamar al archivo php, ¿hay alguna forma de llamar a la función php específica? ¿o tendré que poner cada uno en un archivo diferente?
Lordbug
1
también use JS preventdefault para evitar que el formulario se envíe para que la página no se vuelva a cargar. w3schools.com/jsref/…
csandreas1
Como principiante, quiero aclarar mi duda. Si se evita que esas páginas se desarrollen donde los códigos HTML y PHP se fusionan en una sola página con HTML que sirve para la interacción del cliente como formularios y PHP que sirve como respuesta a dichos formularios HTML, como imprimir algunos resultados en función de si un botón en un se hace clic en el formulario?
KPMG
¿Cómo se supone que esto funcione? Puse una declaración de eco en el cuerpo de la función abc, y puse puntos de interrupción tanto en la línea de declaración de función como en la llamada de eco en la función. Cuando hago clic en el botón, se golpea el primer punto de interrupción (es decir, se declara la función) pero el que está en el cuerpo nunca golpea, lo que considero que la función nunca se llama.
Shaggydog
41

Debe hacer que el botón llame a la misma página y, en una sección de PHP, compruebe si se presionó el botón:

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

No puede llamar a funciones PHP como hacer clic en un botón desde HTML. Porque HTML está en el lado del cliente mientras PHP ejecuta el lado del servidor.

O necesita usar algo de Ajax o hacerlo como en el fragmento de código a continuación.

<?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.";
    }
?>

Debe publicar los datos de su formulario y luego verificar el botón apropiado en el que se hace clic.

Jason W
fuente
¿Y si quiero dar un parámetro a la función?
Nick Alexander
Puede pasar argumentos a funciones como otras funciones en php
Jason W
14

Para mostrar $ mensaje en su 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 functioncalling.php como un archivo externo, debe incluirlo de alguna manera en su documento HTML.

usuario5253060
fuente
8

Prueba esto:

if($_POST['select'] and $_SERVER['REQUEST_METHOD'] == "POST"){
    select();
}
if($_POST['insert'] and $_SERVER['REQUEST_METHOD'] == "POST"){
    insert();
}
usuario2399308
fuente
1
esta es la mejor respuesta en lugar de usar marcos estúpidos
vincent thorpe
7

Puede escribir así en JavaScript o jQuery Ajax y llamar al archivo

$('#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
        }
    }
?>

Tanque Vipul
fuente
5

El onclickatributo en HTML llama funciones de JavaScript, no funciones de PHP.

lineas borrosas
fuente
4

Estaba atrapado en esto y lo resolví con un campo oculto:

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

En valuepuedes agregar lo que quieras agregar.

En test.php puede recuperar el valor a través de $_Post[ID].

Sanya Zahid
fuente
¿No debería IDser citado en $_Post[ID]? ¿PHP admite palabras simples, como en Perl?
Peter Mortensen
3

Use una llamada recursiva donde la acción del formulario se llama a sí misma. Luego agregue código PHP en la misma forma para atraparlo. En foo.phpsu formulario llamará foo.phpalpost

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

Una vez que se haya enviado el formulario, se llamará a sí mismo ( foo.php) y puede atraparlo a través de la variable predefinida de PHP $_SERVERcomo se muestra en el código a continuación

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

Aquí hay un ejemplo que podría 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
fuente
0

Simplemente puedes hacer esto. En php, puede determinar el clic del botón mediante el uso de

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

Por lo tanto, debe modificar su código de la siguiente manera:


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