【发布时间】:2015-07-24 11:32:35
【问题描述】:
我有一个系统,它可以查看数据库,创建一个指定大小的表,然后根据数据库中是否有针对该特定位置的数据,用满或空填充单元格。
目前,它通过对每个单元格执行 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>";
【问题讨论】:
-
与此问题无关;如果您像这样将用户输入(GET 参数、POST 数据等)放入您的 SQL 查询中,他们可以根据需要修改该查询。这是一个严重的安全漏洞,您应该立即修复。 MySQLi prepared statements.