PHP - Den Fehler herausgefunden (wahrscheinlich / teilweise), aber immer noch nicht wissen, wie man ihn behebt - Wie man einen alphanumerischen Bereich ausdrückt

StackOverflow https://stackoverflow.com/questions/4841392

  •  27-10-2019
  •  | 
  •  

Frage

Ich habe diesen PHP-Code:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));

$i = 0;
while ($i <= 5) {
    $var .= $char[rand(0,68)];
    $i++;
}

echo $var;

Auf einen Blick sollte es einen 6-Zeichen-Stich erzeugen (wie: eVx97j).

Meistens mache ich das, aber in einigen Fällen werden 5 und 4 Zeichenfolgen wiedergegeben.

Ich bin mir fast sicher, dass dies an this liegt:

( KANN NICHTS MIT DEM PROBLEM ZU TUN HABEN )

  [50]=>
  string(1) "Y"
  [51]=>
  string(1) "Z"
  [52]=>
  int(0)
  [53]=>
  int(1)
  [54]=>
  int(2)

Sehen Sie den Unterschied?

Was mich verwundert ist, dass der Code Zeichenfolgen mit Zahlen generiert.

Können Sie den Fehler erkennen?

Ist dies in PHP die richtige Art, a-z + A-Z + 0-9 Zeichen auszudrücken?

Danke im Voraus !!

Bitte um Klarstellung!


Übrigens: Ich habe auch versucht: $char = array_merge(range('a', 'z'), range('A', 'Z'), range('0',' 9'));

War es hilfreich?

Lösung

rand(0,68)

Ich zähle nur 62 Elemente in diesem Array:

A-Z (26)
a-z (26)
0-9 (10)
    ----
     62

Vielleicht ist meine Mathematik aus?(Sogar Ihr Ideone zeigt die Indizes 0-61 ;-p)

Ich vermute, Sie erhalten Indizes außerhalb der Grenzen des Arrays und werden diese nicht hinzufügen (und sollten es auch nicht).Sie haben wahrscheinlich auch eine Fehlerunterdrückung aktiviert, sodass diese unbemerkt bleibt.

Andere Tipps

Meine Empfehlung lautet wie folgt:

$chars = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$pool = str_split($chars, 1);
$max = count($pool) - 1;

$random = '';
for ($i = 1; $i <= 5; $i ++) {
    $random .= $pool[mt_rand(0, $max)];
}

echo $random;

Es macht es viel einfacher zu sehen, welche Zeichen erlaubt sind, und erfordert auch keine Reihe von range () und Zusammenführungen.

Dies ist eigentlich ziemlich direkt aus dem Kohana-Kern: https://github.com/kohana/core/blob/3.0/develop/classes/kohana/text.php#L140 Sie bieten eine Vielzahl von Zeichengruppen, die unterschiedliche Zufallsmengen ermöglichen, einschließlicheindeutig, was für die Passwortgenerierung sehr nützlich ist.

Das Problem liegt im rand(0,68), da Ihr Alphabet 62 Zeichen hat, nicht 68. Wenn rand die Ganzzahlen 63 bis 67 zurückgibt, wird eine leere Zeichenfolge an den $var angehängt, was zu einer kürzeren Zeichenfolge von 5 Zeichen führt (oder sogar weniger, wenn Sie dies tun)sind "unglücklich genug").

Wie auch immer, ich denke es ist klarer, wenn Sie nur array_rand verwenden:

$char = array_merge(range('a', 'z'), range('A', 'Z'), range(0, 9));
for ($i = 0; $i < 6; $i++) {
    $var .= $char[array_rand($char)];
}
echo $var;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top