PHPKram: mysql_insert_id()

Beitrag lesen

Warum willst du das auf diese unsichere Art machen? Warum fügst du nicht einfach den Datensatz ein und liest dann die dafür vergebene ID über mysql(i)_insert_id() aus?

Weil dafür erstmal ein Datensatz eingefügt werden müsste. Ich habe das aber bisher so gemacht, dass alle einzutragenden Daten einzeln eingetragen werden, da ich im vorhinein nicht weiß welche Daten vorhanden sind und wieviele. Also: Erst neue itemID bekommen, und dann einzeln die vorhandenen Daten eintragen, zugehörig zur itemID, die gerade erstellt wurde.

Warum hast du getrennte Tabellen, wenn anscheinend zu jedem Datensatz exakt ein einzelner Datensatz in anderen Tabellen vorhanden ist? Und warum soll der leer vorbereitet werden? Beim Abfragen bringt das keine Vorteile. Zum einen sind Joins erforderlich, zum anderen sieht man nicht vorhandene Werte auch beim (Left) Join. Wenn du Daten nicht auf einmal sondern stückweise in die Felder schreiben willst, dann kannst du INSERT ... ON DUPLICATE KEY UPDATE ... verwenden, ohne immer zusätzlich auf die Existenz zu prüfen.

Ich habe getrennte Tabellen, weil pro Tabelle nicht nur itemID und ein weiterer Datensatz vorhanden sind, sondern bis zu mehreren Dutzend. Will heißen es handelt sich hier durchaus um eine sehr große Datenbank! Alles in eine table zu klatschen wäre absolut daneben. Leer vorbereiten war von mir nur eine Idee, um nachher Statements der Art UPDATE... WHERE itemID = '$itemID' ausführen zu können - da ich ja vor dem Eintragen der eigentlichen Daten eine neue itemID bekomme und danach erst die Daten eintrage. Ablauf wäre also folgender:

1. Schaue nach was die aktuelle itemID ist
2. itemID += 1
3. schreibe in alle Tabellen in eine neue row schonmal die itemID rein, lasse die anderen Felder leer
4. Füge die vorhandenen Daten alle nach dem Muster UPDATE ... WHERE itemID = '$itemID' rein.

Kommen die Daten denn kleckerweise oder stehen sie alle auf einmal zur Verfügung? Wenn du mal diese und mal jene Felder übergeben bekommst, dann iterier doch über all die aktuell vorhandenen Informationen, vergleiche mit eine Liste an erlaubten Feldnamen und füge sie in eines temporäres Array ein. Aus diesem baust du dann das Statement zusammen (mit implode() über die Keys für die Feldnamen und über die Werte für den VALUES-Teil).

Die Daten stehen über $this->Data in einem großen mehrdimensionalem Array zur Verfügung. Und über diese iteriere ich bereits. Will heißen jedes Element von $this->Data[$i][] ist ein weiteres Stück, das in die DB geschrieben wurden muss. Wobei $i hier angibt zu welchem Datensatz das gehört.

Was ich eigentlich nur wissen wollte ist, ob das so wie ich es mir dachte ok ist, oder es bessere Lösungen gäbe.