如何在不刷新页面的情况下从 PHP 中的 SQL Server 数据库获取数据

how to fetch data from sql server database in php without refreshing the page

本文关键字:SQL 中的 PHP Server 数据库 数据 获取 情况下 刷新      更新时间:2023-09-26

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

这是函数:

功能.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;
 }

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

应用.php

$amount_of_tickets = is_ticket_able($conn);

然后,我只是检查$amount_of_tickets不是 0 或 1。 因为如果是一个,那么有些东西必须改变。

我正在这样做(在应用程序内部.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.
     }
}

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

更新:

功能.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;
}

应用.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> 

所以,现在的问题是,当我alert(global_isTicketAble);它不会从数据库中发出警报值,但它确实会提醒应用程序内的所有内容.php...请帮忙

服务器端

假设您需要定期检查$amount_of_tickets并且可以将其计算到应用程序中.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 片段。全局用于存储值(应避免使用全局变量,但这只是出于示例的目的)

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

函数 - prior 终止 - 调度自身(使用 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/

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

我不确定您希望何时刷新这些数据。在按钮单击或定期(如 ervery 5 秒)...但是对于我在下面解释的内容来说,这并不重要。

在应用中.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 个变量...我将其命名为"PostData"和"Destination"。

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

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

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

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

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

PostData="";

然后,关于目的地:
这是空的"动态div"id的地方(我在上面将其命名为"动态内容")。
不要忘记 id 的标签 (#) 或类的点。
这是一个jQuery选择器。
所以在这里,PostData将定义如下:

Destination="#dynamicContent";

ajax 请求的结果将落入该"动态div"。
这将是函数中定义的结果.php..

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

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

因此,如果您没有数据,则表将为空。
您只会获得表和表标题...但是没有行。
这样就不需要检查是否有数据的函数。

最后。。。关于要刷新的触发器:
在应用程序.php中,您可以放置一个触发 getData()...或者你可以定义一个 setInterval。
这取决于你。

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


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

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

在应用中.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>

在功能上.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 脚本是在服务器端执行的。
这就是为什么你的"回归$ticket"什么也没做。

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

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

所以在这里,如果 PHP 变量$ticket大于零,一些说仍有票证可用的文本将显示在 "dynamicDiv" 中,并且应用程序页面将不会刷新。我想它显示了一个按钮或允许学生获得门票的东西。

否则,它将是"noMoreTikets()"的javascript触发器,它将登陆"dynamicDiv"。