未初始化的字符串偏移量:62

时间:2015-03-15 10:37:35

标签: php gd

所以我在尝试将一点点验证码作为练习的早期阶段。

到目前为止,我的代码用于生成图像:

session_start();
header('Content-type: image/jpeg');

$string = $_SESSION['secure'];
$font_size = 5;
$image_width = ImageFontWidth($font_size)*strlen($string);
$image_height = ImageFontHeight($font_size);

$image = imagecreate($image_width, $image_height);
imagecolorallocate($image, 255, 255, 255);
$font_colour = imagecolorallocate($image, 0, 0, 0);

imagestring($image, $font_size, 0, 0, $string, $font_colour);
imagejpeg($image);

表单本身的代码(函数在单独的文件(rand.php)中):

function random_string($length = 10){
    $alphnum = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
    $alphnum_length = strlen($alphnum);
    $random_string = '';

    for ($i=0; $i < $length; $i++) { 
        $random_string.= $alphnum[rand(0, $alphnum_length)];
    }
    return $random_string;

}

require('../rand.php'); 

$_SESSION['secure'] = random_string(5);
echo $_SESSION['secure'];

现在它生成一个随机字符串,并且在生成图像页面上确实生成了一个图像。我还没有在表单页面上输出图像,但这不是问题。

问题是每20次刷新表单页面(当前只输出random_string的页面)我得到一个错误说明:

(!)注意:未初始化的字符串偏移量:C中的62:第10行的Sandbox \ gd \ rand.php

我收到此错误,而不是通常的5个字符长度字符串,我只得到4。

我是一个相当新的人,所以我自己调试这个问题并不是必须的。请你提一些建议吗?

1 个答案:

答案 0 :(得分:4)

问题在于,&#39; Z&#39;是索引61而不是62(字符串的长度),因为php中的数组以索引0开头。所以让我们去代码:

<?php

// [...]
function random_string($length = 10){
$alphnum = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
// $alphnum_length will contain 62
$alphnum_length = strlen($alphnum);

//[...]
    // the rand function will produce random numbers between 0 and 62 
    // (0 <= random number <= 62)
    // but the biggest index is just 61
    $random_string.= $alphnum[rand(0, $alphnum_length)];
// [...]
}

所以你必须更换

$random_string.= $alphnum[rand(0, $alphnum_length)];

$random_string.= $alphnum[rand(0, $alphnum_length - 1)];

或者如果你想要更多的表现(一点点)替换

$alphnum_length = strlen($alphnum);

$alphnum_length = strlen($alphnum) - 1;

但不是两者;)