0

我之前设计了我正在开发的网站,这样我就可以查询数据库以获取每页所需的信息,但是在实现了一个需要每个页面上每个表格中的每个单元格的功能之后(哦,男孩),我意识到出于优化目的,我应该将它组合成一个大型数据库查询并将每个表放入一个数组中,从而减少 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";
}

两个注意事项:

  1. 是的,我可能应该将该 $localityMax 检查移至 PHP 循环。

  2. 我故意跳过第一个数组键。

这里的问题是没有考虑到数据库中任何丢失的键,所以它最终会像这样输出(示例表):

  1. 1 - 托克
  2. 2 - 朱诺
  3. 3 - 安克雷奇
  4. 4 - 纳什维尔
  5. 7 - 查塔努加
  6. 8 - 孟菲斯
  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";
}

感谢大家的帮助!

4

2 回答 2

0

在你得到你的之后$localityResult,你可以把所有的 id 放在一个数组中,然后在你之前echo $localityDataStuff,检查一下

if(in_array($i, $your_locality_id_array)) {
  // do your echoing
} else {
  // echo your not found message
}

制作$your_locality_id_array

$locality_id_array = array();
foreach($localityResult as $locality) {
  $locality_id_array[] = $locality['id'];
}
于 2012-01-11T00:08:12.713 回答
0

MySQL 中的主键必须是唯一的,因此您将获得最多一个可能的空白 ID,因为 MySQL 不允许插入重复数据。

如果您使用的列不是主键或唯一键,则您的查询需要是唯一会更改的内容:

SELECT id, name FROM localities WHERE id != "";

或者

SELECT id, name FROM localities WHERE NOT ISNULL(id);

编辑:根据 OP 的说明创建了一个新答案。如果您有一个想要保持不间断的数字序列,并且数据库表中可能缺少行,您可以使用以下(简单)代码来满足您的需求。使用相同的方法,$i = ...如果您不想从 ID: 开始,实际上可以将您设置为 DB 序列中的第一个 ID 1

$result = mysql_query('SELECT id, name FROM localities ORDER BY id');

$data = array();
while ($row = mysql_fetch_assoc($result)) {
    $data[(int) $row['id']] = array(
        'id'   => $row['id'],
        'name' => $row['name'],
    );
}

// This saves a query to the database and a second for loop.
end($data); // move the internal pointer to the end of the array
$max = key($data); // fetch the key of the item the internal pointer is set to

for ($i = 1; $i < $max + 1; $i++) {
    if (!isset($data[$i])) {
        $data[$i] = array(
            'id'   => NULL,
            'name' => 'Erorr: Missing',
        );
    }

    echo "$i. {$data[$id]['id']} - {$data[$id]['name']}<br />\n";
}
于 2012-01-11T00:21:37.840 回答