【发布时间】:2020-04-09 07:22:02
【问题描述】:
我已将数据导入到表中,现在我正在使用 PHP 使用以下代码访问该数据,
<?php
require_once 'connect.php';
$query = "SELECT * FROM JunkData";
$result = $conn->query($query);
if(!$result) die("Fatal Error");
$rows = $result->num_rows;
for ($name = 0; $name < $rows; ++$name)
{
$row = $result->fetch_array(MYSQLI_ASSOC);
echo htmlspecialchars($row['Name']) . '<br/>';
}
$result->close();
$conn->close();
这行得通!
我真的很好奇为什么添加第二个 for 循环不起作用,除非我再次声明 $result?
<?php
require_once 'connect.php';
$query = "SELECT * FROM JunkData";
$result = $conn->query($query);
if(!$result) die("Fatal Error");
$rows = $result->num_rows;
for ($name = 0; $name < $rows; ++$name)
{
$row = $result->fetch_array(MYSQLI_ASSOC);
echo htmlspecialchars($row['Name']) . '<br/>';
}
for ($number = 0; $number < $rows; ++$number)
{
$row = $result->fetch_array(MYSQLI_ASSOC);
echo htmlspecialchars($row['Number']) . 'Flag<br/>';
}
$result->close();
$conn->close();
不起作用,尽管“标志”被打印了适当的次数。
而如果我再次声明 $result。
<?php
require_once 'connect.php';
$query = "SELECT * FROM JunkData";
$result = $conn->query($query);
if(!$result) die("Fatal Error");
$rows = $result->num_rows;
for ($name = 0; $name < $rows; ++$name)
{
$row = $result->fetch_array(MYSQLI_ASSOC);
echo htmlspecialchars($row['Name']) . '<br/>';
}
$result = $conn->query($query);
for ($number = 0; $number < $rows; ++$number)
{
$row = $result->fetch_array(MYSQLI_ASSOC);
echo htmlspecialchars($row['Number']) . '<br/>';
}
$result->close();
$conn->close();
代码确实有效。
我尝试使用 unset($row) 等取消设置一些变量,如果删除该行,我确实注意到了,
$row = $result->fetch_array(MYSQLI_ASSOC);
从第二个 for 循环开始,它将在循环运行时打印 Number 列中的最后一个值。
我希望这是可以理解的。我想知道如果我想针对它运行第二个 for 循环,我需要重新声明 $result 的代码中发生了什么。
【问题讨论】:
-
为什么你运行相同的查询两次,每次只得到 1 列?您可以将两个循环组合起来,然后将两列都放在同一个 for 循环中吗?你让自己变得比需要的更困难和效率更低
-
正如@AFriend 所说,考虑到您使用完全相同的数据,为什么不将两个
echo放在同一个for循环中? -
我确实理解这个推理,并且看到我在这里编码的方式过于复杂。这是尝试使用重复来尝试理解代码的尝试,这使我在代码中找到了我看不到原因的问题。我在这里问过,并得到了很好的答案。 @Felippe Duarte 解释了一个我不知道的概念,我很感激我在这里得到的帮助。的确,我会自己重写代码,但我已经深入了解了代码的作用。