php-resource



Zurück   PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr > Entwicklung > SQL / Datenbanken
 

Login

 
eingeloggt bleiben
star Jetzt registrieren   star Passwort vergessen
 

 

 


SQL / Datenbanken Probleme mit SQL? Hier könnt ihr eure Fragen zu SQL (MySQL, PostgreSQL, MS-SQL und andere ANSI-SQL Server) los werden.

Antwort
 
LinkBack Themen-Optionen Bewertung: Bewertung: 1 Stimmen, 5,00 durchschnittlich.
  #1 (permalink)  
Alt 06-12-2008, 01:18
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 414
Truncate kann nur auf Besserung hoffen
Standard Schleife solange bis freie ID gefunden wurde

Hallo,

ich generiere eine 32-stellige ID und will diese in die DB schreiben.

Vorher soll aber immer ein Check gemacht werden ob die ID schon vorhanden ist, wenn nicht muss eine neue ID generiert werden.

Wie stell ich das jetzt am Besten an?

Die ID immer mit INSERT einfügen, abfragen ob erfolgreich oder nicht und dann wieder neuprobieren?

So?

while

-generierung
- insert
- abfrage result
- wert setzen falls erfolgreich und raus aus wend... ansonsten nochmal

wend
Mit Zitat antworten
  #2 (permalink)  
Alt 06-12-2008, 12:49
PHP-Desaster
 PHP Expert
Links : Onlinestatus : PHP-Desaster ist offline
Registriert seit: Mar 2006
Beiträge: 3.105
PHP-Desaster befindet sich auf einem aufstrebenden Ast
Standard

Genau so. Wenn du erst mit einem SELECT nachsehen würdest und anschließend deine generierte ID einfügst, könnte es sein, dass die ID inzwischen vergeben ist, das müsstest du dann zusätzlich abfangen. Da kannst du besser einen UNIQUE-Constraint auf die Spalte setzen (hast du ja wahrscheinlich eh schon) und dann nach der Query entsprechend kontrollieren, ob dieser Constraint verletzt wurde und mit einer neuen ID erneut versuchen.
Mit Zitat antworten
  #3 (permalink)  
Alt 06-12-2008, 17:53
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 414
Truncate kann nur auf Besserung hoffen
Standard

Hm also so müßte es doch eigentlich funktionieren oder nicht?

Hängt bei mir aber irgendwie...

PHP-Code:
while($ergebnis="1")
                    
{
                        
$dateiname=randompass("3");
mysql_query("INSERT INTO ... VALUES ...");

if(
mysql_affected_rows()==1)
{
$ergebnis="1";}
                        

Was ich auch nicht genau verstehe:

Zitat:
Sie weist PHP an, einen in ihr eingebetteten Befehl so lange zu wiederholen, wie die while-Bedingung als TRUE ausgewertet wird.
vs.

Zitat:
Falls die while-Bedingung bereits beim ersten Mal FALSE ist, werden die Anweisungen der while-Schleife nicht ein einziges Mal durchlaufen.

Geändert von Truncate (06-12-2008 um 17:55 Uhr)
Mit Zitat antworten
  #4 (permalink)  
Alt 06-12-2008, 17:57
ghostgambler
 Master
Links : Onlinestatus : ghostgambler ist offline
Registriert seit: Jul 2004
Ort: DE - NRW
Beiträge: 4.620
ghostgambler ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Dann lies es halt noch drei Mal. Ist jetzt nicht soo schwer, vllt. etwas unglücklich formuliert, dann musst es halt mal genauer lesen.

Was du scheinbar auch nicht verstanden hast:
$ergebnis = 1 vs. $ergebnis == 1
Mit Zitat antworten
  #5 (permalink)  
Alt 06-12-2008, 18:00
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 414
Truncate kann nur auf Besserung hoffen
Standard

PHP-Code:
while($ergebnis<>"1")
                    
{
                        
$dateiname=randompass("3");
mysql_query("INSERT INTO ... VALUES ...");

if(
mysql_affected_rows()==1)
{
$ergebnis="1";}
                        

Mit Zitat antworten
  #6 (permalink)  
Alt 06-12-2008, 21:09
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Dieses Vorgehen ist ... nicht sehr clever. Du kannst nämlich nicht vorhersagen, wie lange die Schleife rattert bis endlich mal eine freie ID gefunden wurde. Letztlich ist es von randompass("3") abhängig und wenn diese Funktion das tut, was der Name andeutet, hängt sie vom Zufall ab. Du solltest aber unbedingt sicherstellen, dass nur eine maximale Zahl von Zufallsversuchen notwendig ist, bis es klappt. Sonst terminiert das im Worst Case niemals.

Muss die ID denn wirklich zufällig sein? Kannst du nicht den MD5 von time() nehmen oder sowas? Oder einfach hochzählen?
Mit Zitat antworten
  #7 (permalink)  
Alt 07-12-2008, 16:35
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 414
Truncate kann nur auf Besserung hoffen
Standard

Zitat:
Muss die ID denn wirklich zufällig sein? Kannst du nicht den MD5 von time() nehmen oder sowas? Oder einfach hochzählen?
Hallo,

ja die ID muss zufällig sein. Hochzählen geht also nicht. Und MD5 von time() nehmen und auf 3 Stellen kürzen wäre ja genauso ein "Geratter" dann...

Die Frage ist ja auch wie oft es überhaupt vorkommen wird das generierte IDs schon vorhanden sind (ich geh jetzt mal davon aus das permanent immer nur 5000 IDs in der DB vorhanden sind).
Mit Zitat antworten
  #8 (permalink)  
Alt 07-12-2008, 17:13
phpguru42
 Newbie
Links : Onlinestatus : phpguru42 ist offline
Registriert seit: Oct 2008
Beiträge: 71
phpguru42 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Truncate
Die Frage ist ja auch wie oft es überhaupt vorkommen wird das generierte IDs schon vorhanden sind (ich geh jetzt mal davon aus das permanent immer nur 5000 IDs in der DB vorhanden sind).
Bei einer 32-stelligen ID in hexadezimal (wie bei MD5), kannst Du 2^128 verschiedene IDs generieren.
Ich würde denken, dass es nahezu ausgeschlossen ist, dass sich eine ID doppelt, wenn sie hinreichend zufällig generiert wird.

Wobei die kürzliche entdeckte DNS-Sicherheitslücke, mathematisch auf dem Geburtstagsparadoxon beruht. Von daher bin ich mir jetzt doch nicht mehr so sicher - vielleicht kann das mal ein Mathematiker unter den Forenmitgliedern genauer analysieren? Wäre sicherlich ganz interessant.
Mit Zitat antworten
  #9 (permalink)  
Alt 07-12-2008, 17:50
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 414
Truncate kann nur auf Besserung hoffen
Standard

Zitat:
Original geschrieben von phpguru42
Bei einer 32-stelligen ID in hexadezimal (wie bei MD5), kannst Du 2^128 verschiedene IDs generieren.
Ich würde denken, dass es nahezu ausgeschlossen ist, dass sich eine ID doppelt, wenn sie hinreichend zufällig generiert wird.
Ja es sollte aber eine extrem kurze ID sein (wird für Dateinamen genutzt).

MD5 nutzt ja nichtmal alle möglichen Zeichen von a-z weswegen das noch mehr einschränken würde.
Mit Zitat antworten
  #10 (permalink)  
Alt 07-12-2008, 18:30
phpguru42
 Newbie
Links : Onlinestatus : phpguru42 ist offline
Registriert seit: Oct 2008
Beiträge: 71
phpguru42 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von Truncate
Ja es sollte aber eine extrem kurze ID sein (wird für Dateinamen genutzt).
Na je kürzer die ID desto höher die Kollisionen, ist klar.

Die Kombinationen kannst Du mit "Anzahl der verschiedenen Zeichen" hoch "Länge der ID" ermitteln, das heißt z.B. mit a-z A-Z 0-9 und drei Stellen erhältst du 238328 verschiedene Kombinationen:

238328 / 5000 = 47,6656

Im Schnitt gibt es also nach ca. jedem 47. Versuch eine Kollision.

Oder wie war jetzt Deine Frage?

EDIT:
Achso, und wenn es ganz dumm läuft, terminiert der Algo nie
Mit Zitat antworten
  #11 (permalink)  
Alt 07-12-2008, 18:36
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 414
Truncate kann nur auf Besserung hoffen
Standard

Zitat:
Original geschrieben von phpguru42
Na je kürzer die ID desto höher die Kollisionen, ist klar.
Ja und deswegen gibt's ja extra eine Schleife Ziel ist ja eine kurze ID und nicht die Vermeidung von ev. Kollisionen.

Zitat:
Original geschrieben von phpguru42
Die Kombinationen kannst Du mit "Anzahl der verschiedenen Zeichen" hoch "Länge der ID" ermitteln, das heißt z.B. mit a-z A-Z 0-9 und drei Stellen erhältst du 238328 verschiedene Kombinationen:
Wie kommst Du auf 238.328? Bei mir macht das 195.112 (58^3).
Mit Zitat antworten
  #12 (permalink)  
Alt 07-12-2008, 18:43
phpguru42
 Newbie
Links : Onlinestatus : phpguru42 ist offline
Registriert seit: Oct 2008
Beiträge: 71
phpguru42 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

a-z A-Z 0-9 = 26 + 26 + 10 = 62
Und wie kommst Du auf 58?
Mit Zitat antworten
  #13 (permalink)  
Alt 07-12-2008, 23:08
Benutzerbild von onemorenerd onemorenerd
  Moderator
Links : Onlinestatus : onemorenerd ist offline
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.471
onemorenerd wird schon bald berühmt werdenonemorenerd wird schon bald berühmt werden
Standard

Zitat:
Original geschrieben von Truncate
MD5 von time() nehmen und auf 3 Stellen kürzen wäre ja genauso ein "Geratter" dann...

Die Frage ist ja auch wie oft es überhaupt vorkommen wird das generierte IDs schon vorhanden sind (ich geh jetzt mal davon aus das permanent immer nur 5000 IDs in der DB vorhanden sind).
Man kann keine 5.000 Werte mit nur 3 Stellen darstellen!

Wenn du weißt, wie viele IDs du maximal (!) haben wirst, kannst du das Problem auch von dieser Seite angehen. Bleiben wir mal bei 5.000, also maximal 5.000. Dann tritt der Worst Case ein, wenn du bereits 4.999 vergeben hast. Wie lange braucht ein Zufallsgenerator, um die 1 freie von 5000 IDs zu erraten? Bestenfalls nur einen Versuch, klar. Aber schlimmstenfalls rät er niemals richtig. Und was ist nun der Average Case von 1 und unendlich?

Du mußt also unbedingt etwas tun, um sicherzustellen, dass überhaupt mal eine freie ID gefunden wird und wenn du schon an den Parametern drehst, dann mach es doch gleich so, dass sie auch in "akzeptabler Zeit" gefunden wird.
Du könntest zum Beispiel den Wertebereich vergrößern. Du weißt zwar, dass du maximal 5.000 Werte brauchst, aber indem du den Wertebereich auf 100.000 ausdehnst, sind garantiert stets 95% aller IDs frei. Die Chance erhöht sich von 1/5.000 auf 95.000/100.000 oder 9,5/10.

Aber lass dich nicht täuschen. Das Verfahren ist immernoch schlecht. Du hast zwar die Chance erhöht, eine freie ID zu finden, aber es kann immernoch unendlich lange dauern (wenn der Generator permament in den belegten 5% des Wertebereichs tippt).

Begründe doch mal, warum die ID zufällig sein soll und wofür du sie brauchst!
Mit Zitat antworten
  #14 (permalink)  
Alt 07-12-2008, 23:24
phpguru42
 Newbie
Links : Onlinestatus : phpguru42 ist offline
Registriert seit: Oct 2008
Beiträge: 71
phpguru42 ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Original geschrieben von onemorenerd
Man kann keine 5.000 Werte mit nur 3 Stellen darstellen!
Warum nicht
Mit Zitat antworten
  #15 (permalink)  
Alt 07-12-2008, 23:27
Truncate
 Registrierter Benutzer
Links : Onlinestatus : Truncate ist offline
Registriert seit: Nov 2005
Beiträge: 414
Truncate kann nur auf Besserung hoffen
Standard

Zitat:
Original geschrieben von onemorenerd
Man kann keine 5.000 Werte mit nur 3 Stellen darstellen!
Doch. Oder bist Du nur von Zahlen ausgegangen?

Zitat:
Original geschrieben von onemorenerd
Begründe doch mal, warum die ID zufällig sein soll und wofür du sie brauchst!
Für einen Dateinamen. Natürlich kann ich die fortlaufend nummerieren aber dann kann ja jeder rumschnüffeln und man kann sofort sehen wievieles Uploads schon erfolgt sind usw.

Als Alternative fallen mir jetzt eben nur längere IDs ein.
Mit Zitat antworten
Antwort

Lesezeichen


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 

Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an


PHP News

ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlicht
ebiz-trader 7.5.0 mit PHP7 Unterstützung veröffentlichtDie bekannte Marktplatzsoftware ebiz-trader ist in der Version 7.5.0 veröffentlicht worden.

28.05.2018 | Berni

Wissensbestand in Unternehmen
Wissensbestand in UnternehmenLebenslanges Lernen und Weiterbilden sichert Wissensbestand in Unternehmen

25.05.2018 | Berni


 

Aktuelle PHP Scripte

PHP Server Monitor

PHP Server Monitor ist ein Skript, das prüft, ob Ihre Websites und Server betriebsbereit sind.

11.09.2018 Berni | Kategorie: PHP/ Security
PHP WEB STATISTIK ansehen PHP WEB STATISTIK

Die PHP Web Statistik bietet Ihnen ein einfach zu konfigurierendes Script zur Aufzeichnung und grafischen und textuellen Auswertung der Besuchern Ihrer Webseite. Folgende zeitlichen Module sind verfügbar: Jahr, Monat, Tag, Wochentag, Stunde Folgende son

28.08.2018 phpwebstat | Kategorie: PHP/ Counter
Affilinator - Affilinet XML Produktlisten Skript

Die Affilinator Affilinet XML Edition ist ein vollautomatisches Skript zum einlesen und darstellen der Affili.net (Partnerprogramm Netzwerk) Produktlisten und Produktdaten. Im Grunde gibt der Webmaster seine Affilinet PartnerID ein und hat dann unmittelb

27.08.2018 freefrank@ | Kategorie: PHP/ Partnerprogramme
 Alle PHP Scripte anzeigen

Alle Zeitangaben in WEZ +2. Es ist jetzt 15:17 Uhr.