所以我在尝试将一点点验证码作为练习的早期阶段。
到目前为止,我的代码用于生成图像:
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。
我是一个相当新的人,所以我自己调试这个问题并不是必须的。请你提一些建议吗?
答案 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;
但不是两者;)