191

I have created a page called functioncalling.php that contains two buttons, Submit and Insert.

I want to test which function is executed when a button gets clicked. I want the output to appear on the same page. So, I created two functions, one for each button.

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

The problem here is that I don't get any output after any of the buttons are clicked.

Where exactly am I going wrong?

3
  • 12
    PHP executes on the server. Your click handlers execute on the client. You can't run PHP functions on the click of a button like this. You can do it in Javascript, however. Commented Dec 23, 2013 at 6:51
  • 4
    Thank you for replying. Could you please tell me how exactly do I call these PHP functions from JavaScript? Commented Dec 23, 2013 at 6:56
  • See this answer. Commented Dec 23, 2013 at 6:58

13 Answers 13

107

Yes, you need Ajax here. Please refer to the code below for more details.

 

Change your markup like this

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

In 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; } ?> 
Sign up to request clarification or add additional context in comments.

Comments

77

Button clicks are client side whereas PHP is executed server side, but you can achieve this by using Ajax:

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

In your PHP file:

<?php function abc($name){ // Your code here } ?> 

6 Comments

Thanks for giving the solution. In the AJAX code snippet that you have provided me, how do I call the PHP functions in the .done property?
once you use ajax to call the php file, is there any way to call the specific php function? or will I have to put each one in a different file?
also use JS preventdefault to prevent form from submitting so the page won't reload. w3schools.com/jsref/…
As a beginner, I want to clear my doubt. Should those pages be prevented from developing where both HTML and PHP codes are merged in a single page with HTML serving the purpose of client interaction like forms and PHP serving as the reply to such HTML forms like printing some results based on whether a button in a form is clicked?
How is this supposed to work? I've put an echo statement in the abc function body, and I've put breakpoints on both the function declaration line, and on the echo call in the function. When I click the button, the first breakpoint is hit (ie the function is declared) but the one in the body never hits, which I take to mean the function is never called.
|
62

You should make the button call the same page and in a PHP section check if the button was pressed:

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

3 Comments

Do not Access Superglobal $_SERVER Array Directly.
@AntonDuzenko please explain why do not use superglobal directly
20

You cannot call PHP functions like clicking on a button from HTML. Because HTML is on the client side while PHP runs server side.

Either you need to use some Ajax or do it like as in the code snippet below.

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

You have to post your form data and then check for appropriate button that is clicked.

2 Comments

And if I want to give a param to the function?
You can pass arguments to functions like other functions in php
14

To show $message in your input:

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

To use functioncalling.php as an external file you have to include it somehow in your HTML document.

2 Comments

Just to elaborate on your answer.. you set the form action to the PHP file that contains the function. So it will be: <form method="post" action="functioncalling.php">
Any idea how I do this with a woocommerce product page? just outputting the product name and description?
10

Try this:

if($_POST['select'] and $_SERVER['REQUEST_METHOD'] == "POST"){ select(); } if($_POST['insert'] and $_SERVER['REQUEST_METHOD'] == "POST"){ insert(); } 

Comments

8

You can write like this in JavaScript or jQuery Ajax and call the file

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

1 Comment

If you have to resort to calling google code, you're doin' it wrong!
7

The onclick attribute in HTML calls JavaScript functions, not PHP functions.

Comments

5

I was stuck in this and I solved it with a hidden field:

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

In value you can add whatever you want to add.

In test.php you can retrieve the value through $_Post[ID].

1 Comment

Shouldn't ID be quoted in $_Post[ID]? Does PHP support bare words, as in Perl?
4

Use a recursive call where the form action calls itself. Then add PHP code in the same form to catch it. In foo.php your form will call foo.php on post

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

Once the form has been submitted it will call itself (foo.php) and you can catch it via the PHP predefined variable $_SERVER as shown in the code below

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

Comments

3

Here is an example which you could use:

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

Comments

3

Calling a PHP function using the HTML button: Create an HTML form document which contains the HTML button. When the button is clicked the method POST is called. The POST method describes how to send data to the server. After clicking the button, the array_key_exists() function called.

<?php if(array_key_exists('button1', $_POST)) { button1(); } else if(array_key_exists('button2', $_POST)) { button2(); } function button1() { echo "This is Button1 that is selected"; } function button2() { echo "This is Button2 that is selected"; } ?> <form method="post"> <input type="submit" name="button1" class="button" value="Button1" /> <input type="submit" name="button2" class="button" value="Button2" /> </form> 

source: geeksforgeeks.org

Comments

2

You can simply do this. In php, you can determine button click by use of

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

Therefore you should modify you code as follows:

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.