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(?).
<?php
  $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';
  $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';
  $számok = '0,1,2,3,4,5,6,7,8,9';
  $írásjelek = '~,",\',+,-,%,/,\,|,=,(,),[,],{,},@,&,#,$,<,>,_,;, ';
  $tömb[1] = $kisbetűk;
  $tömb[2] = $nagybetűk;
  $tömb[3] = $számok;
  $tömb[4] = $írásjelek;
  $kisbetűtlen[1] = $nagybetűk;
  $kisbetűtlen[2] = $számok;
  $kisbetűtlen[3] = $írásjelek;
  $nagybetűtlen[1] = $kisbetűk;
  $nagybetűtlen[2] = $számok;
  $nagybetűtlen[3] = $írásjelek;
  $számtalan[1] = $kisbetűk;
  $számtalan[2] = $nagybetűk;
  $számtalan[3] = $írásjelek;
  for ($i = 0; $i < 30; $i ++) {
    $kivont = $i - 1;
    if ($i = 0) {
      $faj = $tömb[array_rand($tömb)];
      if ($faj = $kisbetűk) {
        $jel = explode (',', $kisbetűk);
      }
      elseif ($faj = $nagybetűk) {
        $jel = explode (',', $nagybetűk);
      }
      elseif ($faj = $számok) {
        $jel = explode (',', $számok);
      }
      elseif ($faj = $írásjelek) {
        $jel = explode (',', $írásjelek);
      }
      $jelszó[$i] = $jel[array_rand($jel)];
    } elseif (strstr ($kisbetűk, $jelszó[$kivont])) {
      $faj = $kisbetűtlen[array_rand($kisbetűtlen)];
      if ($faj = $nagybetűk) {
        $jel = explode (',', $nagybetűk);
      }
      elseif ($faj = $számok) {
        $jel = explode (',', $számok);
      }
      elseif ($faj = $írásjelek) {
        $jel = explode (',', $írásjelek);
      }
      $jelszó[$i] = $jel[array_rand($jel)];
    } elseif (strstr ($nagybetűk, $jelszó[$kivont])) {
      $faj = $nagybetűtlen[array_rand($nagybetűtlen)];
      if ($faj = $kisbetűk) {
        $jel = explode (',', $kisbetűk);
      }
      elseif ($faj = $számok) {
        $jel = explode (',', $számok);
      }
      elseif ($faj = $írásjelek) {
        $jel = explode (',', $írásjelek);
      }
      $jelszó[$i] = $jel[array_rand($jel)];
    } elseif (strstr ($számok, $jelszó[$kivont])) {
      $faj = $számtalan[array_rand($számtalan)];
      if ($faj = $kisbetűk) {
        $jel = explode (',', $kisbetűk);
      }
      elseif ($faj = $nagybetűk) {
        $jel = explode (',', $nagybetűk);
      }
      elseif ($faj = $írásjelek) {
        $jel = explode (',', $írásjelek);
      }
      $jelszó[$i] = $jel[array_rand($jel)];
    }
    echo $jelszó[$i];
  }
?>
Mi az, ami miatt nem megy?
 
1

if ($i = 0) {Mivel minden

Poetro · 2011. Nov. 5. (Szo), 12.34
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:

$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
<?php
function generatePass($length = 30) {
  // Nagybetűk
  $upper = range('A', 'Z');
  // Kisbetűk
  $lower = range('a', 'z');
  // Számok
  $num = range(0, 9);
  // Speciális karakterek
  $special = array_merge(range(' ', '/'), range(':', '@'), range('[', '_'));
  // Típusok
  $types = array($upper, $lower, $num, $special);
  // Minden típusból van már egy?
  $has_all = FALSE;
  // Jelszó
  $pass = array();
  for($i = 0; $i < $length; $i++) {
    // Összekeverjük a típusokat, hogy véletlen legyen, melyik a következő.
    shuffle($types);
    // Vesszük az első típust.
    $type = reset($types);
    // Ha még nincs karakter, szabadon generálunk egyet.
    if (!$i) {
      $char = $type[array_rand($type)];
    }
    else {
      $char = '';
      // Ha még nincsen minden típusból egy, akkor megkeressük melyik nincs.
      if (!$has_all) {
        foreach ($types as $type) {
          if (!count(array_intersect($pass, $type))) {
            $char = $type[array_rand($type)];
            break;
          }
        }
      }
      // Már van mindegyikből egy.
      if (!$char) {
        $has_all = TRUE;
        $char = $type[array_rand($type)];
      }
    }
    $pass[] = $char;
  }
  // Stringet adunk vissza.
  return implode('', $pass);
}

print(generatePass(20));
?>
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.
$types = array('upper' => $upper, 'lower' => $lower, 'num' => $num, 'special' => $special);

function ashuffle_ord() {
  return mt_rand(-1, 1);
}

function ashuffle(&$array) {
  return uasort($array, 'ashuffle_ord');
}
É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.