2012-12-23 98 views
2

晚上好。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查詢循環,但MINMAX循環幾乎完全相同。

很明顯,這不起作用,因爲它只爲每組查詢分配一個變量,而不是每個循環的4個變量。

正如你可以想象的,我想要做的是將所有12個值分配給單個變量,以便我可以在我的畫布腳本中使用它們。我不完全確定我是如何去解決這個問題的。

我可以通過MySQLi回顯單個值,或者我可以通過MySQLi查詢數據庫以更改或添加數據,但試圖創建一個循環來完成我想要的MySQLi(甚至是MySQL),這是我需要的幫助。

+0

你有沒有考慮動態生成的查詢和使用單個查詢,而不是很多疑問?如果沒有,我可能會告訴你這是如何完成的。 –

+0

關於這一點:「請注意,最後的6條if語句僅僅確保那些爲null的字段自動設置爲0 ...」如果將列定義爲NOT NULL DEFAULT'0'這樣,空列將始終具有可預測的值,並且可以跳過所有if()語句! –

+0

@MichaelBerkowski:這可能是正確的建議! –

回答

1

從我讀取您的代碼時,您有固定數量的列並知道它們的名稱,並且您正在將AVG(), MIN(), MAX()聚合應用於同一聚合組中的同一表,並且沒有應用WHERE子句。因此,他們都可以在中完成一個查詢,您只需從中獲取一行。

SELECT 
    AVG(Temp0) AS a0, 
    MIN(Temp0) AS min0, 
    MAX(Temp0) AS max0, 
    AVG(Temp1) AS a1, 
    MIN(Temp1) AS min1, 
    MAX(Temp1) AS max1, 
    AVG(Temp2) AS a2, 
    MIN(Temp2) AS min2, 
    MAX(Temp2) AS max2, 
    AVG(Temp3) AS a3, 
    MIN(Temp3) AS min3, 
    MAX(Temp3) AS max3 
FROM VTempStats 

這可以在單個調用來完成對$mysqli->query(),所以你並不需要的prepare()開銷沒有參數結合是必要的。需要調用fetch_assoc()來檢索單行,像上面所做的那樣,列的別名類似a0, min0, max0, etc...

// Fetch one row 
$values = $result_resource->fetch_assoc(); 
print_r($values); 
printf("Avg 0: %s, Min 0: %s, Max 0: %s... etc....", $values['a0'], $values['min0'], $values['max0']); 

這些可拉成全球範圍內與extract(),但我建議針對。保持它們在$values數組中使得它們的源更加明確。

+0

2個奇妙的答案,但這是最簡單的工作。我想補充說,使用'$ query'作爲你在那裏列出的SQL,然後分配'$ stmt = $ mysqli-> query($ query); $ stmt-> execute;'並調用'$ values = $ stmt-> fetch_assoc();'正是需要的! –

1

正如你可以想象的,我想要做的是將所有12個值分配給單個變量,以便我可以在我的畫布腳本中使用它們。我不完全確定我是如何去解決這個問題的。

瞭解。這是我會做的。

<?php // RAY_temp_scottprichard.php 
error_reporting(E_ALL); 
echo '<pre>'; 

// RANGE OF TEMPS 
$temps = range(0,3); 

// RANGE OF VALUES 
$funcs = array 
('A' => 'AVG' 
, 'B' => 'MIN' 
, 'T' => 'MAX' 
) 
; 

// CONSTRUCT THE QUERY STRING 
$query = 'SELECT '; 
foreach ($temps as $t) 
{ 
    foreach ($funcs as $key => $func) 
    { 
     $query .= PHP_EOL 
     . $func 
     . '(Temp' 
     . $t 
     . ') AS ' 
     . 'T' 
     . $t 
     . $key 
     . ', ' 
     ; 
    } 
} 

// DECLOP THE UNWANTED TRAILING COMMA 
$query = rtrim($query, ', '); 

// ADD THE TABLE NAME 
$query .= ' FROM VTempStats'; 

// ADD ANY ORDER, LIMIT, WHERE CLAUSES HERE 
$query .= ' WHERE 1=1'; 

// SHOW THE WORK PRODUCT 
var_dump($query); 

看到輸出的查詢字符串這裏:http://www.laprbass.com/RAY_temp_scottpritchard.php

當您運行此查詢,您將獲取一個排,* mysql_fetch_assoc()*或等效的,它將擁有所有你想要的變量行,帶有命名鍵。然後你可以使用這樣的東西將變量名和值注入到腳本中。 http://php.net/manual/en/function.extract.php

PHP extract()允許使用前綴,因此您應該能夠避免對現有腳本進行太多更改。

HTH,雷〜