如何从PHP中的sql server数据库中获取数据而不刷新页面

时间:2016-04-21 15:43:46

标签: javascript jquery sql-server ajax sql-server-2012

我正在尝试从数据库中获取一些数据。我创建了一个位于Canvas.SetRight(ctl)文件中的函数,它返回一个值。在另一个页面上,我创建一个变量,然后获取该值。我试图使用functions.php来检查数据库,但后来我意识到我需要知道门票的数量,即使他们没有输入任何东西。

这是功能:

function.php

onkey

并且,我正在尝试检查数据库(不刷新页面)并获取此页面上的值:

application.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;

 }

然后,我只检查$amount_of_tickets = is_ticket_able($conn); 是不是0还是1.因为如果是1,那么一些东西必须改变。

我这样做(在application.php中):

$amount_of_tickets

编辑:我看到AJAX是正确使用的,但是我很困惑使用它。

更新

function.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.
     }
}

application.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;
}

所以,现在的问题是,当我$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> 时,它不会提醒数据库中的值,但它会提醒 application.php 内的所有内容...帮助plzzz

2 个答案:

答案 0 :(得分:3)

服务器端

假设您需要定期检查$amount_of_tickets这可以计算到 application.php ,在该文件中您将拥有

<?php

    // $conn is defined and set somewhere

    $amount_of_tickets = is_ticket_able($conn);

    echo $amount_of_tickets;
    exit(0);
?>

这样,当使用简单的 GET 请求调用脚本时,该值将作为简单文本在响应中返回。

客户端

ajax 是您想要更新页面信息而无需重新加载的方法。

下面是一个简单的例子(使用jQuery),可以扩展以满足您的需求。

以下代码是一个JavaScript代码段。全局用于存储值(应该避免使用全局变量,但它只是出于示例的目的)

然后调用一个函数,并从 function.php 脚本中获取更新的值。

函数-prior termination-调度自身(setTimeout)在给定的毫秒数后重新调用(重复获取值进程)。

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

请注意$.ajax()发送请求但不等待响应(因为async设置为true)。收到请求后,将执行指定为success的函数。

完整的jQuery ajax函数文档可以在这里找到

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

答案 1 :(得分:1)

我假设你有一个页面(application.php)在某处显示一个表。 并且您希望用您在数据库中找到的数据填充该表。

我不确定您希望刷新这些数据的时间。 点击按钮或定期点击(例如错误的5秒)...但是对于我在下面解释的内容并不重要。

在application.php中: 按照您已经知道的方式组装所有页面。

但在其中,有些人只是在你的桌子应该显示的地方插入一个空的div:

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

还要在页面底部添加此脚本:

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

这里有2个变量......我将它命名为#34; PostData&#34;和&#34;目的地&#34;。

关于PostData:
如果需要,您可以将客户端收集的数据传递给PHP函数。 假设您需要传递用户的名字和姓氏,您可以像这样定义PostData:

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

在你的function.php中,你会像这样检索它(就像任何正常的POST数据一样):

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

如果您不需要将数据从客户端脚本传递到服务器端PHP ...只需将其定义为空。

PostData="";

然后,关于目的地:
这是空的&#34;动态div&#34; id(我把它命名为&#34; dynamicContent&#34;上面) 不要忘记一个id的标签(#)或一个类的点 这是一个jQuery选择器 所以在这里,PostData将被定义如下:

Destination="#dynamicContent";

ajax请求的结果将落入&#34;动态div&#34;。
这将是function.php ..

中定义的结果

所以,如果你跟着我,你必须在function.php ...中构建你的表 我的意思是你进行数据库查询和同时获取的部分。

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

因此,如果您没有数据,表格将为空 你只能获得表格和表格标题......但是没有行 因此,不需要检查是否存在数据的函数。

最后......关于刷新的触发器:
在application.php中,你可以放一个触发getData()的按钮......或者你可以定义一个setInterval。
它取决于你。

这就是我如何使用ajax刷新页面的一部分而不重新加载它 由于ajax对你来说是新的,我希望这个答案会有所帮助 ;)

------------------------
根据Ariel的评论编辑(2016-05-01)

好的,我明白了!试试这个:

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

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

请记住,您的PHP脚本是在服务器端执行的 这就是为什么你的&#34;返回$ ticket;&#34;没有做任何事情。

在这种调用function.php的ajax方式中,它的脚本是单独执行的,就像单个页面一样,与很久以前执行的application.php没有任何关系。

它生成要提供给客户的文本(​​或javascript) 如果要将PHP变量传递给客户端javascript,则必须将其作为javascript回显。

所以在这里,如果PHP变量$ ticket大于零,那么一些文字说明仍有可用的门票将显示在&#34; dynamicDiv&#34;并且不会刷新应用程序页面。我想它会显示一个按钮或某些东西,允许学生买票。

否则,它将成为&#34; noMoreTikets()&#34;的javascript触发器。这将落在&#34; dynamicDiv&#34;。