Eindeutige ID in PHP (MySQL) erzeugen?
Hallo,
ich möchte gerne sicherheitstechnisch unkritische Einträge in einer Datenbank speichern.
Jeder Datensatz soll eine eindeutige ID haben.
Jetzt bin ich ein bischen genervt, dass das scheinbar nirgendwo vorgesehen ist.
Ich habe genügend Beispiele mit denen sich IDs erzeugen lassen wo es 100 mal wahrscheinlicher ist im Lotto zu gewinnen, aber nicht Null.
1) Autoincrement Wert einer MySQL Datenbank. Der ist definitiv eindeutig.
Aber ich bekomme die IDs meinen Datensatzes ja nur über mysql_insert_id erhalten. Also die ID des zuletzt angefügten Eintrages.
Bei einem Multithreadingsystem kann es aber doch passieren, das zwischen hinzufügen und auslesen woanders noch ein Eintrag hinzugefügt wird.
2) PHP Unique basiert auf der Zeit in Mikrosekunden. Auch da ist es nicht unmöglich, dass dieses doppelt vorkommt.
PCNamen des Clients, Laufzeit des Clients: Alles ist nicht eindeutig.
Die Kombination aus PCNamen des Clients, Laufzeit des Clients, LAN IP, WAN IP, Name des Benutzers, PHP Unique
Alles schon recht unwahrscheinlich, aber nicht Null....
Ist alles theoretisch, aber warum kann php unique nicht über eine CriticalSection nach dem Erzeugen einfach eine Mikrosekunde warten?
Gibt es sowas?
Danke
Stefan
PS: Eine CriticalSection ist eine Funktion die dafür sorgt, dass eine Routine nur einmal zur Zeit aufgerufen werden kann.
ich möchte gerne sicherheitstechnisch unkritische Einträge in einer Datenbank speichern.
Jeder Datensatz soll eine eindeutige ID haben.
Jetzt bin ich ein bischen genervt, dass das scheinbar nirgendwo vorgesehen ist.
Ich habe genügend Beispiele mit denen sich IDs erzeugen lassen wo es 100 mal wahrscheinlicher ist im Lotto zu gewinnen, aber nicht Null.
1) Autoincrement Wert einer MySQL Datenbank. Der ist definitiv eindeutig.
Aber ich bekomme die IDs meinen Datensatzes ja nur über mysql_insert_id erhalten. Also die ID des zuletzt angefügten Eintrages.
Bei einem Multithreadingsystem kann es aber doch passieren, das zwischen hinzufügen und auslesen woanders noch ein Eintrag hinzugefügt wird.
2) PHP Unique basiert auf der Zeit in Mikrosekunden. Auch da ist es nicht unmöglich, dass dieses doppelt vorkommt.
PCNamen des Clients, Laufzeit des Clients: Alles ist nicht eindeutig.
Die Kombination aus PCNamen des Clients, Laufzeit des Clients, LAN IP, WAN IP, Name des Benutzers, PHP Unique
Alles schon recht unwahrscheinlich, aber nicht Null....
Ist alles theoretisch, aber warum kann php unique nicht über eine CriticalSection nach dem Erzeugen einfach eine Mikrosekunde warten?
Gibt es sowas?
Danke
Stefan
PS: Eine CriticalSection ist eine Funktion die dafür sorgt, dass eine Routine nur einmal zur Zeit aufgerufen werden kann.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 160179
Url: https://administrator.de/forum/eindeutige-id-in-php-mysql-erzeugen-160179.html
Ausgedruckt am: 02.04.2025 um 18:04 Uhr
6 Kommentare
Neuester Kommentar
Naja - du kannst ja schon einiges machen.
Entweder generierst du dir im Programm eine eindeutige ID (z.B. Millisekunden und die PID des Threads, einer eindeutigen Thread-ID o.ä.). Oder du nutzt z.B. Transaktionen. Diese kann ja z.B. beinhalten:
start-transaktion
trage Datensatz in Tabelle 1 ein
lese ID des Datensatzes nochmal aus
trage Datensatz inkl. ID in Tabelle 2 ein
ende-transaktion
Da darf in der Zeit niemand an der Tabelle drehen - das verhindert dein DBMS....
Entweder generierst du dir im Programm eine eindeutige ID (z.B. Millisekunden und die PID des Threads, einer eindeutigen Thread-ID o.ä.). Oder du nutzt z.B. Transaktionen. Diese kann ja z.B. beinhalten:
start-transaktion
trage Datensatz in Tabelle 1 ein
lese ID des Datensatzes nochmal aus
trage Datensatz inkl. ID in Tabelle 2 ein
ende-transaktion
Da darf in der Zeit niemand an der Tabelle drehen - das verhindert dein DBMS....
Hi Stefan,
du hast die Möglichkeit MySQL-Tabellen für andere Zugriffe zu sperren/entsperren bis der Thread fertig ist. Handbuch.
Grüße,
Dani
du hast die Möglichkeit MySQL-Tabellen für andere Zugriffe zu sperren/entsperren bis der Thread fertig ist. Handbuch.
Grüße,
Dani
PHP ist kein Multithreading-System und
Auch wenn zwischen deinem Insert noch 100 weitere Zeilen von anderen Benutzern kommen gibt es da kein Problem.
http://dev.mysql.com/doc/refman/5.0/es/mysql-insert-id.html
mysql_insert_id
bezieht sich immer auf das letzte INSERT der aktuellen Verbindung.Auch wenn zwischen deinem Insert noch 100 weitere Zeilen von anderen Benutzern kommen gibt es da kein Problem.
The value of mysql_insert_id() is affected only by statements issued within the current client connection. It is not affected by statements issued by other clients.
http://dev.mysql.com/doc/refman/5.0/es/mysql-insert-id.html