Een random getal aanmaken wat nog niet in de database bestaat

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Snelle Jaap

Snelle Jaap

12/11/2019 14:27:17
Quote Anchor link
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.
 
PHP hulp

PHP hulp

06/10/2024 08:27:53
 
- SanThe -

- SanThe -

12/11/2019 14:46:42
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php
do
{  maak een random nummer
}  while(het nummer staat in de db)
?>


Dus als het nummer niet in de db staat wordt de do-loop verlaten.
 
Snelle Jaap

Snelle Jaap

12/11/2019 16:13:10
Quote Anchor link
Thanks ik heb het kunnen oplossen met een do-while op deze manier:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}

?>
 
Thomas van den Heuvel

Thomas van den Heuvel

12/11/2019 17:14:27
Quote Anchor link
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:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$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.
 
Snelle Jaap

Snelle Jaap

13/11/2019 09:22:10
Quote Anchor link
Thomas van den Heuvel op 12/11/2019 17:14:27:
egads wat is dat in hemelsnaam?


Wat bedoel je met egads?
 
- Ariën  -
Beheerder

- Ariën -

13/11/2019 09:53:53
Quote Anchor link
Een verhaspeling van...
"Ewhh, my god", gok ik.
 
Adoptive Solution

Adoptive Solution

13/11/2019 09:55:01
Quote Anchor link
Hoef niet te gokken.

https://www.urbandictionary.com/define.php?term=Egads%21

Daar heb je tenslotte het internet voor.
 
Snelle Jaap

Snelle Jaap

13/11/2019 11:53:29
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

13/11/2019 12:00:10
Quote Anchor link
Het klinkt als "hè gats" als in "hè gatsiederrie" :-)




(kun je voor een uniek ID niet uniqid gebruiken?)
 
Thomas van den Heuvel

Thomas van den Heuvel

13/11/2019 16:51:06
Quote Anchor link
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).
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.