【问题标题】:Convert MySQL query loop to PHP array (table)将 MySQL 查询循环转换为 PHP 数组(表)
【发布时间】: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.

标签: php html mysql arrays


【解决方案1】:

你需要一个像 where 一样有索引的数组

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" )];

【讨论】:

    【解决方案2】:

    您可以使用以下代码将 DB 中的所有数据直接转换为 php 数组:

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

    可能适用于您的代码:

    while(($dataToPHP[] = $result2-&gt;fetch_assoc()) || array_pop($dataToPHP))

    看看它使用print_r($dataToPHP)

    要管理错误die('There was an error running the query [' . $db-&gt;error . ']');if ($row3 == 0) { echo "&lt;td style=\"background-color: #A3CD81\"&gt;" . $col1 . "&lt;/td&gt;";} 进行着色,您需要进行一些测试才能正确管理。

    【讨论】:

    • 谢谢你,让我走上了正确的道路,现在一切正常:)
    猜你喜欢
    • 2015-02-20
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 2023-02-05
    • 1970-01-01
    • 2021-08-29
    • 2013-08-08
    • 2015-02-15
    相关资源
    最近更新 更多