晚上好。MySQLi循環查詢變量
我目前正在研究一個小型個人項目。它的目的是從後端數據庫中檢索大量值並將它們存儲爲變量。然後使用這些變量修改一些HTML5 Canvas對象的外觀(在這種情況下,我使用的是弧線)。
請注意,數據庫中的值是Text
,因此我的綁定語句引用了這一點。我正在調用的查詢(AVG,MIN,MAX)可以很好地處理字段存儲數值數據時的值(這僅僅是由於另一個處理添加或更新數據的腳本 - 已經運行了MySQLi
,並使用Text
是我的情況的最佳解決方案)。
現在,我用標準的MySQL查詢達到了我想要的效果,但是它的代碼很亂,隨着數據庫的增長,它的性能可能會變得很糟糕。出於這個原因,我想使用循環。我也覺得MySQLi的bind_param
會更好的安全性。該頁面不接受任何用戶輸入,僅用於顯示,因此注入不太受關注,但在將來的某個時刻,我會將其擴展爲允許用戶控制顯示的內容。
下面是我的原始MySQL PHP代碼示例的示例;
$T0A = mysql_query('SELECT AVG(Temp0) FROM VTempStats'); // Average
$T0B = mysql_query('SELECT MIN(Temp0) FROM VTempStats'); // Bottom/MIN
$T0T = mysql_query('SELECT MAX(Temp0) FROM VTempStats'); // Top/MAX
$T1A = mysql_query('SELECT AVG(Temp1) FROM VTempStats'); // Average
$T1B = mysql_query('SELECT MIN(Temp1) FROM VTempStats'); // Bottom/MIN
$T1T = mysql_query('SELECT MAX(Temp1) FROM VTempStats'); // Top/MAX
$r_T0A = mysql_result($T0A, 0);
$r_T0T = mysql_result($T0T, 0);
$r_T0B = mysql_result($T0B, 0);
$r_T1A = mysql_result($T1A, 0);
$r_T1T = mysql_result($T1T, 0);
$r_T1B = mysql_result($T1B, 0);
if ($r_T0A == "") {$r_T0A = 0;}
if ($r_T1A == "") {$r_T1A = 0;}
if ($r_T0B == "") {$r_T0B = 0;}
if ($r_T1B == "") {$r_T1B = 0;}
if ($r_T0T == "") {$r_T0T = 0;}
if ($r_T1T == "") {$r_T1T = 0;}
這比原來更短的,因爲有4×3集的查詢(TEMP0,TEMP1,TEMP2,TEMP3,和最小值,最大值,平均爲每個)的。請注意,最後的6 if
語句只是爲了確保在我的畫布腳本嘗試使用它們之前將空字段自動設置爲0(請參見下文)。要在圓弧上顯示該值,我會在我的畫布腳本中使用此值(例如);
var endAngle = startAngle + (<?= $r_T0A ?>/36+0.02);
它爲我工作,顯示什麼是我期望的。
現在,在試圖清理我的代碼並轉向循環和MySQLi時,我遇到了問題。對SQL和PHP都很新穎,我可以使用一些幫助。
這是我試過的;
$q_avg = "SELECT AVG(Temp?) FROM VTempStats";
for ($i_avg = 0; $i_avg <= 3; ++$i_avg)
{
if ($s_avg = $mysqli->prepare($q_avg))
{
$s_avg->bind_param('s',$i_avg);
$s_avg->execute();
$s_avg->bind_result($avg);
$s_avg->fetch();
echo $avg;
}
}
注:mysqli
是MySQLi的連接。我已將代碼縮減爲僅顯示AVG
查詢循環,但MIN
和MAX
循環幾乎完全相同。
很明顯,這不起作用,因爲它只爲每組查詢分配一個變量,而不是每個循環的4個變量。
正如你可以想象的,我想要做的是將所有12個值分配給單個變量,以便我可以在我的畫布腳本中使用它們。我不完全確定我是如何去解決這個問題的。
我可以通過MySQLi回顯單個值,或者我可以通過MySQLi查詢數據庫以更改或添加數據,但試圖創建一個循環來完成我想要的MySQLi(甚至是MySQL),這是我需要的幫助。
你有沒有考慮動態生成的查詢和使用單個查詢,而不是很多疑問?如果沒有,我可能會告訴你這是如何完成的。 –
關於這一點:「請注意,最後的6條if語句僅僅確保那些爲null的字段自動設置爲0 ...」如果將列定義爲NOT NULL DEFAULT'0'這樣,空列將始終具有可預測的值,並且可以跳過所有if()語句! –
@MichaelBerkowski:這可能是正確的建議! –