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, 8194 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 ..
Ähnliche Inhalte
PHP
gelöst PHP statements mit PHp erzeugen (4)

Frage von Lorderich zum Thema PHP ...

PHP
PHP MySQL Login (7)

Frage von Yanmai zum Thema PHP ...

PHP
MySQL-Abfrage mit php: Wert + true bzw. false (2)

Frage von tomolpi zum Thema PHP ...

PHP
gelöst PHP Grafiken erzeugen und nachher löschen (6)

Frage von tsunami zum Thema PHP ...

Neue Wissensbeiträge
Windows Update

Microsoft Update KB4034664 verursacht Probleme mit Multimonitor-Systemen

(2)

Tipp von beidermachtvongreyscull zum Thema Windows Update ...

Viren und Trojaner

CNC-Fräsen von MECANUMERIC werden (ggf.) mit Viren, Trojanern, Würmern ausgeliefert

(4)

Erfahrungsbericht von anteNope zum Thema Viren und Trojaner ...

Windows 10

Windows 10: Erste Anmeldung Animation deaktivieren

(3)

Anleitung von alemanne21 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
Netzwerkprotokolle
gelöst Leiten "dumme" Switches VLAN-Tags mit durch? (26)

Frage von coltseavers zum Thema Netzwerkprotokolle ...

Netzwerkgrundlagen
Kann auf Freigabe nicht Zugreifen (17)

Frage von leon123 zum Thema Netzwerkgrundlagen ...

Windows Server
gelöst Neues KB für W10 1607 und W2K16 wieder mal nicht im WSUS 3.0, hat das noch jemand? (16)

Frage von departure69 zum Thema Windows Server ...

Windows Server
DC virtualisieren + wie sichern (SingleDC-Environment) (12)

Frage von KMUlife zum Thema Windows Server ...