Randomzahl erzeugen und in DB überprüfen

Kahmoon

Erfahrenes Mitglied
Tach beisammen....ich stehe mal wieder vor einem Verständnisproblem.

Folgendes:
Ich baue grad ein Portal für einen Rennveranstalter. Bei den Anmeldungen ist es möglich eine Wunschstartnummer anzugeben. Wird das nicht getan, wird automatisch eine Nummer generiert. Da pro Veranstaltung die Nummern aber unique sein müssen, wollte ich das ganze mit 2 Funktionen lösen. eine Funktion die eine Randomzahl generiert und eine weitere die diese Zahl dann in der Datenbank auf Vorkommen checkt. Ist diese Nummer zu dem Event schon vergeben wird Funktion generieren wieder aufgerufen und das Spielchen beginnt von vorn bis ein "true" also Nummer noch nicht für diesen Event vorhanden kommt.

Hier sind beide Funktionen (Nummer 45 ist testhalber vergeben, daher der kleine Randomrange)

Generieren
PHP:
function generate_startnummer($eventid){
	$startnummer_zufall = rand(44,46);
	
	if(check_startnummer($startnummer_zufall, $eventid)){
		return $startnummer_zufall;
	}else{
		generate_startnummer($eventid);
	}
}

Funktion Check
PHP:
function check_startnummer($nummer, $eventid){
	#Check ob die Zahl schon in der DB ist
	$query = "SELECT startnummer FROM buchungen WHERE startnummer=".$nummer." AND idtermin=".$eventid.";";
	
	if(mysql_num_rows(mysql_query($query)) != 0){
		return false;
	}else{
		return true;
	}
}

nach wie vor liefert er mir aber Ergebnisse die er nicht liefer soll...also false Werte. Zwar nicht 45 aber dafür dann ein leerwert. Er sollte wenn false kommt das ganze nochmal starten.

Wäre nett wenn mir wer vom Schlauch hilft auf dem ich gerade stehe ;)




Edit:
Also inzwischen bin ich soweit das ich festgestellt habe das er soweit alles richtig macht. Sobal sich die Funktion "generieren" aber das erste mal selber aufruft wird nichts mehr beim return übergeben.

PHP:
$_POST["startnummer"] = generate_startnummer($_POST["eventid"]);

geht somit quasi leer aus. Wieso kommt da mit return kein Wert mehr an?
 
Zuletzt bearbeitet:
Versuchs mal so:
PHP:
function generate_startnummer($eventid){ 
    $startnummer_zufall = rand(44,46); 
     
    if(check_startnummer($startnummer_zufall, $eventid)){ 
        return $startnummer_zufall; 
    }else{ 
        return generate_startnummer($eventid); 
    } 
}
 
ist das nicht genau mein Code oder hab ich Tomaten auf den Augen :D

Das komische ist....das er kein Returnwert mehr ankommt sobald sich die Funktion selbst aufruft. Wenn ich das ganze nicht mit return zurückgebe sondern es in eine Sessionvariable speicher es einwand frei.....ist aber eher quick&dirty :(
 
Verpack das ganze doch in einer do-while schleife:
PHP:
do
{
$boolvariable = generate_startnummer($eventidvariable);
}
while($boolvariable == false);
Dann muss es so lange ausgeführt werden, bis "true" zurück gegeben wird.
 
das ist auch ne idee....an so einen Lösungsweg hab ich noch nicht gedacht. Thx, werd ich morgen mal versuchen
 
Verpack das ganze doch in einer do-while schleife:
PHP:
do
{
$boolvariable = generate_startnummer($eventidvariable);
}
while($boolvariable == false);
Dann muss es so lange ausgeführt werden, bis "true" zurück gegeben wird.

Mal ne allgemeine Frage:
Ist es besser das in der Form zu schreiben wie du es jetzt gemacht hast oder anders?
Also rein vom Stil her jetzt!?
PHP:
while ($boolvariable == false) {
    $boolvariable = generate_startnummer($eventidvariable);
}
 
ist das nicht genau mein Code oder hab ich Tomaten auf den Augen :D
Nein das ist nicht genau dein Code
Das komische ist....das er kein Returnwert mehr ankommt sobald sich die Funktion selbst aufruft. Wenn ich das ganze nicht mit return zurückgebe sondern es in eine Sessionvariable speicher es einwand frei.....ist aber eher quick&dirty :(
Das ist es ja, du must es so probieren, wie ich es geschrieben habe:
PHP:
}else{ 
        return generate_startnummer($eventid);
Damit wird der Wert richtig zurückgegeben.

Ist es besser das in der Form zu schreiben wie du es jetzt gemacht hast oder anders?
Also rein vom Stil her jetzt!?
PHP:
while ($boolvariable == false) {
    $boolvariable = generate_startnummer($eventidvariable);
}
Das macht einen logischen Unterschied:
  1. Bei der do-while-Schleife wird der Schleifenblock immer (mindestens) einmal aufgerufen, egal ob die Bedingung erfüllt ist oder nicht
  2. Bei der while-Schleife wird der Schleifenblock nur ausgeführt, wenn die Bedingung true ist
 
Zuletzt bearbeitet:
Zurück