# mysql: insert und gleichzeitig select ?



## alex0815 (5. September 2002)

ich möchte mit PHP einen Eintrag in eine mysqldb machen. dabei soll der benutzer aber auch gleich eine ID zu seinem Eintrag zugewiesen bekommen. 
Wenn mit insert der Eintrag gemacht wird, kommt aber nur ein Boolscher Wert zurück, der mir sagt, obs geklappt hat. 
Wie kann ich also am besten herausfinden welche Nummer mein Datensatz in der DB hat? 
(ich gehe von einer Tabelle aus, die einen Primary Key mit auto_increment hat)
Ist es sinnvoll, den Primary Key als wiedererkennungsmerkmal dem Benutzer zu übergeben? 
Welche Alternativen gibt es hierbei?

Thx!


----------



## DMGAzrael (5. September 2002)

wenn ich das richtig verstanden habe, erstellst du einen neuen eintrag in deiner datenbank und willst wissen, der wievielte das ist?

dazu lässt du mysql einfach alle einträge zählen, also mit


```
$befehl="select * from tabelle";
$daten=mysql_query($befehl);
$id=mysql_num_rows($daten);
```

dann hast die id des letzten eintrags in $id gespeichert


war das, was du wissen wolltest?


----------



## alex0815 (5. September 2002)

theoretisch sollte das schon klappen. aber was ist, wenn genau in diesem Augenblick jemand anders auch einen Eintrag in die DB macht? 
Dann bekommt derjenige User eine falsche ID mitgeteilt. 
Hmm... ich könnte es auch mit einem Timestamp machen. Da ist die wahrscheinlichkeit geringer, dass ein anderer User grade reinpfuscht. Dann sieht die ID auch nicht so doof aus (z.B. Inserat Nr. 0001)
Was meinst du dazu?


----------



## Dario Linsky (5. September 2002)

auto_increment ist schrott, damit hat man nur probleme, wenn man mal datensätze löscht. bau dir den primärschlüssel lieber selbst zusammen. den neuen primärschlüssel errechnest du aus dem bisher höchsten primärschlüssel in der datenbank und addierst 1 dazu.
wenn du dann einen neuen datensatz in die tabelle einfügst, dann vergibst du einen primärschlüssel, der dann zu dem zeitpunkt der höchste in der tabelle ist.
also baust du dir einfach eine abfrage zusammen, bei der nur die datensätze zurückgegeben werden, bei denen der primärschlüssel kleiner-gleich dem gerade hinzugefügten ist:

```
SELECT * FROM tabelle WHERE id <= ***
```
für *** setzt du dann natürlich den primärschlüssel ein, den du dir gerade errechnet hast. damit hast du dann alle datensätze bis zum zeitpunkt deines eintrags.


----------



## DMGAzrael (6. September 2002)

eigentlich ist die gefahr, dass jemand genau zeitgleich mit dir (nach unix - zeit) einen eintrag vornehmen will
praktisch null, oder irr ich mich da?

ich hab da noch ne idee, allerdings ein wenig umständlicher (unprofessioneller) als die vorherige, aber dann kannst du ohne probleme user löschen, ohne dass 2 die gleiche id bekommen:

1; du erstellst eine textdatei:  anzahl_user.txt
2; du schreibst 0 hinein, speicherst und lädst sie auf den server
3; beim anmelden wird die datei ausgelesen, der wert um 1 erhöht, wieder abgespeichert

dann hast du deine id, die du in den datensatz einspeicherst


----------



## Maximka (6. September 2002)

Leutz und was haltet ihr einfach von der Funktion *mysql_insert_id*?

http://www.php.net/manual/de/function.mysql-insert-id.php


----------

