I am creating a ticketing system. I wish for each entry to be a unique number between the specified range. I have created functions, which I will include to show how I am processing things. If I purchase all the tickets in one go, the function generally has 3 or 4 duplicate numbers.
I have attempted this but failed ending up with some duplicates if a person purchases all tickets at once. I assume this can happen if purchasing a few at a time also. This needs to be more robust.
Taken tickets which returns an array of numbers already taken
function takenNumbers($drawID){
$connect = new mysqli("localhost", "root", "", "dream");
$stmt = $connect->prepare("SELECT * FROM transaction WHERE DrawID = ?");
$stmt->bind_param("i", $drawID);
$stmt->execute();
$result = $stmt->get_result();
$tickets = array();
while($row = $result->fetch_assoc()){
$id = $row['ID'];
$tickets[] = $row['TicketNumber'];
}
return $tickets;
}
Numbers which are not taken also returned in an array
function freeNumbers($drawID){
$minTickets = 1;
$maxTickets = totalTickets($drawID);
$takenNumbers = takenNumbers($drawID);
$freeNumbers = array();
$allTickets = range(1, $maxTickets);
$freeNumbers = array_values(array_diff($allTickets, $takenNumbers));
return $freeNumbers;
}
Then I have a random ticket generator based on these functions
function randomTicket($drawID){
$num = freeNumbers($drawID);
$random = array_rand($num, 1);
return $random;
}
After payment processing I call this function to insert to database along with the randomTicket.
for($i = 0; $i < $quantity; $i++){
echo paymentMade($paymentId, $token, $payerID, $drawID) . "<br>";
}
I am receiving duplicates. This cannot happen in the live application. I have tried a number of things and found this quite an issue to program around. Any and all input would be appreciated. Thanks in advance guys.