| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |
|

27-02-2006, 23:21
|
|
Steven2k
Newbie
|
|
Registriert seit: Jun 2004
Beiträge: 11
|
|
Zufällige einmalige Zahl
Hallo zusammen,
ich stehe mal wieder vor einem mir scheinbar unlösbarem Problem.
Ich erstelle eine 5stellige zufällige Zahl mit srand etc. Nun möchte ich aber prüfen, ob diese bereits schon in der DB vorhanden ist und ggfs. dann eine neue erzeugen und diese wieder überprüfen usw. usw.
Hat jemand eine Idee, mit welcher Art Schleife (denke doch mal, dass es darauf hinaus läuft) man das hinbekommen kann?
Ich wäre dankbar für jeden Ansatz.
|

27-02-2006, 23:46
|
|
nicker
Member
|
|
Registriert seit: Jan 2002
Beiträge: 185
|
|
PHP-Code:
$suchen = srand..... ;
if ( mysql_num_rows( mysql_query( "SELECT daten FROM tabelle WHERE daten='$suchen'" ) ) != 0 ) {
echo "Datensatz schon vorhanden"
}
ungetestet
|

28-02-2006, 00:01
|
|
Steven2k
Newbie
|
|
Registriert seit: Jun 2004
Beiträge: 11
|
|
Hallo nicker,
ja soweit war ich auch schon mal. Habs im Eingangsposting vielleicht auch etwas ungeschickt erklärt, sorry.
Zu deinem Teil. Wenn also ein Datensatz gefunden wird, soll automatisch eine neue Zahl generiert werden, BIS die generierte Zahl nicht in der DB gefunden wird.
Die Generierung & Überprüfung soll quasi so oft wiederholt werden, bis kein Datensatz gefunden wird.
Das ist mein Problem.
|

28-02-2006, 00:04
|
|
nicker
Member
|
|
Registriert seit: Jan 2002
Beiträge: 185
|
|
while (!$found){
$suchen = srand..... ;
if ( mysql_num_rows( mysql_query( "SELECT daten FROM tabelle WHERE daten='$suchen'" ) ) != 0 ) {
echo "Datensatz schon vorhanden"
}
else
{
echo "$nun haben wir ne Zahl";
$found = "yes";
}}
|

28-02-2006, 00:22
|
|
Steven2k
Newbie
|
|
Registriert seit: Jun 2004
Beiträge: 11
|
|
Ich danke dir vielmals. Scheint so zu funktionieren, wie ich es mir dachte.
|

28-02-2006, 08:13
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Re: Zufällige einmalige Zahl
Zitat:
Original geschrieben von Steven2k
Hat jemand eine Idee, mit welcher Art Schleife man das hinbekommen kann?
|
Ob die Abbruchbedingung am Anfang (while) oder am Ende (do-while) geprüft wird, die Schleife einen Zähler (for) führt oder ein Array als Zähler (foreach) fungiert, ist nur Komfort. Alle Schleifenkonstrukte sind äquivalent, denn sie bewirken nur einen Rücksprung vom Schleifenende an den Anfang (Assembler läßt grüßen).
Die Frage "welche Schleife kann das" ist also sinnlos - mit der einen ist es schneller, mit der anderen übersichtlicher, aber alle können das gleiche.
|

28-02-2006, 09:16
|
|
Steven2k
Newbie
|
|
Registriert seit: Jun 2004
Beiträge: 11
|
|
Mit "Art der Schleife" war in etwa "wie könnte die Schleife aussehen" gemeint.
|

17-11-2009, 10:29
|
|
nussknacker
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 3
|
|
Hi
Ich hab das gleiche problem und möchte diesen code hier gern benutzen nur möchte ich keinerlei ausgabe sondern wenn eine zahl schon vorhanden ist das eine neue generiert wird.
Ich hab folgendes probiert:
Code:
while(!$zahl)
{
$suchen = mt_rand(10000,99999);
if(mysql_num_rows( mysql_query( "SELECT id FROM tabelle WHERE zahl='".$suchen."'" ) ) == 0 )
{
$zahl= $suchen;
}
}
aber irgendwie klappt das nicht
Hans
|

17-11-2009, 10:34
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
Zitat:
Zitat von nussknacker
aber irgendwie klappt das nicht 
|
Was genau daran klappt denn nicht? Bekommst du eine Fehlermeldung, gerätst du in eine Endlosschleife … Hellsehen kann hier leider niemand. Und deinen Code nun auszuführen würde ja auch vorkauen gleichen, da hat auch keiner Lust drauf. Also, ein paar Details mehr, bitte
|

17-11-2009, 10:38
|
|
nussknacker
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 3
|
|
Es scheint nichts zu passieren die seite läd und läd, es werden aber keine datenbank einträge vorgenammen.
|

17-11-2009, 10:41
|
|
nussknacker
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 3
|
|
Jetzt scheint es zu funktionieren ich habe einen fehler endeckt ich hatte statt ==0 immer noch !=0 stehen :-)
|

17-11-2009, 11:13
|
|
combie
PHP Expert
|
|
Registriert seit: May 2006
Beiträge: 2.925
|
|
Das ist doch Wahnsinn!
Zufalls generierte Zahlen als Schleifenabbruchkriterium.
Ein Zufallsgenerator kann auch Monate lang die "falschen Zahlen" liefern. Unwahrscheinlich, ja, aber nicht unmöglich.
|

17-11-2009, 11:21
|
|
TriphunEM
Registrierter Benutzer
|
|
Registriert seit: Jun 2003
Beiträge: 538
|
|
Ja katastrophale lösung! Als ersten auf jeden Fall in SELECT ein LIMIT 1 reinbauen!
Warum nutzt ihr denn Zufallswert nicht in Kombination mit einem Timestamp und besser noch mit einem Micro-Timestamp! Diese kann immer nur einmal vorkommen! Zur Sicherheit vielleicht noch in Kombination mit einem Zufallswert und da ist die wahrscheinlichkeit sehr hoch, das der Wert nur einmal vorhanden ist!
|

17-11-2009, 16:23
|
|
Gunah
Registrierter Benutzer
|
|
Registriert seit: Oct 2009
Beiträge: 87
|
|
und dann noch als md5 => fertig
|

17-11-2009, 16:51
|
 |
onemorenerd
 Moderator
|
|
Registriert seit: Mar 2005
Ort: Berlin
Beiträge: 9.481
|
|
Je mehr Zahlen aus dem Bereich von 10000 bis 99999 bereits vergeben sind, desto mehr Versuche braucht dieser Code bis er eine freie Zahl findet. Das läuft also nur am Anfang gut.
Angenommen es wurde bereits die Hälfte aller Zahlen verbraten. Dann liegt die Chance eine freie Zahl zu finden bei jedem Versuch nur noch bei 50%. Bei Gleichverteilung der Zufallswerte, die mt_rand() liefert, brauchst du also im Schnitt 2 Versuche. Sind 75% aller Zahlen vergeben, brauchst du 3 Versuche, wenn nur noch eine Zahl frei ist, brauchst du 90.000 und wenn gar keine mehr frei ist, ist es eine Endlosschleife! Der Ansatz ist also totaler Müll, sorry. Alternativen wurden dir bereits genannt.
Übrigens ist zahl sicher eine numerische Spalte, sollte es jedenfalls sein und damit sind die Anführungszeichen in der Query nicht korrekt.
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| 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.
HTML-Code ist aus.
|
|
|
|
PHP News
|