1

我的图像如下所示:

在此处输入图像描述

它从 antibot.php 获取图像

这是我的antibot.php

<?php
    session_start();
    $width      = 75;
    $height     = 40;
    $length     = 3;
    $baseList   = '1234567890';
    $code       = "";
    $counter    = 0;
    $image      = @imagecreate($width, $height) or die('Kunne ikke velge GD!');

    for($i=0; $i<10; $i++){
       imageline($image, 
             mt_rand(0,$width), mt_rand(0,$height), 
             mt_rand(0,$width), mt_rand(0,$height), 
             imagecolorallocate($image, mt_rand(150,255), 
                                        mt_rand(150,255), 
                                        mt_rand(150,255)))) or die('Kunne ikke velge line!');
    }

    for($i=0, $x=0; $i<$length; $i++){
       $actChar = substr($baseList, rand(0, strlen($baseList)-1), 1);
       $x += 10 + mt_rand(0,10);
       imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
          imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155)))) or die('Kunne ikke velge GD2!');
       $code .= strtolower($actChar)) or die('Kunne ikke velge GD3!');
    }

    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);
    $_SESSION['securityCode'] = $code;
?> 

我已经安装了 GD 和 freetype,有人可以帮我解决这个问题吗?

4

2 回答 2

1

语法错误,ComFreek 是对的:

   imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
      imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155)))) or die('Kunne ikke velge GD2!');
//                                                                            /\4?

一个右括号太多,应该是

   imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
      imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155))) or die('Kunne ikke velge GD2!');
//                                                                       3 is enough

哦,不要使用or die。如果有错误,请修复它。不要使用无意义的or die信息。让 PHP 显示错误(如第 X 行:意外)。
另外:不要使用@错误抑制运算符。如果有错误:修复它,不要掩盖它。将您的 ini 设置为E_STRICT | E_ALL并将显示错误设置为 1,并在您的代码上工作,直到它没有通知为止。

$image      = @imagecreate($width, $height) or die('Kunne ikke velge GD!');
//should be:
$image = imagecreate($width, $height);

它使您的代码更具可读性,如果出现问题,至少您有更好的机会真正知道要修复什么。像“Kunne ikke velge GD!”之类的东西。就像“有些事情不太奏效......不知道什么或在哪里”一样毫无意义

于 2013-08-19T11:43:41.717 回答
1

您的代码没有太多问题。删除for循环内imagecolorallocate末尾的额外括号。它只是有一些语法错误。

<?php
    session_start();
    $width      = 75;
    $height     = 40;
    $length     = 3;
    $baseList   = '1234567890';
    $code       = "";
    $counter    = 0;
    $image      = @imagecreate($width, $height) or die('Kunne ikke velge GD!');

    for($i=0; $i<10; $i++){
       imageline($image, 
             mt_rand(0,$width), mt_rand(0,$height), 
             mt_rand(0,$width), mt_rand(0,$height), 
             imagecolorallocate($image, mt_rand(150,255), 
                                        mt_rand(150,255), 
                                        mt_rand(150,255))) or die('Kunne ikke velge line!'); 
    }

    for($i=0, $x=0; $i<$length; $i++){
       $actChar = substr($baseList, rand(0, strlen($baseList)-1), 1);
       $x += 10 + mt_rand(0,10);
       imagechar($image, mt_rand(3,5), $x, mt_rand(5,20), $actChar, 
          imagecolorallocate($image, mt_rand(0,155), mt_rand(0,155), mt_rand(0,155))) or die('Kunne ikke velge GD2!');
       $code .= strtolower($actChar) or die('Kunne ikke velge GD3!');
    }

    header('Content-Type: image/jpeg');
    imagejpeg($image);
    imagedestroy($image);
    $_SESSION['securityCode'] = $code;
?> 

但更喜欢使用类似recaptcha的东西,它更容易实现,你可以让你的用户通过使用它来为数字化书籍做出贡献。

于 2013-08-19T11:45:23.553 回答