Циклы при GD

Discussion in 'PHP' started by Ru}{eeZ, 13 Dec 2008.

  1. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Через циклы заношу рандомные данные в общую переменную, для того, чтобы поместить их в сессию. Но почему то после цикла (и for, и foreach) переменная $rand чтоли как-то "унсетится", т.е. "удаляется" чтоли... и естественно картинка не отображается. Что не так?
    PHP:
    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]);
     
    #1 Ru}{eeZ, 13 Dec 2008
    Last edited: 13 Dec 2008
  2. Kaimi

    Kaimi Well-Known Member

    Joined:
    23 Aug 2007
    Messages:
    1,732
    Likes Received:
    809
    Reputations:
    231
    А ты её объяви до циклов, типа
    $rand = array();
     
    _________________________
    1 person likes this.
  3. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    если пустые квадратные скобки - php автоматически создаёт массив, т.е., если без циклов, то всё отлично работает.
    п.с. на всякий случай попробовал. безуспешно...
     
  4. optimazer

    optimazer Member

    Joined:
    4 Dec 2008
    Messages:
    46
    Likes Received:
    11
    Reputations:
    0
    2Chaak
    =))))))

    2Ru}{eeZ

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

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

    а на странице выводишь
    <img src="./путь_к_файлу/kapcha.php">
     
    #4 optimazer, 14 Dec 2008
    Last edited: 14 Dec 2008
  5. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Ru}{eeZ По вопросу - ты не забыл объявить не пустой массив (или строку?) $abc из которого собственно и берешь значения?

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

    optimazer Member

    Joined:
    4 Dec 2008
    Messages:
    46
    Likes Received:
    11
    Reputations:
    0
    2Gifts
    смотря какую случайную последовательность выводить будешь!

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

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

    Chaak Elder - Старейшина

    Joined:
    1 Jun 2008
    Messages:
    1,059
    Likes Received:
    1,067
    Reputations:
    80
    Какая разница сколько цифр генерировать :)? Главное чтобы боты не распознали и юзеру было удобно вбивать капчи :)

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

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

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

    Если проект маленький, то зачем выдумывать сложную капчу со всякими там искажениями и прочими извращениями? Достаточно установить уже готовый скрипт:
    Из готовых решений мой выбор в сторону:
     
    #7 Chaak, 14 Dec 2008
    Last edited: 14 Dec 2008
  8. optimazer

    optimazer Member

    Joined:
    4 Dec 2008
    Messages:
    46
    Likes Received:
    11
    Reputations:
    0
    2ChaaK
    я в курсе! спасибо.

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

    однако:

    Сложности капчи, для того чтобы боты не распознали!

    а про логику с арифметикой: пример
    сгенери боту капчу
    а еще буквы искази
    и пускай хоть обчитается и обсчитается!
     
    1 person likes this.
  9. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    вернёмся к вопросу...
    если написать:
    for($i = 0; $i < 6; $i++) $fullRand = $rand[$i];
    без точки, то естественно с каждым разом переменная $fullRand будет просто получать новые данные, но тогда всё работает, т.е. будет браться только последняя буква из капчи, а нужно, что бы всё буквы брались и заносились в одну переменную, для того, чтобы записать их в сессию. Это срабатывает, НО! Капча не выводится т.к. до неё не доходит $fullRand.
    Ну и вот вам в общем капча, чтобы не разбегались в догадках...
    PHP:
    <?php
    session_start
    ();
    $image imageCreate(10030);
    imageColorAllocate($image255255255);
    for(
    $i 0$i 10$i++) $color[] = imageColorAllocate($imagemt_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($imagemt_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);
    ?>
     
  10. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    Так объяви в самом начале:

    $rand = array();
    $fullRand = '';
     
    1 person likes this.
  11. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Я хуею! Так просто прийти и решить мою проблемму!)))
    Спасибо большое!)
     
  12. groundhog

    groundhog Elder - Старейшина

    Joined:
    12 May 2007
    Messages:
    1,159
    Likes Received:
    425
    Reputations:
    180
    По-моему до меня кто-то уже высказывал эту идею, только насчёт одной переменной... А вообще, если бы у тебя был включён вывод Warnings то ты бы сам понял в каком месте возникает косяк...
     
  13. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Каими)
    $fullRand = ''; не хватало только
     
  14. optimazer

    optimazer Member

    Joined:
    4 Dec 2008
    Messages:
    46
    Likes Received:
    11
    Reputations:
    0
    1) выделенное темно-красным:
    Здесь пишется относительный путь к файлу шрифта!!!

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

    ________________________________________

    ооооо ёпрст
    ты уже разобрался
    блин запоздал я
     
    #14 optimazer, 15 Dec 2008
    Last edited: 15 Dec 2008
    1 person likes this.