За последние 24 часа нас посетили 17913 программистов и 1604 робота. Сейчас ищут 1424 программиста ...

На картинке рисуется не то число которое генерирует rand

Тема в разделе "PHP для новичков", создана пользователем Crystallon, 20 ноя 2011.

  1. Crystallon

    Crystallon Активный пользователь

    С нами с:
    7 фев 2010
    Сообщения:
    61
    Симпатии:
    0
    Делаю капчу, возникла странная проблема - на картинке рисуется не то число которое генерирует функция rand, если задавать число вручную без rand то выводится на картинке и пишется в БД одно и тоже число, то которое я задал, а вот при использовании ранд число на картинке и то что пишется в БД не совпадает совершенно. Я весь код 500 раз перепроверил, все должно работать нормально но выходит вот эта хрень.
    В чем может быть проблема?
    Заранее спасибо за помощь.
     
  2. BaNru

    BaNru Активный пользователь

    С нами с:
    2 окт 2011
    Сообщения:
    7
    Симпатии:
    0
    Адрес:
    Сызрань
    Ну попробуем поиграть в экстрасенсов.
    Скорее всего у тебя идет несколько генераций rand, один раз ты вызываешь рандом при отрисовке, второй раз ты его вызываешь при записи.
    Что бы этого не было - необходимо присвоить переменной этот рандом и уже отрисовывать и записывать эту переменную.
     
  3. Crystallon

    Crystallon Активный пользователь

    С нами с:
    7 фев 2010
    Сообщения:
    61
    Симпатии:
    0
    О да...похоже меня тут принимают за дауна... Вот код(надо было сразу конешн кинуть но чет тупанул):

    PHP:
    1.  
    2. if ($_action == "get_captcha") {
    3. header("Content-type: image/gif");
    4. $captcha_code = rand(100, 999); //Случайное число
    5. //$captcha_code = 547;
    6. $ip = $_SERVER['REMOTE_ADDR'];
    7. $time = time();
    8. //Время жизни кода капчи
    9. $r_time = $time - 60*5;
    10. $dbl->sql_query("DELETE FROM `cap_captcha` WHERE `time` < '{$r_time}'");
    11.  
    12. $query = $dbl->sql_query("SELECT count(*) FROM `cap_captcha` WHERE `ip` = '{$ip}'");
    13. $captcha_count = $dbl->sql_fetchfield(0,0,$query);
    14. if ($captcha_count > 0) {
    15.     $dbl->sql_query("UPDATE `cap_captcha` SET `code` = '{$captcha_code}', `time` = '{$time}' WHERE `ip` = '{$ip}'");
    16. } else {
    17.     $query = $dbl->sql_query("INSERT INTO `cap_captcha` (`ip`,`code`,`time`) VALUES ('{$ip}', '{$captcha_code}', '{$time}')");
    18. }
    19.  
    20. //$font = rand (1, 25); //Случайный выбор шрифта
    21. $font = 26;
    22. $color1 = rand (10, 200);
    23. $color2 = rand (10, 200);
    24. $color3 = rand (10, 200);
    25.  
    26. $rgb=0x2f2f2f;//цвет заливки
    27. $txt_box=imagettfbbox(18, 0, "captcha_lib/".$font.".ttf", $captcha_code);
    28. if($txt_box[0]<0){$txt_box[0]=$txt_box[0]*(-1);}
    29. if($txt_box[1]<0){$txt_box[1]=$txt_box[1]*(-1);}
    30. if($txt_box[2]<0){$txt_box[2]=$txt_box[2]*(-1);}
    31. if($txt_box[3]<0){$txt_box[3]=$txt_box[3]*(-1);}
    32. if($txt_box[4]<0){$txt_box[4]=$txt_box[4]*(-1);}
    33. if($txt_box[5]<0){$txt_box[5]=$txt_box[5]*(-1);}
    34. if($txt_box[6]<0){$txt_box[6]=$txt_box[6]*(-1);}
    35. if($txt_box[7]<0){$txt_box[7]=$txt_box[7]*(-1);}
    36. $box_width=($txt_box[0]+$txt_box[2]+$txt_box[4]+$txt_box[6])/2;
    37. $box_height=($txt_box[1]+$txt_box[3]+$txt_box[5]+$txt_box[7])/2;
    38. //$img = imagecreatetruecolor($box_width+1,$box_height+1);//вспомагательное изображение
    39. $img = imagecreatetruecolor(60,33);//вспомагательное изображение
    40. imagefill($img, 0, 0, $rgb);//заливаем его ...
    41. //imageColorTransparent($img, $rgb);
    42. imagettftext($img, 18, 0, 1, $box_height-2, imageColorAllocate($img, $color1,$color2,$color3), "captcha_lib/".$font.".ttf", $captcha_code);
    43. imagegif($img);//готово к употреблению
    44. //убираем после себя
    45. exit();
    46. }
    47.  
     
  4. Crystallon

    Crystallon Активный пользователь

    С нами с:
    7 фев 2010
    Сообщения:
    61
    Симпатии:
    0
    $captcha_code = rand(100, 999);
    Вот эта строчка генерит случайную цифру, если заменяю ее на:
    $captcha_code = 123; (т.е. просто на задаваемое число)
    То все становится нормально.