PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : zufallszahl mit sql vergleichen


beginner21
22.06.2004, 05:43:11
Hi leute


Ich hab hier kleine probleme mit einer while schleife.


Folgende Situation:

User bekommt eine UserID aus rand -->


$U_ID="0123456789";
for ($i=1;$i<=6;$i++){
$END_ID .= $U_ID{rand(0,strlen($U_ID)-1)};
while($END_ID == $besetzte_ids) {
$END_ID = '';
$END_ID .= $U_ID{rand(0,strlen($U_ID)-1)};
}
}


Wie überzeuge ich php davon, nach den $besetzte_ids zu schauen ?


Soviel hab ich schon:

$sql = "SELECT * from reg_pid order by used_pid";
$qry = mysql_query($sql);


Kann mir bitte da jemand kurz unter die Arme greifen ?

Gruß beginner21



-------------------------------------------
EDITED:

Aktueller Stand:


<?php
$sql = "SELECT * from reg_pid order by used_pid";
$qry = mysql_query($sql);
while ($bes_wert = mysql_fetch_array($qry)) {
foreach ($bes_wert as $besetzte_ids) {

}
echo $besetzte_ids . '<br>';
}
$U_ID="01234";
for ($i=1;$i<=1;$i++){
$END_ID .= $U_ID{rand(0,strlen($U_ID)-1)};
while($END_ID == $besetzte_ids) {
$END_ID = '';
$END_ID .= $U_ID{rand(0,strlen($U_ID)-1)};
}
}
echo '<br>' . $END_ID;
?>

aber irgendwie findet keine Abgleichung statt...

xabbuh
22.06.2004, 10:29:18
Erklär mal ein bisschen genauer was du überhaupt machen möchtest.

beginner21
22.06.2004, 11:03:25
hallo

danke für deine geduld.



es soll sich ein user registrieren können und dabei eine zufallszahl erhalten.
die zahl soll (nach der testphase) 6 stellen haben. Die Zufallszahl darf aber nicht 2 mal vorkommen. Weiters muss es auch die Möglichkeit geben einzelne zahlenfolgen zu "reservieren". Weiters soll auch der user seine Wunsch-Zahlenfolge eingeben könne.

Deshalb suche ich nach einem weg, alle bereits belegten zahlenfolgen zu überprüfen und nur wenn diese noch frei ist, es zu registrieren.


Die Aufgabenstellung hier beschränkt sich erst mal auf die zufallszahl da ich mit dem rest noch nicht soweit bin ;-)

Dabei habe ich in der datenbank bereits die:
1,2 und 3 drinn.
Die Zufallszahl ist einstellig und geht nur bis 4 - sodass bei erfolg nur die zahl 0 oder 4 rauskommen kann. aber eben daran scheitere ich.

xabbuh
22.06.2004, 12:53:33
Bei deinem Beispiel mit einer Zufallszahl würde mir folgendes einfallen:


//ALLE MÖGLICHEN ZUFALLSZAHLEN IN EINEM ARRAY SPEICHERN
for($i=0; $i<=4; $i++){
$zahlen[]=$i;
}

//ALLE VERGEBENEN ZAHLEN AUS DATENBANK LESEN UND AUS DEM ARRAY ENTFERNEN
$result=mysql_query("SELECT zahl FROM tabelle ORDER BY zahl");
while($row=mysql_fetch_array($result)){
$pos=array_search($row['zahl'], $zahlen);
unset($zahlen[$pos]);
}

mt_srand((double)microtime()*1000000);
$pos=mt_rand(0, (count($zahlen)-1));

$zufall=$zahlen[$pos];


Die Zufallszahl ist dann in der Variablen $zufall gespeichert. Diese Lösung ist nicht wirklich schön, aber leider das einzige, was mir eingefallen ist.

beginner21
22.06.2004, 13:21:40
Vielen Dank schon mal !!!

Leider ist ein Schöhnheitsfehler drinn

Warning: Illegal offset type in unset ...

Hast Du ev. da noch einen Tipp ?

xabbuh
22.06.2004, 13:53:56
Der Fehler lag in der while-Schleife. Richtig ist natürlich die Funktion array_search und nicht array_keys (s. meinen jetzt geänderten Beitrag).

beginner21
22.06.2004, 14:02:04
ich bedanke mich für deine Mühe. Ich denke jedoch, ich habe es nicht gut genug erklärt. Das Problem ist ja dass auch bei einer 6-stelligen Kombination passieren kann dass die mit rand erzeugte nummernfolge schon in der datenbank ist. und da sollte rand erneut aufgerufen werden. Im moment wird einfach nichts zurück gegeben falls die zahl in der db schon existiert. Weiters muss ich zugeben dass ich auf dieser weise nicht mal wirklich weiß wie ich es steuern soll :-(

xabbuh
22.06.2004, 15:56:28
Mal folgendes:

Ein Array, in dem alle überhaupt möglichen 6-stelligen Zahlen abgespeichert werden:

for($i=100000; $i<1000000; $i++){
$zahlen[$i];
}


Alle Zahlen aus dem Array entfernen, die bereits vergeben sind:

$result=mysql_query("SELECT zahl FROM tabelle ORDER BY zahl");
while($row=mysql_fetch_array($result)){
$pos=array_search($row['zahl'], $zahlen);
unset($zahlen[$pos]);
}


Jetzt kann überprüft werden, ob die gewünschte Zahlenfolge noch frei ist, wenn diese nicht mehr frei ist, wird eine zufällig ausgewählte noch freie Zufallszahl genommen:


if(in_array($wunschzahl, $zahlen)){
$zufall=$wunschzahl;
}
else{
mt_srand((double)microtime()*1000000);
$pos = mt_rand(0, (count($zahlen)-1));
$zufall=$zahlen[$pos];
}

tapferesschneid
23.06.2004, 11:04:54
<?php
// Array füllen
for ($i = 100000; $i < 1000000; $i++)
$zahlen[$i] = $i;

// vergebene löschen
$result = mysql_query('SELECT zahl FROM tabelle');
for ($i = 0; $i < mysql_num_rows($result); $i++)
unset($zahlen[mysql_result($result, $i, 0)]);

if (in_array($wunschzahl, $zahlen))
$zufall = $wunschzahl;

elseif (count($zahlen))
$zufall = array_rand($zahlen);

else echo 'voll';
?>

beginner21
23.06.2004, 14:04:12
herzlichen Dank an euch !

Funktioniert nun !!!


Mit besten Grüßen Beginner21