ugrás a tartalomhoz

Jelszó készítő

morocztamas · 2011. Nov. 5. (Szo), 12.27
Csináltam (volna) egy jelszó készítőt, de hiba üzenetet dob ki, hogy a 60. vagy a 48. sorban van hiba valami harminc másodperccel kapcsolatban(?).
  1. <?php  
  2.   $kisbetűk = 'a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z';  
  3.   $nagybetűk = 'A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z';  
  4.   $számok = '0,1,2,3,4,5,6,7,8,9';  
  5.   $írásjelek = '~,",\',+,-,%,/,\,|,=,(,),[,],{,},@,&,#,$,<,>,_,;, ';  
  6.   $tömb[1] = $kisbetűk;  
  7.   $tömb[2] = $nagybetűk;  
  8.   $tömb[3] = $számok;  
  9.   $tömb[4] = $írásjelek;  
  10.   $kisbetűtlen[1] = $nagybetűk;  
  11.   $kisbetűtlen[2] = $számok;  
  12.   $kisbetűtlen[3] = $írásjelek;  
  13.   $nagybetűtlen[1] = $kisbetűk;  
  14.   $nagybetűtlen[2] = $számok;  
  15.   $nagybetűtlen[3] = $írásjelek;  
  16.   $számtalan[1] = $kisbetűk;  
  17.   $számtalan[2] = $nagybetűk;  
  18.   $számtalan[3] = $írásjelek;  
  19.   for ($i = 0; $i < 30; $i ++) {  
  20.     $kivont = $i - 1;  
  21.     if ($i = 0) {  
  22.       $faj = $tömb[array_rand($tömb)];  
  23.       if ($faj = $kisbetűk) {  
  24.         $jel = explode (','$kisbetűk);  
  25.       }  
  26.       elseif ($faj = $nagybetűk) {  
  27.         $jel = explode (','$nagybetűk);  
  28.       }  
  29.       elseif ($faj = $számok) {  
  30.         $jel = explode (','$számok);  
  31.       }  
  32.       elseif ($faj = $írásjelek) {  
  33.         $jel = explode (',', $írásjelek);  
  34.       }  
  35.       $jelszó[$i] = $jel[array_rand($jel)];  
  36.     } elseif (strstr ($kisbetűk, $jelszó[$kivont])) {  
  37.       $faj = $kisbetűtlen[array_rand($kisbetűtlen)];  
  38.       if ($faj = $nagybetűk) {  
  39.         $jel = explode (','$nagybetűk);  
  40.       }  
  41.       elseif ($faj = $számok) {  
  42.         $jel = explode (','$számok);  
  43.       }  
  44.       elseif ($faj = $írásjelek) {  
  45.         $jel = explode (',', $írásjelek);  
  46.       }  
  47.       $jelszó[$i] = $jel[array_rand($jel)];  
  48.     } elseif (strstr ($nagybetűk, $jelszó[$kivont])) {  
  49.       $faj = $nagybetűtlen[array_rand($nagybetűtlen)];  
  50.       if ($faj = $kisbetűk) {  
  51.         $jel = explode (','$kisbetűk);  
  52.       }  
  53.       elseif ($faj = $számok) {  
  54.         $jel = explode (','$számok);  
  55.       }  
  56.       elseif ($faj = $írásjelek) {  
  57.         $jel = explode (',', $írásjelek);  
  58.       }  
  59.       $jelszó[$i] = $jel[array_rand($jel)];  
  60.     } elseif (strstr ($számok, $jelszó[$kivont])) {  
  61.       $faj = $számtalan[array_rand($számtalan)];  
  62.       if ($faj = $kisbetűk) {  
  63.         $jel = explode (','$kisbetűk);  
  64.       }  
  65.       elseif ($faj = $nagybetűk) {  
  66.         $jel = explode (','$nagybetűk);  
  67.       }  
  68.       elseif ($faj = $írásjelek) {  
  69.         $jel = explode (',', $írásjelek);  
  70.       }  
  71.       $jelszó[$i] = $jel[array_rand($jel)];  
  72.     }  
  73.     echo $jelszó[$i];  
  74.   }  
  75. ?>  
Mi az, ami miatt nem megy?
 
1

if ($i = 0) {Mivel minden

Poetro · 2011. Nov. 5. (Szo), 12.34
  1. if ($i = 0) {  
Mivel minden iterációban beállítod $i értékét 0-ra, nem csoda. Így sose fejeződik be a ciklus.
2

Nem állítom be

morocztamas · 2011. Nov. 5. (Szo), 12.52
Az csak feltétel a ha elágazásban. Vagy ha az a hiba, akkor miért? Mármint miért állítja be nullára?

Jah == kell. :D
Így működik, de a számokat és a különleges írásjeleket nem használja fel. Miért?
http://realgameguides.com/jel/index.php
3

nem a megoldás...

TeeCee · 2011. Nov. 5. (Szo), 14.38
..., de azért mennyivel elegánsabb így kezdeni:
  1. $kisbetűk = explode(',''a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z');    
Ugyebár nem kell mindenhova explode-t írni, ami miatt:
1.) átláthatóbb
2.) nem fut le kismilliószor az explode!
4

Másik megközelítés

Poetro · 2011. Nov. 5. (Szo), 14.55
  1. <?php  
  2. function generatePass($length = 30) {  
  3.   // Nagybetűk  
  4.   $upper = range('A''Z');  
  5.   // Kisbetűk  
  6.   $lower = range('a''z');  
  7.   // Számok  
  8.   $num = range(0, 9);  
  9.   // Speciális karakterek  
  10.   $special = array_merge(range(' ''/'), range(':''@'), range('[''_'));  
  11.   // Típusok  
  12.   $types = array($upper$lower$num$special);  
  13.   // Minden típusból van már egy?  
  14.   $has_all = FALSE;  
  15.   // Jelszó  
  16.   $pass = array();  
  17.   for($i = 0; $i < $length$i++) {  
  18.     // Összekeverjük a típusokat, hogy véletlen legyen, melyik a következő.  
  19.     shuffle($types);  
  20.     // Vesszük az első típust.  
  21.     $type = reset($types);  
  22.     // Ha még nincs karakter, szabadon generálunk egyet.  
  23.     if (!$i) {  
  24.       $char = $type[array_rand($type)];  
  25.     }  
  26.     else {  
  27.       $char = '';  
  28.       // Ha még nincsen minden típusból egy, akkor megkeressük melyik nincs.  
  29.       if (!$has_all) {  
  30.         foreach ($types as $type) {  
  31.           if (!count(array_intersect($pass$type))) {  
  32.             $char = $type[array_rand($type)];  
  33.             break;  
  34.           }  
  35.         }  
  36.       }  
  37.       // Már van mindegyikből egy.  
  38.       if (!$char) {  
  39.         $has_all = TRUE;  
  40.         $char = $type[array_rand($type)];  
  41.       }  
  42.     }  
  43.     $pass[] = $char;  
  44.   }  
  45.   // Stringet adunk vissza.  
  46.   return implode(''$pass);  
  47. }  
  48.   
  49. print(generatePass(20));  
  50. ?>  
5

Kiváló

morocztamas · 2011. Nov. 5. (Szo), 15.55
Az utolsó sorban 30-ra kell ugyan állítani.

Azt hogyan adhatom meg neki, hogy ugyanolyan betűt, számot, írásjelet ne adjon ki kétszer, illetve hogy egymás után ne lehessen két kisbetű, két nagy vagy két szám?
6

Rádbízom

Poetro · 2011. Nov. 5. (Szo), 16.16
Ezeket rádbízom, minden szükséges trükk és függvény már szerepel a fenti példában, hogy sikerüljön.
Annyi segítséget adok, hogy érdemesebb az előző típust letárolni, és csak azt ellenőrizni, hogy a mostani típus nem olyan típusú-e mint az előző. Ehhez érdemes tárolni a $types tömbben az elemek típusát, és a shuffle helyett egy olyan összekeverést használni, ami megtartja a kulcsokat.
  1. $types = array('upper' => $upper'lower' => $lower'num' => $num'special' => $special);  
  2.   
  3. function ashuffle_ord() {  
  4.   return mt_rand(-1, 1);  
  5. }  
  6.   
  7. function ashuffle(&$array) {  
  8.   return uasort($array'ashuffle_ord');  
  9. }  
És akkor shuffle helyett ashuffle függvényt kell meghívni.
7

Kösz!

morocztamas · 2011. Nov. 5. (Szo), 19.01
Kösz! Ebből fogok kiindulni.