Lose doppelt ermitteln verhindern

Anacondi

Erfahrenes Mitglied
Hallo an alle.
ich habe hier eine Tombola, wo man 20 lose kaufen kann.
Ermittelt werden die lose aus zufallszahlen von 1-400
Jetzt stehe ich vor dem Problem: Hat ein jemand Lose gekauft gekauft, werden die in die Datenbank übertragen.
In die Tabelle lose.
Wenn jetzt aber noch jemand Lose kauft, möchte ich verhindern, das die bisher gezogenen Lose noch mal gezogen werden.
wenn ich den Code jetzt so lasse , kann es ja passieren, das aus den zufallszahlen noch einmal gleiche Zahlen ermittelt werden, die es schon in der Datenbank gibt.
Hier mein bisheriger Code:
PHP:
 <?php // ab hier  ---------------------------------------------------------------
while (count($Loszahlen)< 20) {  
  $zahl = rand(1,400);  
  if (!in_array($zahl, $Loszahlen)) $Loszahlen[]=$zahl; 
  $zzahl1 = $zahl; 
}  
// Die Lose mischen
 shuffle($Loszahlen);
 echo implode(' ', $Loszahlen);  echo "<br>";
 
 $inserts = ''; 
for($i=0; $i < $anzahl_lose; $i++) 
{ 
  $inserts .= ($i == 0?'':',') . (int)$Loszahlen[$i]; 


mysql_query("INSERT INTO tombola (user_id, los) VALUES ('$vereinsids', '".$Loszahlen[$i]."')");}
 
Danke. Also auslesen kann ich die bis dato ermittellten Lose ja, aber wie sage ich dem oben stehendem Code, diese zahlen nicht als zufallszahl mit ermitteln?
 
Die Lose am Anfang aus der DB lesen und in einen Array abspitzen.
Dann beim Lese erstellen auch auf diesen Array prüfen.
 
oder: alle bisherigen Lose aus der DB lesen, ein Array von 1-400 erstellen und die gefundenen Lose aus dem Array löschen. Zum Schluß ein random auf das übriggebliebene Array.

So ähnlich habe ich meinen Lottozahlen-Generator programmiert. Nur das ich die gezogenen Zahlen direkt aus dem Array gelöscht hatte, was bei Dir nicht geht.
Und 11,47€ gewonnen. :) :)
 
Du hast maximal 400 Lose in der Datenbank nach deinem Code Beispiel:
PHP:
$zahl = rand(1,400);

Fülle die Datenbank mit 400 Losen und ziehe per Zufall über SQL
SQL:
SELECT `los`
FROM `tombola`
ORDER BY RAND()
LIMIT 20

Die gezogenen Lose musst du dann entsprechend markieren und mit WHERE ausschließen.

Dein Code Code mit der While Schleife kann sehr langsam werden vor allem bei den letzten 20 Losen. Und das ganze in ein Array auszulagern kann zu Transaktionsfehlern führen wenn mehrere gleichzeitig ziehen.
 
Zuletzt bearbeitet von einem Moderator:
Zurück