我之前设计了我正在开发的网站,这样我就可以查询数据库以获取每页所需的信息,但是在实现了一个需要每个页面上每个表格中的每个单元格的功能之后(哦,男孩),我意识到出于优化目的,我应该将它组合成一个大型数据库查询并将每个表放入一个数组中,从而减少 SQL 调用。
问题出现在我希望这个数组在数据库中包含跳过的 ID(主键)的地方。当然,我会尽量避免丢失行/ID,但我不会管理这些数据,我希望系统足够聪明,可以解决此类问题。
我的方法开始很简单:
//Run query
$localityResult = mysql_query("SELECT id,name FROM localities");
$localityMax = mysql_fetch_array(mysql_query("SELECT max(id) FROM localities"));
$localityMax = $localityMax[0];
//Assign table to array
for ($i=1;$i<$localityMax+1;$i++)
{
$row = mysql_fetch_assoc($localityResult);
$localityData["id"][$i] = $row["id"];
$localityData["name"][$i] = $row["name"];
}
//Output
for ($i=1;$i<$localityMax+1;$i++)
{
echo $i.". ";
echo $localityData["id"][$i]." - ";
echo $localityData["name"][$i];
echo "<br />\n";
}
两个注意事项:
是的,我可能应该将该 $localityMax 检查移至 PHP 循环。
我故意跳过第一个数组键。
这里的问题是没有考虑到数据库中任何丢失的键,所以它最终会像这样输出(示例表):
- 1 - 托克
- 2 - 朱诺
- 3 - 安克雷奇
- 4 - 纳什维尔
- 7 - 查塔努加
- 8 - 孟菲斯
- -
- -
当找不到该行时,我想写“错误”或 NULL 或其他内容,然后继续而不中断事情。我发现我可以检查 $i 是否小于 $row[$i] 以查看该行是否被跳过,但我不确定当时如何更正它。
如果需要,我可以提供更多信息或示例数据库转储。我只是在这个问题上停留了几个小时,我尝试过的没有任何工作。如果我犯了任何严重的错误,我将非常感谢您的帮助和一般反馈。谢谢!
编辑:我已经解决了!首先,遍历数组以设置 NULL 值或“错误”消息。然后,在分配中,在 mysql_fetch_assoc() 调用之后立即将 $i 设置为 $row["id"]。完整的代码如下所示:
//Run query
$localityResult = mysql_query("SELECT id,name FROM localities");
$localityMax = mysql_fetch_array(mysql_query("SELECT max(id) FROM localities"));
$localityMax = $localityMax[0];
//Reset
for ($i=1;$i<$localityMax+1;$i++)
{
$localityData["id"][$i] = NULL;
$localityData["name"][$i] = "Error";
}
//Assign table to array
for ($i=1;$i<$localityMax+1;$i++)
{
$row = mysql_fetch_assoc($localityResult);
$i = $row["id"];
$localityData["id"][$i] = $row["id"];
$localityData["name"][$i] = $row["name"];
}
//Output
for ($i=1;$i<$localityMax+1;$i++)
{
echo $i.". ";
echo $localityData["id"][$i]." - ";
echo $localityData["name"][$i];
echo "<br />\n";
}
感谢大家的帮助!