2013-08-19 5 views
1

Моего изображения выглядит следующим образом:сломанного изображения PHP (GD)

enter image description here

Его получает изображение от 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; 
?> 

I установили GD и freetype, может ли кто-нибудь помочь мне исправить это?

+1

Зачем пережить всю эту проблему, чтобы изобретать колесо. Использование captcha просто _way_ проще, если вы спросите меня. Все это было сделано до ... –

+0

Откройте изображение URI в браузере и вставьте его, пожалуйста. Вероятно, у вас есть синтаксическая ошибка во втором цикле * for *. – ComFreek

+0

Возможный дубликат [Изображение не будет показано (PHP и GD)] (http://stackoverflow.com/questions/18300535/image-wont-show-php-and-gd). Вы задали этот точный вопрос раньше. Конечно, на этот раз у вас появилось другое сообщение об ошибке, но это кодирование для вас. половину времени, речь идет об отладке, что вам нужно сделать самому, это не бесплатный сервис отладчика. –

ответ

1

В вашем коде не так много проблем. Снимите дополнительные кронштейны в конце 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 что довольно легко реализовать, и вы можете позволить своим пользователям способствовать то оцифровке книг, используя его.

+0

. Как синтаксическая ошибка не проблема? –

+0

@EliasVanOotegem Извините, это была ошибка опечатки :) – Stranger

+0

Спасибо. Не могли бы вы сказать, что вы изменили? :) –

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!» примерно такой же бессмысленный, как «Что-то не сработало ... не знаю, что и где»