PDA

Просмотр полной версии : Циклы при GD


Ru}{eeZ
13.12.2008, 21:38
Через циклы заношу рандомные данные в общую переменную, для того, чтобы поместить их в сессию. Но почему то после цикла (и for, и foreach) переменная $rand чтоли как-то "унсетится", т.е. "удаляется" чтоли... и естественно картинка не отображается. Что не так?

for($i = 0; $i < 6; $i++) $rand[] = $abc[mt_rand(0,22)];
//foreach($rand as $randOne) $fullRand = $randOne;
for($i = 0; $i < 6; $i++) $fullRand .= $rand[$i];
$_SESSION['captcha'] = $fullRand;
for($i = 0; $i < 6; $i++) imageTtfText($image,mt_rand(12,15),mt_rand(-20,20),15 * $i + mt_rand(4,8),mt_rand(20,25),$color[$i],'arial.ttf',$rand[$i]);

Kaimi
13.12.2008, 21:41
А ты её объяви до циклов, типа
$rand = array();

Ru}{eeZ
13.12.2008, 21:55
если пустые квадратные скобки - php автоматически создаёт массив, т.е., если без циклов, то всё отлично работает.
п.с. на всякий случай попробовал. безуспешно...

optimazer
14.12.2008, 02:25
2Chaak
=))))))

2Ru}{eeZ
... генерируешь случайную или псевдослучайную последовательность $rc1, запоминаешь его в сессию
и выводишь её в капчу

<?php
$image = imageCreate(100, 30);

$bg = imagecolorallocate($image, 255, 255, 255);
$textcolor = imagecolorallocate($image, 109, 81, 147);

// читаешь случайные переменные из сессии
session_start();
$rc1 = $_SESSION['rc'];

imageString($image, 4, 10, 10, $rc1, $textcolor);

//header("Content-type: image/gif");
header("Content-type: image/png");

imageInterlace($image, 1);

imageColorTransparent($image, $colorBackgr);

//imageGIF($image);
imagePNG($image);
?>

вышеописанный скрипт называешь kapcha.php

а на странице выводишь
<img src="./путь_к_файлу/kapcha.php">

Gifts
14.12.2008, 13:29
Ru}{eeZ По вопросу - ты не забыл объявить не пустой массив (или строку?) $abc из которого собственно и берешь значения?

З.Ы. чую на одну и ту же капчу, можно будет регаться сколько угодно раз, судя по такому коду

optimazer
14.12.2008, 18:18
2Gifts
смотря какую случайную последовательность выводить будешь!

к примеру если последовательность задается рандомом
$rand = rand(10000000000,9999999999);
$_SESSION['rc'] = $rand;
и при каждом запросе обновляется
то на одну и ту же капчу попасть очень сложно =))))

а для пущей сложности можно цифры повертеть, добавить буквы или логику с арифметикой...

Chaak
14.12.2008, 18:41
2Gifts
смотря какую случайную последовательность выводить будешь!

к примеру если последовательность задается рандомом

и при каждом запросе обновляется
то на одну и ту же капчу попасть очень сложно =))))

а для пущей сложности можно цифры повертеть, добавить буквы или логику с арифметикой...
Какая разница сколько цифр генерировать :)? Главное чтобы боты не распознали и юзеру было удобно вбивать капчи :)

а для пущей сложности можно цифры повертеть, добавить буквы или логику с арифметикой...
Сложности кого? Пользователя или компютера)?. Ты думаешь компьютер не умеет считать? :D Он считает лучше тебя :) только скажи ему посчтитать)

------------------

Рельно использовать разные шрифты / бэкграунды / искажения / фильтры резкости.

Если проект маленький, то зачем выдумывать сложную капчу со всякими там искажениями и прочими извращениями? Достаточно установить уже готовый скрипт:
http://captcha.ru/kcaptcha/
Из готовых решений мой выбор в сторону:
http://recaptcha.net/

m0Hze
14.12.2008, 18:42
2Gifts
смотря какую случайную последовательность выводить будешь!

к примеру если последовательность задается рандомом

и при каждом запросе обновляется
то на одну и ту же капчу попасть очень сложно =))))

а для пущей сложности можно цифры повертеть, добавить буквы или логику с арифметикой...

Проще стогда снаала объявить 2 переменные

$rand1 = rand(100000000,9999999999);
$rand2 = rand(100000000,9999999999);
$rand = $rand1 + $rand2;

Тогда на одну и туже капчу попасть будет практически не возможно.Ну хотя возможно все....но если добавить ну хотябы 3 буквы,например, сначала $rand ставим 1 букву в серебке и в конце.Это легко провернуть, и тогда получиться убойная капча Ж)

optimazer
14.12.2008, 19:26
2ChaaK
я в курсе! спасибо.

и полностью поддерживаю что проще пользоваться фреймвёрками!

однако:

Сложности кого? Пользователя или компютера)?Сложности капчи, для того чтобы боты не распознали!

а про логику с арифметикой: пример
сгенери боту капчу
rand_A плюс rand_B минус rand_C равно?
а еще буквы искази
и пускай хоть обчитается и обсчитается!

Ru}{eeZ
15.12.2008, 15:30
вернёмся к вопросу...
если написать:
for($i = 0; $i < 6; $i++) $fullRand = $rand[$i];
без точки, то естественно с каждым разом переменная $fullRand будет просто получать новые данные, но тогда всё работает, т.е. будет браться только последняя буква из капчи, а нужно, что бы всё буквы брались и заносились в одну переменную, для того, чтобы записать их в сессию. Это срабатывает, НО! Капча не выводится т.к. до неё не доходит $fullRand.
Ну и вот вам в общем капча, чтобы не разбегались в догадках...

<?php
session_start();
$image = imageCreate(100, 30);
imageColorAllocate($image, 255, 255, 255);
for($i = 0; $i < 10; $i++) $color[] = imageColorAllocate($image, mt_rand(0,240), mt_rand(0,240), mt_rand(0,240));
$abc = array('A','B','C','D','E','F','G','H','I','J','K', 'L','M','N','1','2','3','4','5','6','7','8','9');
for($i = 0; $i < 6; $i++) $rand[] = $abc[mt_rand(0,22)];
foreach($rand as $randOne) $fullRand .= $randOne;
//for($i = 0; $i < 6; $i++) $fullRand .= $rand[$i];
$_SESSION['captcha'] = $fullRand;
for($i = 0; $i < 6; $i++) imageTtfText($image,mt_rand(12,15),mt_rand(-20,20),15 * $i + mt_rand(4,8),mt_rand(20,25),$color[$i],'arial.ttf',$rand[$i]);
for($i = 0; $i < 3; $i++) imageArc($image, mt_rand(0,90), mt_rand(0,20), mt_rand(10,60), mt_rand(10,60), mt_rand(-380,0), mt_rand(0,380), $color[$i]);
header('Content-type: image/png');
imagePng($image);
?>

groundhog
15.12.2008, 16:12
Так объяви в самом начале:

$rand = array();
$fullRand = '';

Ru}{eeZ
15.12.2008, 16:14
Так объяви в самом начале:

$rand = array();
$fullRand = '';

Я хуею! Так просто прийти и решить мою проблемму!)))
Спасибо большое!)

groundhog
15.12.2008, 16:20
По-моему до меня кто-то уже высказывал эту идею, только насчёт одной переменной... А вообще, если бы у тебя был включён вывод Warnings то ты бы сам понял в каком месте возникает косяк...

Ru}{eeZ
15.12.2008, 16:40
Каими)
$fullRand = ''; не хватало только

optimazer
15.12.2008, 17:06
1) выделенное темно-красным:
Здесь пишется относительный путь к файлу шрифта!!!

2) размеры и цвета подгонишь потом

<?php
session_start();

$image = imageCreate(200, 50);

$bg = imagecolorallocate($image, 255, 255, 255);

$abc = array('A','B','C','D','E','F','G','H','I','J','K', 'L','M','N','1','2','3','4','5','6','7','8','9');

for ($i=0;$i<6;$i++) {
$rand[$i] = $abc[mt_rand(0,22)];
}

for ($i=0;$i<6;$i++) {
$textcolor = imagecolorallocate($image, rand(0,255), rand(0,255), rand(0,255));
imagettftext( $image, 20, 0 + 10*$i, 10 + 25*$i, 25, $textcolor, "./Arial.ttf", $rand[$i]);
imageArc($image, rand(0,90), rand(0,20), rand(10,60), rand(10,60), rand(-380,0), rand(0,380), $textcolor);
}

$_SESSION['RAND_STRING'] = implode("",$rand);

header('Content-type: image/png');

imageInterlace($image, 1);

imageColorTransparent($image, $colorBackgr);

imagePng($image);
?>

________________________________________

ооооо ёпрст
ты уже разобрался
блин запоздал я