Een random getal aanmaken wat nog niet in de database bestaat
Mijn vraag is hoe ik kan blijven genereren tot er een code is gegenereerd die nog niet in de database staat, om duplicaties te voorkomen? En hoe kan ik een soortgelijke code genereren als een pay.nl betaalid. Voorbeeld: 1171260197X25d00
Met een if else statement die checkt of het orderid al voorkomt in de database kom ik er niet denk ik, dan zou ik in de else opnieuw een id moeten genereren en daar wéér die check op doen etc etc. Dat moet beter kunnen.
Dus als het nummer niet in de db staat wordt de do-loop verlaten.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
<?PHP
if($betaalid == '998' OR $betaalid == '999'){
do {
$length = 10;
$min = 1 . str_repeat(0, $length-1);
$max = str_repeat(9, $length);
$uniqid = date('Ymd') . mt_rand($min, $max);
$ordernummer = $uniqid;
$uniq_id_check = $conn->query("SELECT COUNT(*) FROM orders WHERE orderid = $conn->real_escape_string($uniqid)");
} while ($uniq_id_check->mysqli_num_rows != 0);
}else{
$ordernummer = $decodedoutput->transaction->transactionId;
}
?>
if($betaalid == '998' OR $betaalid == '999'){
do {
$length = 10;
$min = 1 . str_repeat(0, $length-1);
$max = str_repeat(9, $length);
$uniqid = date('Ymd') . mt_rand($min, $max);
$ordernummer = $uniqid;
$uniq_id_check = $conn->query("SELECT COUNT(*) FROM orders WHERE orderid = $conn->real_escape_string($uniqid)");
} while ($uniq_id_check->mysqli_num_rows != 0);
}else{
$ordernummer = $decodedoutput->transaction->transactionId;
}
?>
Waar je naar op zoek bent is een soort van GUID.
In PHP zou je dit met com_create_guid() kunnen doen, maar grote kans dat dat niet ondersteund wordt op niet-Windows systemen.
Wat je ook zou kunnen overwegen is om openssl_random_pseudo_bytes() te gebruiken:
Code (php)
1
2
3
2
3
<?php
$guid = bin2hex(openssl_random_pseudo_bytes(16)); // random string van 32 karakters
?>
$guid = bin2hex(openssl_random_pseudo_bytes(16)); // random string van 32 karakters
?>
Of je breit je alternatieve implementatie voor com_create_guid().
Maar misschien denk je wel veel te moeilijk? Je zou ook voor deze betaalmethoden aparte tabellen bij kunnen houden? Dan zou je een code kunnen verzinnen voor pinnen (PIN_) en contant betalen (CASH_). Dit in combinatie met het volgnummer van de betaling (PIN_5 = de vijfde betaling via PIN) geeft je al een unieke code? Dan zou je dat uit kunnen breiden met een filiaalnummer ofzo (21_PIN_5 5e pinbetaling in filiaal 21). Of gewoon één tabel waar je een volgnummer uit trekt (auto increment id)? Net zoals het trekken van een lotje bij de bakker.
De oplossing hoeft helemaal niet ingewikkeld te zijn.
Thomas van den Heuvel op 12/11/2019 17:14:27:
egads wat is dat in hemelsnaam?
Wat bedoel je met egads?
"Ewhh, my god", gok ik.
Pff overdrijf niet lol. Het gaat er toch om dat het getal uniek is met een check in de database en dat werkt. Zal best dat je met uitgebreide functies nog complexere random codes kunt maken maar daar heb ik in dit geval niks aan.
Snelle Jaap op 13/11/2019 11:53:29:
Pff overdrijf niet lol. Het gaat er toch om dat het getal uniek is met een check in de database en dat werkt. Zal best dat je met uitgebreide functies nog complexere random codes kunt maken maar daar heb ik in dit geval niks aan.
Nummertje trekken uit een database niet simpel genoeg? Dan kun je volstaan met één (INSERT-)query (en het opvragen van het auto-increment id). Veel simpeler wordt het niet. Hierbij laat je ook niets aan het toeval over. 100% garantie dat dit een uniek nummer is. Desnoods voeg je er een prefix of suffix aan toe. Dit zou mijn voorkeur hebben boven een query in een loop (op een mogelijk niet-geïndexeerde kolom).