Wie kann ich eine Datenbanktabelle in ein Array kopieren, während ich übersprungene IDs berücksichtigt?

StackOverflow https://stackoverflow.com/questions/8812328

Frage

Ich habe zuvor die Website entworfen, an der ich arbeite, damit ich nur die Datenbank nach den Informationen, die ich benötigte Zu Optimierungszwecken sollte ich es zu einer einzelnen großen Datenbankabfrage kombinieren und jede Tabelle in ein Array werfen, wodurch SQL -Anrufe reduziert werden.

Das Problem kommt dort, wo ich dieses Array möchte, dass übersprungene IDs (Primärschlüssel) in die Datenbank aufgenommen werden. Ich werde nicht versuchen, fehlende Zeilen/IDs zu haben, aber ich werde diese Daten nicht verwalten und möchte, dass das System klug genug ist, um solche Probleme wie diese zu berücksichtigen.

Meine Methode beginnt einfach genug:

//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";
}

Zwei Notizen:

  1. Ja, ich sollte wahrscheinlich diesen $ LocalityMax -Scheck in eine PHP -Schleife verschieben.

  2. Ich überspringe absichtlich den ersten Array -Schlüssel.

Das Problem hierfür ist, dass jeder verpasste Schlüssel in der Datenbank nicht berücksichtigt wird, sodass er so ausgibt (Beispieltabelle):

  1. 1 - TOK
  2. 2 - Juneau
  3. 3 - Anchorage
  4. 4 - Nashville
  5. 7 - Chattanooga
  6. 8 - Memphis
  7. -
  8. -

Ich möchte "Fehler" oder NULL oder etwas schreiben, wenn die Zeile nicht gefunden wird, und dann weitermachen, ohne Dinge zu unterbrechen. Ich habe festgestellt, dass ich überprüfen kann, ob $ ich weniger als $ Row [$ i] ist, um zu sehen, ob die Zeile übersprungen wurde, aber ich bin mir nicht sicher, wie ich sie zu diesem Zeitpunkt korrigieren soll.

Ich kann bei Bedarf weitere Informationen oder einen Beispieldatenbank -Dump bereitstellen. Ich bin gerade stundenlang an diesem Problem festgehalten, nichts, was ich ausprobiert habe, ist zu arbeiten. Ich würde Ihre Hilfe und allgemeines Feedback sehr schätzen, wenn ich schreckliche Fehler mache. Vielen Dank!


EDIT: Ich habe es gelöst! Iterieren Sie zunächst das Array durch, um einen Nullwert oder "Fehler" -Meldung festzulegen. Setzen Sie dann in den Zuweisungen $ i bis $ row ["id"] direkt nach dem Anruf von mySQL_Fetch_assoc () fest. Der vollständige Code sieht so aus:

//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";
}

Danke für die Hilfe für alle!

War es hilfreich?

Lösung

Primärschlüssel müssen in MySQL eindeutig sein, sodass Sie maximal eine mögliche leere ID erhalten, da MySQL nicht zulassen, dass doppelte Daten eingefügt werden.

Wenn Sie mit einer Spalte arbeiten würden, die kein primärer oder eindeutiger Schlüssel ist, müsste Ihre Abfrage das einzige sein, was sich ändern würde:

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

oder

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

Bearbeiten: Erstellt eine neue Antwort basierend auf der Klarstellung von OP. Wenn Sie eine numerische Sequenz haben, die Sie ungebrochen halten möchten, und möglicherweise Zeilen aus der Datenbanktabelle fehlen, können Sie den folgenden (einfachen) Code verwenden, um Ihnen das zu geben, was Sie benötigen. Verwenden Sie dieselbe Methode, Ihre $i = ... könnte tatsächlich auf die erste ID in der Sequenz aus der DB eingestellt werden, wenn Sie nicht bei der ID beginnen möchten: 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";
}

Andere Tipps

Nachdem du deine bekommen hast $localityResult, Sie könnten alle IDs in ein Array stellen, dann vor Ihnen echo $localityDataStuff, Nachsehen

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

Zu machen $your_locality_id_array:

$locality_id_array = array();
foreach($localityResult as $locality) {
  $locality_id_array[] = $locality['id'];
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top