[PHP] Alternatief voor do {...} while(...) constructie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik ben in alle tijd dat bezig ben geweest met programmeren (hoewel dat nog niet zo lang is, maar goed) nog nooit in een situatie geweest waarin ik een do while lus moest gebruiken. Tot voor kort echter, waar ik voor een probleem hierbij als enige oplossing uit kwam. Sommige mensen schijnen dit een slechte contructie te vinden en ik vraag me dan ook eigenlijk af of die mensen dan wat beters weten te verzinnen. Daar ben ik wel beniewd naar eigenlijk. Waarschijnlijk is de hele contructie uitgevonden voor dit soort problemen dus zal het wel niet anders kunnen, maar ik ben toch wel benieuwd.

Het probleem was dat ik voor een nieuwsbrief een unieke hash wilde genereren zodat mensen via deze hash zich kunnen uitschrijven voor de nieuws brief (met een linkje dan). Ik heb gekozen voor de bekende md5 hash die ik maak van de huidige timestamp. Er zijn in totaal 36^32 verschillende hashes mogelijk als ik me niet vergis en dat moet eigenlijk wel kunnen geganderen dat de hash die gegenereerd wordt uniek is, maar daar wil ik toch niet vanuit gaan, je weet maar nooit. Dus controleer ik of de hash al aanwezig is in de database. Is dit zo, dan wordt de hash weer opnieuw gegenereerd en gechecked totdat ik een unieke hash heb.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$attempt = 0;

do
{
    $rndkey =   md5(time() + $attempt++);
    
    $query = "
        SELECT
            `id`
        FROM
            `email`
        WHERE
            `rndkey`='" . $rndkey . "'
    ";
    
    $result = mysql_query($query) or die(mysql_error());
    
} while ( mysql_num_rows($result) >= 1 );

Het leek mij hierbij de enige oplossing om een do {} while() contructie te gebruiken, mischien kan het ook wel op een hele andere manier, daar ben ik ook wel benieuwd naar.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:45
Een do while is helemaal geen slecht statement. Waarom zou dat nu weer zijn?
Als je nu minimaal 1x die code moet uitvoeren, dan gebruik je een do while.

Het zou toch te gek zijn dat je een while() do gebruikt om dit op te lossen
code:
1
2
3
4
5
6
DoSomething()
while()
{
  DoSomething()

}

8)7

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Niet echt van belang maar ik dacht dat er maar 16 (a-f en 0-9) ^ 32 verschillende hashes mogelijk zijn bij gebruik van md5 ?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Ik vind het persoonlijk ook niet slecht om te gebruiken. Waar ik wel nu ineens aan zit te denken is dit:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
function generate_unique_hash()
{
    static $attempt = 0;

    $rndkey = md5(time() + $attempt++);
    
    $query = "
        SELECT
            `id`
        FROM
            `email`
        WHERE
            `rndkey`='" . $rndkey . "'
    ";
    
    $result = mysql_query($query) or die(mysql_error());
    
    return ( ( mysql_num_rows($result) >= 1 ) ? generate_unique_hash() : $rndkey );
}

$hash = generate_unique_hash();

Kan natuurlijk ook.
Verwijderd schreef op 15 januari 2004 @ 15:25:
Niet echt van belang maar ik dacht dat er maar 16 (a-f en 0-9) ^ 32 verschillende hashes mogelijk zijn bij gebruik van md5 ?
Ah.. gewoon hex dus. Niet echt op gelet, maar weet ik dat ook weer :)

[ Voor 34% gewijzigd door Michali op 15-01-2004 15:33 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Dat is recursief. Dan mag hij fijn nog een stackframe gaan opbouwen voor z'n functioncall en die recursie zal maar een betrekkelijk lage diepte hebben in PHP (probeer het zelf maar eens uit). Nee geef mij dan maar een do-while

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Niet dat ik het ga gebruiken hoor. Ik snap ook wel dat die do while sneller is. En waarschijnlijk zal het bij het gebruik van deze functie wel nooit zover komen dat er werkelijk een recursieve call komt.. Het was alleen maar om aan te tonen dat het ook anders kon. Kon er zelf eerst niets meer bij bedenken, maar dit kwam ineens in me op.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • drm
  • Registratie: Februari 2001
  • Laatst online: 09-06 13:31

drm

f0pc0dert

een do { ... } while ( mysql_errno () == 1064 * ); met een INSERT query lijkt mij het netst, dwz, als je in MySQL ook een unique constraint op de betreffende kolom hebt gezet. Zo niet, doe dat dan maar gauw :P

*) even uit mijn hoofd... iig de error 'duplicate for key ...'

Music is the pleasure the human mind experiences from counting without being aware that it is counting
~ Gottfried Leibniz


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Hehe, inderdaad. Moet ik nog even doen. Maar goed, dat was niet het hoofd punt waarom ik dit hier had neergezet. Ik ben gewoon beniewd op hoeveel verschillende manieren je een bepaald probleem kunt oplossen.

Edit: zo aangepast. Scheelt weer wat regels :)

[ Voor 11% gewijzigd door Michali op 15-01-2004 15:48 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Waarom gebruik je niet gewoon het emailadres als key om mensen zich uit te laten schrijven? Daar kan toch weinig mee mis gaan?

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Je kunt iedere while-loop ook als een for-loop herschrijven. Moeten we daarom while ook maar dumpen? :?

Iedere taalconstructie heeft z'n toepassing, en ja do-while is een van de zeldzaamste. Maar hij heeft wel degelijk een hoop nut in specifieke situaties. Waarom zou je daar aan willen tornen?

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
bigtree schreef op 15 januari 2004 @ 15:43:
Waarom gebruik je niet gewoon het emailadres als key om mensen zich uit te laten schrijven? Daar kan toch weinig mee mis gaan?
Hmm, dat zou ook wel goed kunnen in princiepe. Maar ik denk toch dat het beter is van niet. Heb er zo wel een beter gevoel bij iig.
curry684 schreef op 15 januari 2004 @ 15:44:
Je kunt iedere while-loop ook als een for-loop herschrijven. Moeten we daarom while ook maar dumpen? :?

Iedere taalconstructie heeft z'n toepassing, en ja do-while is een van de zeldzaamste. Maar hij heeft wel degelijk een hoop nut in specifieke situaties. Waarom zou je daar aan willen tornen?
Dat zou ik ook niet weten eigenlijk. Ik vond dit eigenlijk wel, samen met mijn nieuwsgierigheid naar andere methodes, wel een leuke gelegenheid om dit te horen van iemand. Daar zal wel weer niets van komen maar goed.

[ Voor 47% gewijzigd door Michali op 15-01-2004 15:51 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 02:21

Janoz

Moderator Devschuur®

!litemod

Michali schreef op 15 januari 2004 @ 15:50:
Hmm, dat zou ook wel goed kunnen in princiepe. Maar ik denk toch dat het beter is van niet. Heb er zo wel een beter gevoel bij iig.
Programmeren is een exacte bezigheid. Hierdoor is alles heel goed te beredeneren. Er 'een goed gevoel' bij hebben is een van de slechtste motivaties voor een bepaalde ontwerpbeslissing ;).

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Janoz schreef op 15 januari 2004 @ 16:12:
[...]


Programmeren is een exacte bezigheid. Hierdoor is alles heel goed te beredeneren. Er 'een goed gevoel' bij hebben is een van de slechtste motivaties voor een bepaalde ontwerpbeslissing ;).
Nou.. het is in dit geval niet echt een beslissing van wat nu het beste is. Ik denk persoonlijk dat het doorgeven van een unieke hash beter is. Dit omdat mensen zo veel minder snel zullen gaan klooien met de url. Als er een email in staat geeft dat heel wat meer herkenning van wat er nu precies gebeurt (waar of niet :? ). Verder zijn beide oplossingen verder gelijkwaardig, ze allebij wat ze moeten dus en zo'n kritieke beslissing is dit verder niet hoor. Ik doe dan gewoon wat ik het leukste vind. En als je het wilt weten: dit komt bij mij zeker 'na' dat ik heb gekeken of een van de twee oplossingen wel echt voordeel biedt boven de ander.

(en: het wordt gebruikt door mensen en als er iets niet te beredeneren valt :P)

[ Voor 6% gewijzigd door Michali op 15-01-2004 16:17 ]

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • bigtree
  • Registratie: Oktober 2000
  • Laatst online: 16-08 17:16
Michali schreef op 15 januari 2004 @ 16:16:
[...]

Dit omdat mensen zo veel minder snel zullen gaan klooien met de url. Als er een email in staat geeft dat heel wat meer herkenning van wat er nu precies gebeurt (waar of niet :? ).
Vooral dat laatste lijkt mij in de huidige tijden van spam belangrijk. Je wilt als ontvanger immers zeker weten dat een uitschrijving correct wordt afgehandeld.

Zelf beheer ik ook een mailinglijst en bij ons staat het mailadres in de afmeld-url. Die linkt naar een formulier waar je alsnog op een knop moet drukken alvorens je bent uitgeschreven. Ook kan je er commentaar plaatsen (waarom je je wilt uitschrijven, levert soms interessante informatie op).

Lekker woordenboek, als je niet eens weet dat vandalen met een 'n' is.


Acties:
  • 0 Henk 'm!

Verwijderd

Dan kan je in principe toch ook de md5 nemen van het email adres?, weet je zeker dat het uniek is... :)

Acties:
  • 0 Henk 'm!

  • RHE123
  • Registratie: April 2003
  • Laatst online: 10:42

RHE123

Edubits

Verwijderd schreef op 15 januari 2004 @ 16:38:
Dan kan je in principe toch ook de md5 nemen van het email adres?, weet je zeker dat het uniek is... :)
Behalve als iemand zich 2x aanmeld....

Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro


Acties:
  • 0 Henk 'm!

Verwijderd

RHE123 schreef op 15 januari 2004 @ 16:51:
[...]

Behalve als iemand zich 2x aanmeld....
Lijkt me dat dit afgevangen wordt in de code. Bij een nieuwsbrief lijkt het me vrij onlogisch als je meerdere keer aanmeldt op 1 email adres.

Acties:
  • 0 Henk 'm!

  • RHE123
  • Registratie: April 2003
  • Laatst online: 10:42

RHE123

Edubits

Verwijderd schreef op 15 januari 2004 @ 17:16:
[...]
Lijkt me dat dit afgevangen wordt in de code. Bij een nieuwsbrief lijkt het me vrij onlogisch als je meerdere keer aanmeldt op 1 email adres.
Lijkt me ook, maarja je weet nooit :)
Je kan ook een combi van de 2 doen en dus het emailadres en de time achter elkaar plakken en dan de hash nemen.

Canon 1D X + 16-35 f/2.8L + 24-70 f/2.8L + 70-200 f/2.8L IS + 135 f/2.0L + 430EX II | iMac | MacBook Pro


Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op 15 januari 2004 @ 16:38:
Dan kan je in principe toch ook de md5 nemen van het email adres?, weet je zeker dat het uniek is... :)
Inderdaad, daar had ik nog niet aan gedacht. Dat is ook wel gemakkelijk bij het opsporen van het record. In SQL zit toch een MD5 functie? Kan ik hier mooi voor gebruiken.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

je moet je niet eens aan kunnen melden op een nieuwsbrief als het emailadres al bestaat, dus kan het emailadres ook niet vaker voorkomen

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Zo'n check heb ik er al in zitten, dus dat zit verder wel goed.

Noushka's Magnificent Dream | Unity

Pagina: 1