login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Snelle manier for foreach

Offline Jointjeff - 07/05/2014 14:55
Avatar van JointjeffHTML interesse Hallo iedereen,

Met een foreach loop ik door alle users in een array. Omdat dit er meer zijn dan 1200 duurt dit een tijdje.

Is er een manier om dit proces te versnellen?

  1. $users = $pol_options['users'];
  2.  
  3. if(!empty($users)):
  4. foreach ($users as $user_id):
  5. $user_info = get_userdata($user_id);
  6.  
  7. if(true == wp_check_password($passwd, $user_info->user_pass)){
  8. $username = $user_info->user_login;
  9. } else {
  10. continue;
  11. }
  12.  
  13. endforeach;
  14. endif;


Het script hierboven zorgt ervoor dat mensen op mijn WordPress site, enkel een wachtwoord in moeten voeren om in te loggen. Ik begrijp dat dit niet gebruikelijk is, maar dit is een duidelijke wens.

Hopende op hulp!

6 antwoorden

Gesponsorde links
Offline Thomas - 07/05/2014 15:11 (laatste wijziging 07/05/2014 15:51)
Avatar van Thomas Moderator Hm, hoe kun je ooit garanderen dat het password uniek is? Dit wordt niet afgedwongen lijkt mij? Daarnaast vermoed ik dat de hashes van passwords worden opgeslagen. Je kunt twee compleet verschillende wachtwoorden hebben, maar de hashes kunnen dan nog steeds hetzelfde zijn. Mede door de aard van hashfuncties is deze kans (zeer) klein, maar nog steeds aanwezig.

EDIT: het gevolg hiervan is dus dat, afhankelijk van de volgorde waarin je de users doorloopt, de kans bestaat dat user X als user Y wordt ingelogd indien de (hashes van de) wachtwoorden hetzelfde zijn. Dit lijkt mij absoluut niet de bedoeling.

Als het erom gaat dat iemand alleen maar zijn wachtwoord in hoeft te vullen, maak dan een functionaliteit bij waarbij de username wordt onthouden (via een cookie - deze gebruik je dan om (alle daaropvolgende keren dat je wilt inloggen) de username automatisch in te vullen in het loginformulier), dit is een vrij normale gang van zaken voor login-functionaliteit?

Om de bovenstaande reden (je kunt niet garanderen dat (hashes van) wachtwoorden uniek zijn) zou ik het persoonlijk niet op jouw manier (loopen door userdata) oplossen. Ik zou dus gaan voor de oplossing die ik voorstel: onthoud de username. Hiermee bereik je hetzelfde en dit lijkt mij (onder andere uit oogpunt van security en performance) beter dan de bovenstaande "hack".

EDIT2: Heb je voor de gein wel eens een query uitgevoerd op je usertabel om te zien of er duplicaten in je hashes zitten? Hoe vaak voeren mensen "welkom" of iets dergelijks in als wachtwoord?

  1. SELECT wachtwoord_kolom, COUNT(wachtwoord_kolom) AS aantal
  2. FROM gebruiker_tabel
  3. GROUP BY wachtwoord_kolom
  4. HAVING aantal > 1

Als de bovenstaande query resultaat oplevert, heb je sowieso duplicaten. Dat is op zich niet erg (ik ken geen applicaties met een uniek wachtwoord constraint) maar het illustreert wel wat er zou kunnen gebeuren als je jouw oplossing toepast. Indien de query resultaten oplevert houdt dit in dat er een reële kans is dat gebruikers als de verkeerde persoon worden ingelogd.
Offline vinTage - 07/05/2014 21:05
Avatar van vinTage Nieuw lid In je foreach een break bijzetten zal het sneller maken (de eerste hit, al dan niet uniek) en de foreach zal stoppen ipv alle records aflopen, zelfs al is het "prijs" bij de eerste record.
Offline Thomas - 07/05/2014 22:10
Avatar van Thomas Moderator Dat zou inderdaad sneller zijn, maar de oplossingsrichting die Jointjeff gekozen heeft lijkt mij niet de goede. Het enige wat je hiermee bereikt is dat het vlotter misgaat .

Het is niet verstandig om voort te borduren op een verkeerde oplossing.
Offline vinTage - 08/05/2014 17:53 (laatste wijziging 08/05/2014 17:55)
Avatar van vinTage Nieuw lid Ik vind het sowieso gaar dat ze alleen hun ww moeten ingeven...als je die uniek wilt maken, dan krijg je bij aanmelding zo iets:
Sorry, uw registratie kan niet worden afgerond, het door u opgegeven wachtwoord bestaat al 

Verder sowieso een beetje raar, want je browser kan gewoon alle gegevens onthouden zodat je zelfs niet eens een ww moet invoeren.
Offline Jointjeff - 09/05/2014 10:04
Avatar van Jointjeff HTML interesse Bedankt voor alle reacties.

Nogmaals, het is zeer ongebruikelijk, echter is het een specifieke wens.

Ik ga bovenstaande opties even rustig bekijken en uit proberen.

@Vintage: registraties vinden niet vanuit de gebruiker plaats, maar accounts worden handmatig klaargezet. Die melding komt in ieder geval bij de gebruiker dus niet voor ;)
Offline Thomas - 09/05/2014 11:04
Avatar van Thomas Moderator Ik denk dat ik wel begrijp wat je ongeveer probeert te bereiken, ik weet alleen niet of dit de juiste manier is om dat te doen.

Omdat je van het normale stramien afwijkt, zul je met een heleboel zaken rekening moeten houden. Heb je bijvoorbeeld al nagedacht over het volgende:

- wat nu als je nieuwe gebruikers aan moet maken; heb je dan ergens een aparte administratie met gegevens zodat je je "unieke wachtwoord constraint" in stand kunt houden?

- heb je alle functionaliteit waarmee iemand zijn wachtwoord kan wijzigen of resetten (lost password?) dichtgezet? weet je dat zeker? je initiële batch van wachtwoorden is dan misschien wel uniek, maar hoe zorg je ervoor dat dit zo blijft?

- wat nu als iemand zijn wachtwoord vergeten of kwijtgeraakt is? hoe kan iemand dan aangeven voor welk account dat is?
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.183s