[PHP] for statement, weet het ff niet meer...

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • source
  • Registratie: Januari 2000
  • Laatst online: 15-08 15:33
Het kan zijn dat ik niet genoeg geslapen heb maar ik heb iets waar ik niet uit kom.

Ik wil een unieke string maken die niet in de database staat, dus ik denk dan aan een for statement...

nu heb ik deze functie:

PHP:
1
2
3
4
5
6
7
8
9
function check_pic_name($string)
{
  $result = mysql_query("select unique from users where unique='$string'");
    
  if (mysql_num_rows($result)>0)
     return false;
  else 
     return true;
}


nu wil ik dat als de string al bestaat een nieuwe random string maakt en weer kijkt of ie bestaat.. duidelijk?.. mooi :)

dit is de random string functie:

PHP:
1
2
3
4
5
6
7
8
9
10
function randon_string_gen($char)
{
$totalChar = $char;
$chars = "abcdefghijklmnpqrstuvwxyzABCDEFGHIJKLMNPQRSTUVWXYZ123456789";
srand((double)microtime()*1000000); 
$string=""; 
for ($i=0;$i<$totalChar;$i++)
            $string = $string . substr ($chars, rand() % strlen($chars), 1); 
return $string; 
}


Ik wil dus een for statement die net zolang de string in de db checked totdat ik een string heb die nopg niet bestaat.

Diplomacy is the ability to tell a person to go to hell in such a nice way that he looks forward to the trip.


Acties:
  • 0 Henk 'm!

Verwijderd

is werken met een auto_increment id geen oplossing voor je?

Acties:
  • 0 Henk 'm!

  • source
  • Registratie: Januari 2000
  • Laatst online: 15-08 15:33
nee, helaas wil ik dat niet op die manier doen.. dat had ik al geprobeerd maar dat gaf weer andere problemen...

Diplomacy is the ability to tell a person to go to hell in such a nice way that he looks forward to the trip.


Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

Waarom wil je 'm perse random? Kun je niet iets van SELECT max(increment_key) +1 FROM table doen ofzo :? Da's toch veel eenvoudiger? Plus dat je opdrachten niet cumulatief zwaarder worden... Hoe meer records je in je database, hoe langzamer het wordt, want hoe meer kans je hebt op dubbele sleutels...

* drm denkt dat je te moeilijk denkt over iets heel eenvoudigs ;)

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


Acties:
  • 0 Henk 'm!

Verwijderd

Zo?

PHP:
1
2
3
while (!check_pic_name($string)) {
$string = randon_string_gen($char);
}


Volgens mij doe je idd overdreven moeilijk.. :?

[ Voor 21% gewijzigd door Verwijderd op 22-03-2003 12:59 ]


Acties:
  • 0 Henk 'm!

Verwijderd

source schreef op 22 March 2003 @ 12:48:
Ik wil dus een for statement die net zolang de string in de db checked totdat ik een string heb die nopg niet bestaat.
Dat moet je niet met for doen, maar met while.

PHP:
1
2
3
4
5
6
7
$continue = true;
while ($continue) {
// maak string
// controleer met db
if string_bestaat_nog_niet {
  $continue = false; }
}

Acties:
  • 0 Henk 'm!

  • beetle71
  • Registratie: Februari 2003
  • Laatst online: 09-09 15:24
PHP:
1
2
3
4
$string=randon_string_gen(8);
while(!check_pic_name($string)){
   $string=randon_string_gen(8);
}


zoiets?

edit:
same time, same answer...

[ Voor 15% gewijzigd door beetle71 op 22-03-2003 13:00 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

Het kan idd in een for loop, maar een while is hier imho meer op z'n plaats:
PHP:
1
2
3
4
$randomstring = randon_string_gen(10);
while (!check_pic_name($randomstring)) {
  $randomstring = randon_string_gen(10);
}


Edit: 3 zielen, 1 gedachte :)

[ Voor 9% gewijzigd door crisp op 22-03-2003 13:03 ]

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • source
  • Registratie: Januari 2000
  • Laatst online: 15-08 15:33
inderdaad, jullie hebben allemaal gelijk, ik zat de hele tijd maar aan een for statement te denken... allemaal heel erg bedankt!

Diplomacy is the ability to tell a person to go to hell in such a nice way that he looks forward to the trip.


Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

een for loop is in dit geval helemaal niet gek, hoor. Je hebt een initialisatie, een iteratie en een stop-conditie. Daar is een forloop in principe prima voor geschikt. 't Enige is dat je dan geen body meer hebt in je for loop ;)
PHP:
1
2
3
4
5
6
for ( 
   $random_string = random_string_gen ( 10 ); 
   !check_pic_name ( $random_string ); 
   $randomstring = random_string_gen ( 10 ) 
)
   ;

Semantisch klopt 't ook, want je zegt 'voor elke string die ik genereer wil ik kijken of hij al bestaat'.

Overigens is sowieso een do-while beter dan een while, want je wilt sowieso 1 keer een string genereren:

PHP:
1
2
3
do {
   $randomstring = randon_string_gen(10);
} while ( !check_pic_name ( $randomstring ) );


Maar toch zou ik voor een SELECT oplossing gaan zoals ik hierboven al zei, volgens mij doe je veel te moeilijk voor iets heel simpels. Ik heb nog steeds geen motivatie gezien waarom de string random moet zijn, nl :?

[ Voor 14% gewijzigd door drm op 22-03-2003 13:30 ]

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


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

crisp schreef op 22 maart 2003 @ 13:02:
Het kan idd in een for loop, maar een while is hier imho meer op z'n plaats:
Edit: 3 zielen, 1 gedachte :)

Doe dan een do/while :P
PHP:
1
2
3
4
5
do
{
    $randomstring = randon_string_gen(10);
}
while (!check_pic_name($randomstring));


Irri drm!! :(

[ Voor 3% gewijzigd door ACM op 22-03-2003 13:30 ]


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
drm schreef op 22 March 2003 @ 13:29:
een for loop is in dit geval helemaal niet gek, hoor. Je hebt een initialisatie, een iteratie en een stop-conditie.
Niet mee eens: je initialisatie en iteratiestap zijn hetzelfde. In jouw voorstel dupliceer je code en dat is per definitie lelijk (en helemaal als er een goed alternatief beschikbaar is).
Overigens is sowieso een do-while beter dan een while, want je wilt sowieso 1 keer een string genereren
Als je dat ook vindt, zeg dan niet van die gekke dingen over for-lusjes. :)


Btw, moest die functie niet random_string_gen heten? Nu spelt iedereen het maar net zo als de topic starter, maar volgens mij was dat toch niet helemaal de bedoeling.

[ Voor 15% gewijzigd door Soultaker op 22-03-2003 13:53 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 22 maart 2003 @ 13:30:

[...]

Doe dan een do/while :P
PHP:
1
2
3
4
5
do
{
    $randomstring = randon_string_gen(10);
}
while (!check_pic_name($randomstring));


Irri drm!! :(
waarom dan niet meteen:
PHP:
1
while (!check_pic_name($randomstring = randon_string_gen(10)));

:)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
crisp schreef op 22 March 2003 @ 13:52:
waarom dan niet meteen:
PHP:
1
while (!check_pic_name($randomstring = randon_string_gen(10)));

:)
Omdat dat minder duidelijk is dan de do-while-variant (naar mijn mening) en verder niets toevoegd (performance win je er niet mee, want eventuele overhead in de do-while-variant wordt overschaduwd door de queries in check_pic_name).

Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Soultaker schreef op 22 maart 2003 @ 13:51:
Btw, moest die functie niet random_string_gen heten? Nu spelt iedereen het maar net zo als de topic starter, maar volgens mij was dat toch niet helemaal de bedoeling.

Je kan nooit perfecte random functies maken op PC's toch, het is altijd pseudo-random (in meer of mindere mate). Dan is zo'n spelfout toch ook wel gerechtvaardigd? :P

Acties:
  • 0 Henk 'm!

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

drm

f0pc0dert

Soultaker:
Niet mee eens: je initialisatie en iteratiestap zijn hetzelfde. In jouw voorstel dupliceer je code en dat is per definitie lelijk (en helemaal als er een goed alternatief beschikbaar is).
* drm agrees ;)
Maar 't is nooit gek om 't te overwegen :)
Als je dat ook vindt, zeg dan niet van die gekke dingen over for-lusjes. :)
:X :D
Btw, moest die functie niet random_string_gen heten? Nu spelt iedereen het maar net zo als de topic starter, maar volgens mij was dat toch niet helemaal de bedoeling.
Niet iedereen! [rml]drm in "[ PHP] for statement, weet het ff niet me"[/rml] Alleen 't 2e stukje maar! maar dat had ik dan ook gecopy/paste van crisp
:X

performance win je er niet mee, want eventuele overhead in de do-while-variant wordt overschaduwd door de queries in check_pic_name).
Levert de do-while variant dan overhead op :?

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


Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 03:13
drm schreef op 22 March 2003 @ 14:18:
Levert de do-while variant dan overhead op :?
Geen idee, maar van PHP snap ik nooit precies wat er nu "onder de kap" gebeurt. Als er een verschil is, is dat in ieder geval niet relevant ten op zichte van de overhead van de SQL query.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 17-09 14:05

.oisyn

Moderator Devschuur®

Demotivational Speaker

Mja, PHP kennende :X

/ongezoute flame en ik heb verder lekker niks interessants te melden :P

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • MisterData
  • Registratie: September 2001
  • Laatst online: 29-08 20:29
Hou rekening met twee users tegelijk, als je met SELECT COUNT()+1 bijvoorbeeld iets unieks denkt op te halen en iemand doet hetzelfde op hetzelfde moment, dan gaat het fout, dan heb je twee dezelfde keys :)

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

drm schreef op 22 March 2003 @ 14:18:
[...]
Levert de do-while variant dan overhead op :?
toch wel iets, mijn variant is misschien 0,1% sneller, maar dat zal waarschijnlijk zijn doordat het sneller geparsed kan worden.
Sommige verschillende constructies maken in PHP echter wel degelijk veel uit qua snelheid.
In de eerste plaats is het bijvoorbeeld altijd verstandiger gebruik te maken van een bestaande methode dan zelf iets te verzinnen: een array_search is bijvoorbeeld 10 keer sneller dan zelf de array doorlopen tot je een bepaalde value tegenkomt.
Verder is het gebruik van single quotes voor constante strings met concatonering (?) ook altijd sneller:
PHP:
1
$string = 'mijn naam is '.$naam;

versus
PHP:
1
$string = "mijn naam is $naam";

Ook strong typing levert in vergelijkingen ongeveer 4% snelheidswinst op:
PHP:
1
2
3
$a = (int) 1;
$b = (int) 2;
if ($a === $b) {  }

In normale applicaties zal je de snelheidswinst echter niet zo snel opmerken, en gaat duidelijkheid boven constructies als:
PHP:
1
$a = ($b===1)? 'blaat':'piep';

ook al is bovenstaande constructie een fractie sneller dan een if - else.
Als je je echter bezig gaat houden met dit soort zaken dan is snelheid wel degelijk van belang, hoewel je je dan kan gaan afvragen of je wel de juiste taal aan het gebruiken bent om een vraagstuk op te lossen ;)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Op het moment dat je dan 1 minder efficiente query doet op je database ben je daar al je winst alweer mee kwijt. Want bij je db tel je met milliseconden, bij die operaties tel je in micro/nanoseconden.

Optimalisatie is iets dat je pas later moet doen, niet iets waar je in het begin al uitgebreid rekening mee moet houden.

Persoonlijk probeer ik ten allen tijden mijn code leesbaar te houden, dat er een paar nano/microseconden winst te halen is boeit mij meestal weinig. En bij dat soort wedstrijden zal het gebruikte algortime meer uitmaken dan dat perfect te implementeren :)

Als je bijv zoiets hebt:
PHP:
1
2
3
4
for($i = 0; $i < 1000; $i++)
{
    if($i % 2 == 0) {/* iets */}
}


optimaliseert naar:
PHP:
1
2
3
4
for($i = 0; $i < 1000; $i += 2)
{
    /* iets */
}

Win je veel meer, zonder dat je code aan leesbaarheid inboet :)

edit:

Uiteraard is dit een vereenvoudigd voorbeeld, het kan zijn dat in je voorbeeld code het niet zo duidelijk is of iets even is en/of moet zijn

[ Voor 9% gewijzigd door ACM op 22-03-2003 22:22 ]


Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 22 maart 2003 @ 22:19:
[...]
Optimalisatie is iets dat je pas later moet doen, niet iets waar je in het begin al uitgebreid rekening mee moet houden.
[...]
Uiteraard; in eerste instantie maak ik meestal ook een prototype dat helder is en makkelijk aan te passen. Als het dan werkt ga ik pas optimalizeren. Als dan blijkt dat de volgende constructie:
PHP:
1
2
3
4
5
6
7
8
$i = 1;
while ($i) {

  $i--;

  // code

}

langzamer is dan de volgende:
PHP:
1
2
3
4
5
6
$i = 0;
do {

  // code

} while ($i--);

dan kies ik bij een wedstrijd voor de laatste omdat daar elke milliseconde telt, ook al is het eerste leesbaarder. In gewone pagina's laat ik gewoon de eerste constructie staan natuurlijk :)

Intentionally left blank


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Ik vind de tweede leesbaarder :P

Tenminste, zal van de omstandigheden afhangen. Maar het uitvoeren van je statement-code binnen de while-operator is wel wat minder netjes, hoewel het niet altijd handig is het anders op te lossen. Zoals met de resultsets uit de mysql-fetch functies.

Acties:
  • 0 Henk 'm!

  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

ACM schreef op 22 March 2003 @ 23:43:
Ik vind de tweede leesbaarder :P

Tenminste, zal van de omstandigheden afhangen. Maar het uitvoeren van je statement-code binnen de while-operator is wel wat minder netjes, hoewel het niet altijd handig is het anders op te lossen. Zoals met de resultsets uit de mysql-fetch functies.
uitvoering van een statement binnen een afvraging vind ik persoonlijk altijd nogal twijfelachtig, maar zoals je zelf al aangeeft kan het soms ook erg duidelijk zijn:
PHP:
1
2
3
while ($row = mysql_fetch_row($query)) {
  // blaat
}

enfin, ik laat je wel weten als ik de genoemde wedstrijd gewonnen heb. Inderdaad valt of staat het met het gebruikte algoritme. Echter bepaalt de snelheid ook of je een meer geavanceerd algoritme kan gebruiken voor grotere velden of niet; er zit immers een tijdslimiet aan vast die op mijn pc (AMD XP2000) overeenkomt met 12 seconden; veel mensen hebben al moeite om een 50x50 veld leeg te spelen zonder enig algoritme binnen die tijd...

Intentionally left blank

Pagina: 1