Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Eindeutige ID in PHP (MySQL) erzeugen?

Frage Entwicklung PHP

Mitglied: StefanKittel

StefanKittel (Level 4) - Jetzt verbinden

04.02.2011, aktualisiert 17.02.2011, 7956 Aufrufe, 6 Kommentare, 1 Danke

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.
Mitglied: maretz
05.02.2011 um 08:54 Uhr
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....
Bitte warten ..
Mitglied: StefanKittel
05.02.2011 um 10:23 Uhr
Zitat von maretz:
Da darf in der Zeit niemand an der Tabelle drehen - das verhindert dein DBMS....
Moin, und das ist mein Problem
Es sind mehrere Computer in verschiedenen Netzwerken die keine Verbindung untereinander haben.
Einzige zentrale Instanz ist ein Debian Webserver mit PHP, MySQL (nur via PHP) und FTP.
Es besteht die, wenn auch sehr sehr geringe Möglichkeit, dass zwei PCs mit dem gleichen Namen zur gleichen Uhrzeit einen Datensazu anlegen möchten.

Ich werde es wohl über FTP lösen. Datei öffnen mit Share Deny all (Also Zugriff für alle anderen Verweigern).

Ich findes es nur komisch, dass die Unique Funktion bei PHP das nicht kann und dass es beim MySQL Keine Funktion gibt welche einen Datensatz anlegt und dessen ID zurückgibt.
Ich hatte gehoffe ich wäre nur zu blind.

Stefan
Bitte warten ..
Mitglied: Dani
05.02.2011 um 13:52 Uhr
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
Bitte warten ..
Mitglied: StefanKittel
05.02.2011 um 13:54 Uhr
Hallo Dani,
perfekt.

Danke!

Stefan
Bitte warten ..
Mitglied: dog
05.02.2011 um 14:13 Uhr
PHP ist kein Multithreading-System und 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
Bitte warten ..
Mitglied: StefanKittel
05.02.2011 um 14:58 Uhr
Hallo dog,
schick, in meiner doku stand das nicht.
Es kam mir gleich so komisch vor, denn auf hochfrequentierten Systemen (Server von Amazon z.B.) würde das sonst ja gar nicht funktionieren.
Danke
Stefan
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

PHP
gelöst PHP-MySQL - mysqli liefert einen Datensatz zu wenig (3)

Frage von Windows-Spieler zum Thema PHP ...

PHP
gelöst PHP statements mit PHp erzeugen (4)

Frage von Lorderich zum Thema PHP ...

Heiß diskutierte Inhalte
Microsoft
Ordner mit LW-Buchstaben versehen und benennen (20)

Frage von Xaero1982 zum Thema Microsoft ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...

Festplatten, SSD, Raid
M.2 SSD wird nicht erkannt (14)

Frage von uridium69 zum Thema Festplatten, SSD, Raid ...