2013-04-04 3 views
0
protected static function generateString ($length = 50, $Password){ 
     $characters = $Password; 
     $string = ''; 

     for ($p = 0; $p < $length; $p++) { 
      $string .= $characters[mt_rand(0, strlen($characters))]; // Error Line 
     } 
     echo $string; 
    } 

Bonjour. Je construis une classe d'authentification, et la fonction ci-dessus me donne une certaine douleur, je continue à me présentais avec le message d'erreur:Décalage de chaîne non initialisé

Avis: chaîne non initialisée offset: 16

L'écho est là pour fins de test.

J'appelle ma fonction à l'aide:

public static function Compile($Password, $Length){ 
     self::generateString($Length,$Password); 
    } 

Auth::Compile('testi ngpassword', 10); 

Quand je lance mon script, il génère parfois sans message d'erreur; mais lors de l'exécution de plusieurs fois (3-7) je reçois le message comme indiqué ci-dessus? et parfois cet avis montre plus de deux lignes? Alors, pourquoi le message d'erreur est-il généré de manière aléatoire lors de l'exécution répétée? quand les arguments spécifiés ne changent pas?

+1

Les chaînes sont basées sur zéro, leur longueur commence par 1 ... donc le dernier caractère donnera un mauvais décalage –

Répondre

2

considèrent cette ligne:

strlen($characters) 

si la longueur de la chaîne est de 16 et vous faire un nombre aléatoire choisir entre 0 et 16 que vous lui donnez la possibilité de sélectionner l'indice après la dernière, ce qui est rien. Vous devez le faire

strlen($characters) - 1 

Puisque l'index commence réellement à 0;

+0

'[mt_rand (0, strlen ($ caractères) -1)];' présente toujours les messages d'erreur –

+0

quand vous imprimez des caractères $, il produit quelque chose, non? La déclaration ci-dessus se produirait également si les caractères avaient une longueur de zéro. –

+0

Veuillez ne pas tenir compte de ce dernier commentaire, je modifiais le mauvais extrait, pas le code comme je l'ai dit. Cela a fonctionné, donc pour référence future, 'strlen' ajoute +1 à la longueur quand il est appelé? donc dire à l'index de commencer à -1? –

Questions connexes