【问题标题】:how to fetch data from sql server database in php without refreshing the page如何在不刷新页面的情况下从 php 中的 sql server 数据库中获取数据
【发布时间】:2016-08-14 22:39:59
【问题描述】:

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

函数如下:

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;

 }

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

application.php

$amount_of_tickets = is_ticket_able($conn);

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

我正在这样做(在 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.
     }
}

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

更新:

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> 

所以,现在的问题是,当我alert(global_isTicketAble); 时,它不会提醒数据库中的值,但它会提醒 application.php 中的所有内容...帮助 plzzz

【问题讨论】:

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


    【解决方案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 个变量...我将其命名为“PostData”和“Destination”。

    关于 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="";
    

    然后,关于目的地:
    这是空“动态 div”id 的位置(我在上面将其命名为“dynamicContent”)。
    不要忘记 id 的标签 (#) 或类的点。
    这是一个 jQuery 选择器。
    所以在这里,PostData 会这样定义:

    Destination="#dynamicContent";
    

    ajax 请求的结果将进入那个“动态 div”。
    这将是 function.php 中定义的结果。

    所以,如果你关注我,你必须在 function.php 中建立你的表...
    我的意思是您进行数据库查询和 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>";
    

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

    最后...关于刷新的触发器:
    在 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 脚本是在服务器端执行的。
    这就是为什么你的“return $ticket;”什么都没做。

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

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

    所以这里,如果 PHP 变量 $ticket 大于零,“dynamicDiv”中会显示一些说明仍有可用票证的文本,并且不会刷新应用程序页面。我想它显示了一个按钮或其他东西,让学生可以得到一张票。

    否则,“noMoreTikets()”的 javascript 触发器将进入“dynamicDiv”。

    【讨论】:

    • 感谢您的回答。好吧,不,我在任何地方都没有桌子。我只需要从包含number_of_tickets_able 的数据库中获取一行,然后,如果该数字为0,则立即将用户发送到另一个页面,说没有更多的票。换句话说,我认为我应该每秒刷新一次页面,因为学生会立即提出请求。大约有 100 张门票和大约 2,000 名学生,我担心某处的 echo 会显示 number_of_tickets_abe,我不希望学生看到。
    • 我更新了我的答案...现在更具体地满足您的需求。 ;)
    • var checkInterval = setInterval(function(){ checkTicket(); },1000); hmm.. 如果后端发送响应的时间超过 1 秒怎么办?只有在收到前一个请求时才应发出新请求。
    【解决方案2】:

    服务器端

    假设您需要定期检查 $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 sn-p。全局用于存储值(应该避免使用全局,但这只是为了示例的目的)

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

    函数 - 提前终止 - 安排自己(使用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/

    【讨论】:

    • 一些事情。所以,我不需要onkey?另外,我需要票据变量以确保它不是 0...我可以在任何我想要的地方使用它吗?最后,O 听说使用 Ajax,我需要在我的功能上 echo 一些东西(强制 echo)?
    • “我不需要onkey”我不知道,这取决于你需要做什么。提供的 sn-p 每 5 秒获取一次值。您也可以调整代码以在事件发生时获取值。当我使用全局来存储获取的值时,它可以从代码中的任何位置使用,但是在获取值时“做某事”更为可取。 ---“我需要echo...”当然,您需要通过响应将值传递给客户端脚本,然后您就可以响应结果。
    • 这就是问题所在,用户看不到剩余的票数。有没有办法让我无法回显剩余的门票数量?
    • 在服务器端 php 脚本上计算 tickets left 并回显该值。客户端脚本定期(或当您决定发生特定事件时)调用php脚本并更新网页上tickets left的计数
    • 我只是更困惑lol ...也许我的问题不够清楚....我会尝试编辑,看看我是否有明确的答案。这不是你的错......只是我无法想象这个答案与我的代码一起使用
    猜你喜欢
    • 1970-01-01
    • 2014-07-20
    • 2023-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    • 2016-12-08
    相关资源
    最近更新 更多