0

私は以前、ページごとに必要な情報をデータベースに照会するだけで作業している Web サイトを設計していましたが、すべてのページのすべてのテーブルのすべてのセルを必要とする機能を実装した後 (ああ、少年)、気づきました。最適化のために、これを 1 つの大きなデータベース クエリに結合し、各テーブルを配列に入れることで、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";
}

2 つの注意事項:

  1. はい、おそらくその $localityMax チェックを PHP ループに移動する必要があります。

  2. 最初の配列キーを意図的にスキップしています。

ここでの問題は、データベース内の欠落したキーが考慮されていないため、最終的に次のように出力されることです (サンプル テーブル)。

  1. 1 - トク
  2. 2 - ジュノー
  3. 3 - アンカレッジ
  4. 4 - ナッシュビル
  5. 7 - チャタヌーガ
  6. 8 - メンフィス
  7. -
  8. -

行が見つからない場合は「Error」または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 で一意である必要があります。MySQL では重複データの挿入が許可されないため、取得できる空白 ID は最大 1 つです。

主キーまたは一意のキーではない列を操作している場合、変更する必要があるのはクエリだけです。

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 に答える