[英]how to fetch data from sql server database in php without refreshing the page
我試圖從數據庫中獲取一些數據。 我創建了一個函數,該函數位於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.因為如果是一個那么一些東西必須改變。
我這樣做(在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
服務器端
假設您需要定期檢查$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函數文檔可以在這里找到
我假設你有一個頁面(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中構建你的表...
我指的是您進行數據庫查詢和獲取時的部分。
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腳本是在服務器端執行的。
這就是為什么你的“返回$ ticket;” 什么都沒做。
在這個調用function.php的ajax方式中,它的腳本是單獨執行的,就像單個頁面一樣,與很久以前執行的application.php沒有任何關系。
它生成要提供給客戶端的文本(或javascript)。
如果要將PHP變量傳遞給客戶端javascript,則必須將其作為javascript回顯。
所以在這里,如果PHP變量$ ticket大於零,那么一些文本說仍有可用的票證將顯示在“dynamicDiv”中,並且不會刷新應用程序頁面。 我想它會顯示一個按鈕或某些東西,允許學生獲得一張票。
否則,它將成為“noDoreTikets()”的javascript觸發器,它將落入“dynamicDiv”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.