2015-05-13 33 views
0

我有一個系統通過數據庫查看,創建一個指定大小的表,然後用滿或空填充單元格,這取決於數據庫中是否有數據具體位置。將MySQL查詢循環轉換爲PHP數組(表)

目前它的工作方式是對每個單元格執行SQL查詢然後填充,但我在數據庫中有超過30,000個記錄,即使使用LIMIT 1,它仍然需要大約5秒來加載表格。

我想知道如果將整個內容轉儲到一個PHP數組中,然後查詢這種方式會更好,但不能找出排序的最佳方法,歡迎提供任何提示。

電流(工作)代碼:

echo <<<EOD 
<table class="racktable"><tr> 
<td colspan ="$colspan">Rack Details </td> 
</tr> 
<tr> 
<td colspan ="$colspan"><center><a href="edit-rack.php?rack=$rackID">Edit Rack</a>/<a href="edit.php?query=emptyr&rack=$rackno&location=$location&user=$user">Empty Rack</a>/<a href="edit.php?query=delrack&rack=$rackID&user=$user&loc=$location">Delete Rack</a></center> </td> 
</tr> 
EOD; 
//Loop through rows, creating a <tr> for each in the table 
    for ($row1 = 1; $row1 <= $rows; $row1++) { 
    echo <<<EOD 
    <tr><td><a name="$row1"></a>$row1</td> 
EOD; 
    //Loop through columns creating <td> within <tr> 
    for ($col1 = 1; $col1 <= $columns; $col1++) { 
     $sql2 = "SELECT ID, sample, rack, srow, col, location FROM samples WHERE srow = $row1 and col = $col1 and location = '$location' and rack = '$rack' LIMIT 1"; 
     if (!$result2 = $db->query($sql2)) { 
     die('There was an error running the query [' . $db->error . ']'); 
     } 
     $row3 = $result2->num_rows; 
     //If location is empty, colout green 
     if ($row3 == 0) { 
     echo "<td style=\"background-color: #A3CD81\">" . $col1 . "</td>"; 
     } 
     else { 
      //Location is not empty, colour red and link to sample 
     while ($row2 = $result2->fetch_assoc()) { 
      $columns1 = $row2['col']; 
      $ID = $row2['ID']; 
      $tooltip = $row2['sample']; 
      $queryStr = $_SERVER['QUERY_STRING']; 
      $spath = $_SERVER['PHP_SELF'] . "?" . $queryStr . "&sample=" . $ID; 
      echo <<<EOD 
     <td style="background-color: #FF0000" title="$tooltip"><a href="$spath">$col1 <img src="icon.png" style="border: 0" alt=""></a></td> 
EOD; 

     } 
     } 
    } 
    echo "</tr>"; 
    } 
    echo "</table>"; 
+0

與此問題無關;如果您將用戶輸入(GET params,POST數據,任何內容)放入您的SQL查詢中,他們可以根據需要修改該查詢。這是一個嚴重的安全漏洞,你應該立即修復。 [MySQLi準備語句](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)。 –

回答

0

您可以從數據庫中的所有數據直接轉換成PHP數組與此代碼:

while(($PHPToPHP[] = mysql_fetch_assoc($SqlResult)) || array_pop($dataToPHP));

可能是工作中的代碼:

while(($dataToPHP[] = $result2->fetch_assoc()) || array_pop($dataToPHP))

並查看它的用途print_r($dataToPHP)

要管理錯誤die('There was an error running the query [' . $db->error . ']');if ($row3 == 0) { echo "<td style=\"background-color: #A3CD81\">" . $col1 . "</td>";}着色,您需要進行一些測試才能正確管理。

+0

謝謝你,讓我走下正確的道路,現在全部正常工作:) – Andrew

0

你需要用指數數組就像你在那裏

SELECT ID, sample, rack, srow, col, location 
FROM samples 
WHERE srow = $row1 and col = $col1 and location = '$location' and rack = '$rack' 
LIMIT 1"; 

你的數組類似:

$samples = array(
    "$row1:$col1:$location:$rack" => array('id' => $id, 'sample' => $sample 
) 

或者你也可以使用一些哈希陣列如:

$samples = array(
    md5("$row1:$col1:$location:$rack") => array('id' => $id, 'sample' => $sample 
) 

插入所有值一次 - 比得到它像

$val = $samples["$row1:$col1:$location:$rack"]; 
// or from hash array 
$val = $samples[md5("$row1:$col1:$location:$rack")];