Een random getal aanmaken wat nog niet in de database bestaat
Ik heb een webshop die gebruik maakt van pay.nl, deze betaalprovider genereerd betaal ids die ik gebruik als ordernummers voor elke bestelling. Nu komen er twee betaalopties bij die buiten pay.nl werken, namelijk `pinnen op locatie` en `contant op locatie`. Beide opties gaan totaal buiten de api van pay.nl om, oftewel hier wordt door pay geen betaalid gegenereerd, dat moet ik nu zelf doen.
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.
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.
Thanks ik heb het kunnen oplossen met een do-while op deze manier:
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;
}
?>
egads wat is dat in hemelsnaam?
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:
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.
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?
Een verhaspeling van...
"Ewhh, my god", gok ik.
"Ewhh, my god", gok ik.
Hoef niet te gokken.
https://www.urbandictionary.com/define.php?term=Egads%21
Daar heb je tenslotte het internet voor.
https://www.urbandictionary.com/define.php?term=Egads%21
Daar heb je tenslotte het internet voor.
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.
Het klinkt als "hè gats" als in "hè gatsiederrie" :-)
(kun je voor een uniek ID niet uniqid gebruiken?)
(kun je voor een uniek ID niet uniqid gebruiken?)
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).




