2013-04-07 35 views
0

我有在$ 的setInterval(文件)的問題。就緒(函數(){}MySQL查詢不上的setInterval

什麼我做的是設置的時間間隔做回最新結果是調用運行MySQL的一些查詢一個PHP腳本來檢查4個開關的狀態,然後更新屏幕中的值在數據庫中,像這樣:

$(document).ready(function(){ 

setInterval(function(){ 

<?php require('fetchSwitchStatuses.php'); ?> 

$("#switch1").css('background', 'rgb(<?php echo $switchColor1 ?>)'); 
$("#switch1").html('<?php echo $switchState1 ?>'); 
$("#switch2").css('background', 'rgb(<?php echo $switchColor2 ?>)'); 
$("#switch2").html('<?php echo $switchState2 ?>'); 
$("#switch3").css('background', 'rgb(<?php echo $switchColor3 ?>)'); 
$("#switch3").html('<?php echo $switchState3 ?>'); 
$("#switch4").css('background', 'rgb(<?php echo $switchColor4 ?>)'); 
$("#switch4").html('<?php echo $switchState4 ?>'); 
    },1000); 

}); 

這裏是fetchSwitchStatuses.php代碼:

$connect = mysqli_connect("localhost", "root", "root"); 
mysqli_select_db($connect, "db_name"); 


$fetch1 = mysqli_query($connect, 
"SELECT SwitchStatus FROM Switches WHERE PinNumber = '3'" 
); 
$fetch2 = mysqli_query($connect, 
"SELECT SwitchStatus FROM Switches WHERE PinNumber = '5'" 
); 
$fetch3 = mysqli_query($connect, 
"SELECT SwitchStatus FROM Switches WHERE PinNumber = '6'" 
); 
$fetch4 = mysqli_query($connect, 
"SELECT SwitchStatus FROM Switches WHERE PinNumber = '9'" 
); 


$i = 1; 

while($row = mysqli_fetch_array(${'fetch'.$i})) 
{ 

    if($row['SwitchStatus'] == 0) 
    { 
     ${'switchColor'.$i} = "255, 0, 0"; 
     ${'switchState'.$i} = "OFF"; 

    } 
    else if ($row['SwitchStatus'] == 1){ 
     ${'switchColor'.$i} = "0, 255, 0"; 
     ${'switchState'.$i} = "ON"; 
    } 
    else { 
     ${'switchColor'.$i} = "100, 100, 100"; 
     ${'switchState'.$i} = "ERROR"; 
    } 
$i++; 
} 


mysqli_close($connect); 

加載頁面時,信息是正確的,數據庫中的任何內容都是屏幕上的顏色反映的。

當我單擊對象來更改值時,將進行所有必要的更改並更新數據庫。但是,間隔重複時出現問題。值被切換回頁面加載時的原始值。因此,儘管數據庫中的信息已正確更改,但由於某些原因,按鈕的顏色始終會重置爲查詢所讀取的第一個值。

我該如何解決這個問題,以便屏幕上反映的信息是準確的?

+0

你更新'$ switchColor1','$ switchColor2'和...數據庫更新後? – Amir 2013-04-07 16:24:23

+0

其實我不認爲我已經在任何地方使用數據庫更新...我有點困惑。那麼,在價值改變之後,你的意思是什麼?這裏是的值中的一個是如何改變的例子: \t $ changeValue = mysqli_query($ CONNECT, \t 「UPDATE交換機 \t SET SwitchStatus = 1 \t WHERE PinNumber = 9」 \t \t ); – Moose 2013-04-07 16:37:59

+0

問題是你在哪裏設置和更新'$ switchColor1'和...? – Amir 2013-04-07 16:42:03

回答

1

使用AJAX技術,您可以: 通過請求頁面(.txt .js .html或甚至php)發送請求並從服務器獲取結果。
所以用AJAX你可以得到一個頁面的結果保存到數據庫的東西,從數據庫中得到的東西,你可以使用會話和任何你可以用PHP文件做的事情。 當您發送AJAX請求以查看頁面(即/userData.php?userId=5)時,頁面/userData.php?userId=5將被執行,並且其輸出將被返回(HTML或只是一個單詞'是「或」否「或」您無法訪問此用戶的信息「)。
您可以使用POST或GET將數據發送到文件。但問題是如何從頁面獲取數據。因爲結果AJAX會給你就是被請求的頁面回顯到頁面這樣

<html> 
…. 
</html> 

或者

‘Yes’ 

或者

<?php echo ‘something’; ?> 

那麼,關於獲取日期的行或很多數據?因爲你唯一得到的是一個文本或者一個長文本。
爲此,您可以使用JSON,它就像嵌套數組一樣。

[ 
{ 
"term": "BACCHUS", 
"part": "n.", 
"definition": "A convenient deity invented by the...", 
"quote": [ 
"Is public worship, then, a sin,", 
"That for devotions paid to Bacchus", 
"The lictors dare to run us in,", 
"And resolutely thump and whack us?" 
], 
"author": "Jorace" 
}, 
… 

而且這也是一個字符串。但是,您可以在jQuery中使用$ .getJSON獲取Data,並且可以像這樣在服務器端生成JSON數據。

<?php 
$arr=array(
‘data’=>’ffff’, 
‘anotherData’=>array(‘rrrrr’,’sssss’); 
); 
Echo json_encode($arr); 
?> 

Json_encode()在PHP得到一個數組並返回它的JSON字符串。我們迴應它。 現在我們可以使用jQuery來獲取將從服務器檢索到的數據。
此部分,如果從
學習jQuery的1.3
更好的互動設計和網頁發展與簡單
的JavaScript技術
喬納森包布
卡爾斯威德伯格

全球jQuery函數
對於這一點,所有的jQuery方法我們用過的附加到我們用$()工廠函數構建的jQuery對象。選擇器允許我們指定一組DOM節點來處理,並且方法以某種方式對它們進行操作。但是,$ .getJSON()函數是不同的。沒有可以應用的邏輯DOM元素;必須將結果對象提供給腳本,而不是注入頁面。由於這個原因,getJSON()被定義爲全局jQuery對象(一個名爲jQuery的對象,或由jQuery庫定義的$)的方法,而不是單個的jQuery對象實例(我們用$ )功能)。
如果JavaScript有類似其他面嚮對象語言的類,我們會調用$ .getJSON()類方法。爲了我們的目的,我們將這種類型的方法稱爲全局函數;實際上,它們是使用jQuery名稱空間的函數,以免與其他函數名稱發生衝突。
要使用此功能,我們通過它之前的文件名如:

$(document).ready(function() { 
$('#letter-b a').click(function() { 
$.getJSON('b.json'); 
return false; 
}); 
}); 

此代碼有當我們點擊的鏈接沒有明顯的影響。函數調用加載文件,但我們沒有告訴JavaScript如何處理結果數據。爲此,我們需要使用回調函數。
的$ .getJSON()函數獲得一個第二個參數,這是一種在加載完成時要調用的函數。如前所述,AJAX調用是異步的,回調提供了一種等待數據傳輸的方式,而不是立即執行代碼。回調函數也需要一個參數,它由結果數據填充。所以,我們可以這樣寫:

$(document).ready(function() { 
$('#letter-b a').click(function() { 
$.getJSON('b.json', function(data) { 
}); 
return false; 
}); 
}); 

這裏我們使用了一個匿名函數作爲我們的回調,因爲在我們爲簡潔的jQuery代碼已經屢見不鮮。可以同樣提供一個命名函數作爲回調函數。
在這個函數中,我們可以根據需要使用數據變量來遍歷數據結構。我們需要迭代頂層數組,爲每個項目構建HTML。我們可以用循環的標準來做到這一點,但我們將引入另一個jQuery的有用全局函數$ .each()。我們在第5章看到了它的對手,.each()方法。這個函數不是使用jQuery對象,而是使用數組或映射作爲第一個參數,並使用回調函數作爲第二個參數。每次遍歷循環時,數組或映射中的當前迭代索引和當前項作爲兩個參數傳遞給回調函數。

$(document).ready(function() { 
$('#letter-b a').click(function() { 
$.getJSON('b.json', function(data) { 
$('#dictionary').empty(); 
$.each(data, function(entryIndex, entry) { 
var html = '<div class="entry">'; 
html += '<h3 class="term">' + entry['term'] + '</h3>'; 
html += '<div class="part">' + entry['part'] + '</div>'; 
html += '<div class="definition">'; 
html += entry['definition']; 
html += '</div>'; 
html += '</div>'; 
$('#dictionary').append(html); 
}); 
}); 
return false; 
}); 
}); 

循環之前,我們空了出來,這樣我們就能和新落成的HTML填充它。然後我們使用$ .each()依次檢查每個項目,並使用入口映射的內容構建HTML結構。最後,我們把這個HTML附加到一個DOM樹中。

這種方法假定該數據是HTML安全食用;例如,它不應該包含任何流浪的<字符。

+0

聖牛,謝謝你這是偉大的!我現在要仔細閱讀這個(現在已經過了一半了)!我非常感謝你幫助我的時間= D – Moose 2013-04-07 18:44:46

+0

你是否推薦使用這種方法或使用websockets? – Moose 2013-04-07 18:47:29

+1

你的受歡迎的人。你可以給我一些支持我的愛(如果你認爲它的正確和有用,請投我的答案和評論並接受我的回答) – ncm 2013-04-07 18:50:09