3

I am trying to get some data from the database. I create a function that is located in functions.php file that return a value. On another page, I create a variable and just get that value. I was trying to use the onkey to check the database but then I realize that i need to know the amount of tickets even if they don't type anything.

Here is the function:

function.php

function is_ticket_able($conn){


$query = "select number_of_tickets from [dbo].[TICKETS] " ;


 $stmt = sqlsrv_query($conn, $query);


 while ($row = sqlsrv_fetch_array($stmt)) {
     $amount_of_tickets = $row['number_of_tickets'];

 }

   return $amount_of_tickets;

 }

And, I am trying to check the database (without refreshing the page) and get the value on this page:

application.php

$amount_of_tickets = is_ticket_able($conn);

Then, I just check that $amount_of_tickets is not 0 or 1. Because if is one then some stuff have to change.

I am doing this (inside application.php):

if($amount_of_tickets !=0){
   //show the form and let them apply for tickets.

     //also
     if($amount_of_tickets == 1){
        //just let them apply for one ticket.
     }
}

EDIT: I saw that AJAX would be the right one to use, but I am so confuse using it.

UPDATE:

function.php

function is_ticket_able($conn){


$query = "select number_of_tickets from [dbo].[TICKETS_LKUP] " ;


 $stmt = sqlsrv_query($conn, $query);


 while ($row = sqlsrv_fetch_array($stmt)) {


    $ticket = $row['number_of_tickets'];

   }

   return $ticket;
}

application.php

$amount_of_tickets = is_ticket_able($conn);

<script type="text/javascript">
 var global_isTicketAble = 0;

 checkTicket();

 function checkTicket()
 {
    $.ajax(
       {
        url: "application.php",
        method: 'GET',
        dataType: 'text',
        async: true,
        success: function( text )
        {
            global_isTicketAble = text;
            alert(global_isTicketAble);
            if( global_isTicketAble == 0 ){
                        window.location.replace("http://www.google.com");
            }
            setTimeout( checkTicket, 5000 ); // check every 5 sec
        }
    });        
   }



   </script> 

So, now the problem is that when I alert(global_isTicketAble); it doesn't alert the value from the database but it does alert everything that is inside application.php...Help plzzz

2 Answers 2

3

Server side

Assuming you need to check $amount_of_tickets periodically and this can be computed into application.php, inside that file you'll have

<?php

    // $conn is defined and set somewhere

    $amount_of_tickets = is_ticket_able($conn);

    echo $amount_of_tickets;
    exit(0);
?>

This way when the script is invoked with a simple GET request the value is returned in the response as simple text.


Client Side

ajax is the way to go if you want to update information on page without reloading it.

Below is just a simple example (using jQuery) that may be extended to fit your needs.

The code below is a JavaScript snippet. A global is used to store the value (globals should be avoided but it's just for the purpose of the example)

Then a function is invoked and the updated value is fetched from function.php script.

The function -prior termination- schedules itself (with setTimeout) to be re-invoked after a given amount of milliseconds (to repeat the fetch value process).

var global_isTicketAble = 0;

checkTicket();

function checkTicket()
{
    $.ajax(
        {
            url: "application.php",
            method: 'GET',
            dataType: 'text',
            async: true,
            success: function( text )
            {
                global_isTicketAble = text;
                // eventually do something here
                // with the value just fetched
                // (ex. update the data displayed)

                setTimeout( checkTicket, 5000 ); // check every 5 sec
            }
        }        
}

Note that $.ajax() sends the request but does not wait for the response (as async is set to true). When the request is received the function specified as success is executed.

Complete jQuery ajax function documentation can be found here

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

Sign up to request clarification or add additional context in comments.

13 Comments

a few things. So, I don't need onkey? Also, I need the ticket variable to make sure is not 0...can I just use it anywhere i want? And finally, O heard that with Ajax, I need to echo something on my function (mandatory echo) ?
"I don't need onkey" I don't know, it depends what you need to do. The snippet provided fetch the value every 5 seconds. You can adjust the code to fetch the value when an event occurrs as well. As I used a global to store the fetched value it's available from anywhere in the code but it's more advisable to "do something" when the value is fetched. --- "I need to echo..." of course, you need to pass the value to the client side script throught the response and you accomplich this echoing the result.
So that is the issue, that the user can't see the amount of tickets left. Is there a way that I couldn't echo the amount of tickets left?
compute the tickets left on the server side php script and echo the value. The client side script calls periodically (or when a specific event that you decide occurrs) the php script and updates the count of the tickets left on the web page
I just got more confuse lol ... Maybe my question is not clear enough....I will try to edit and see if I have a clear answer. It is not your fault ...is just that I can't picture this answer working with my code
|
1
+50

I assume that you have a page (application.php) that displays a table somewhere. And that you wish to fill that table with the data found in you database.

I'm not sure about WHEN you want these data to be refreshed. On button click or periodically (like ervery 5 seconds)... But it doesn't matter for what I explain below.

In application.php: Assemble all your page as you already know how.

But inside it, somewere, just insert an empty div where your table should show:

<div id="dynamicContent"></div>

Also add this script at the bottom of the page:

<script>
function getData(){
    PostData="";
    $.ajax({
        type: "POST",
        url: "function.php",
        data: PostData,
        cache: true,
        success: function(html){
            $(Destination).html(html);
        }
    });
}

getData();   // Trigger it on first page load !
</script>

There is 2 variables here... I named it "PostData" and "Destination".

About PostData:
You can pass data collected on the client side to your PHP function if needed. Suppose you'd need to pass your user's first and last name, You'd define PostData like this:

Fname=$("#Fname").val(); // user inputs
Lname=$("#Lname").val();
PostData="Fname="+Fname+"&Lname="+Lname;

In your function.php, you will retreive it like this (like any normal POST data):

$Fname=$_POST['Fname'];
$Lname=$_POST['Lname'];

If you do not need to pass data from your client side script to you server side PHP... Just define it empty.

PostData="";

Then, about Destination:
This is the place for the empty "dynamic div" id ( I named it "dynamicContent" above).
Don't forget about the hashtag (#) for an id or the dot for a class.
This is a jQuery selector.
So here, PostData would be defined like this:

Destination="#dynamicContent";

The result of the ajax request will land into that "dynamic div".
This WILL be the result of what's defined in function.php..

So, if you follow me, you have to build your table in function.php...
I mean the part where you do your database query and your while fetch.

echo "<table>";
echo "<tr><th>column title 1</th><th>column title 2</th></tr>"
while ($row = sqlsrv_fetch_array($stmt)){
    echo "<tr><td>" . $row['data1'] . "</td><td>" . $row['data2'] . "</td></tr>";
}
echo "</table>";

So if you have no data, the table will be empty.
You'll only get the table and table headers... But no row.
There is then no need for a function that checks if there is data or not.

Finally... About the trigger to refresh:
In application.php, you may place a button that fires getData()... Or you may define a setInterval.
It's up to you.

This is how I use ajax to refresh part of a page without reloading it completly.
Since ajax is new to you, I hope this answer will help.
;)

------------------------
EDIT based on Ariel's comment (2016-05-01)

Okay, I understand! Try this:

In application.php:

<div id="dynamicDiv"></div>


<script type="text/javascript">

    // timer to trigger the function every seconds
    var checkInterval = setInterval(function(){
        checkTicket();
    },1000);


    function checkTicket(){
        $.ajax({
            type: "POST",
            url: "function.php",
            data: "",
            cache: true,
            success: function(html){
                $("#dynamicDiv").html(html);
            }
        });      
    }

    function noMoreTikets(){
        clearInterval(checkInterval);
        window.location.replace("http://www.google.com");
    }
</script>

In function.php:

// Remove the "function is_ticket_able($conn){" function wrapper.
// Define $conn... Or include the file where it is defined.

// I assume that your query lookup works.

$query = "select number_of_tickets from [dbo].[TICKETS_LKUP] " ;
$stmt = sqlsrv_query($conn, $query);
while ($row = sqlsrv_fetch_array($stmt)) {
    $ticket = $row['number_of_tickets'];
}

// Add this instead of a return.
if($ticket>0){
    echo "There is still some tickets!";    // Text that will show in "dynamicDiv"
}else{
    ?>
    <script>
        $(document).ready(function(){
            noMoreTikets();
        });
    </script>
    <?php
}

Remember that your PHP scripts are executed server-side.
That is why your "return $ticket;" wasn't doing anything.

In this ajax way to call function.php, its script is executed alone, like a single page, without any relation with application.php, which was executed long ago.

It produces text (or javascript) to be served to the client.
If you want to pass a PHP variable to the client-side javascript, you have to echo it as javascript.

So here, if the PHP variable $ticket is more than zero, some text saying that there is still tickets available will show in "dynamicDiv" and the application page will not be refreshed. I suppose it shows a button or something that allows students to get a ticket.

Else, it will be the javascript trigger to "noMoreTikets()" that will land in the "dynamicDiv".

3 Comments

Thanks for your answer. Well, no I don't have a table anywhere. I just need to get a row from the database that contain the number_of_tickets_able then, if that number is 0, immediately, send the user to another page saying that there is no more tickets able. In other words, I believe that I should being refreshing the page every second because students will be requesting at once. there are about 100 tickets and about 2,000 students, I was worrying about that the echo somewhere will be showing the number_of_tickets_abe and I don't want students to see that.
I updated my answer... It is now more specific to your need. ;)
var checkInterval = setInterval(function(){ checkTicket(); },1000); hmm.. what if the backend takes more than 1 second to send a response? A new request should be issued only when the previous has been received.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.