За последние 24 часа нас посетили 20059 программистов и 1708 роботов. Сейчас ищут 1897 программистов ...

Проблема при работе с Cookie

Тема в разделе "Прочие вопросы по PHP", создана пользователем MoZart, 23 июл 2010.

  1. MoZart

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

    С нами с:
    28 июн 2010
    Сообщения:
    47
    Симпатии:
    0
    Всем добрый день!

    Вопрос у меня следующий - существует непонятная мне ошибка в работе с куки. То ли я что-то делаю не так, то ли....
    Короче говоря описываю с самого начала.
    Существует сайт. На этом сайте есть страница dt_05. Вот листинг:
    PHP:
    1. <?php?>
    2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN">
    3. <html>
    4. <head>
    5.   <!-- Заголовок окна -->
    6.   <title>фывапролдж.</title>
    7.   <!-- Подключаем внешние скрипты -->    
    8.   <script src="http://www.navtest1.ru/js/func.js"></script>
    9.   <!-- Используем русскую кодировку -->
    10.   <meta http-equiv="content-type" content="text/html; charset=Windows-1251">
    11.   <!-- Подключаем стилевые файлы -->
    12.   <link rel="stylesheet" type="text/css" href="styles/stylenavtest1.css">
    13. </head>
    14. <body onload="StartUpdateTheImage('im_Main', 5000)">
    15. <!-- ********************************************************** -->
    16. <?php
    17. echo ($ppp);
    18. require("header2.php");
    19. ?>
    20. <!-- ********************************************************** -->
    21.         <td>
    22. <!-- Описание текста центральной ячейки -->
    23.           <img id="im_Main" alt="ывапрол."
    24.            src="data/dt_05/imcreate_05.php"
    25.            width="581" height="581" hspace="10" vspace="10" border="0">
    26. <!-- Конец описания текста центральной ячейки -->
    27.         </td>
    28. <?php
    29. require("footer.php");
    30. ?>
    На этой странице есть изображение id="im_Main", которое обновляется JS-функцией StartUpdateTheImage из подключаемого внешнего скрипта. Обращение к функции происходит многократно через определённый промежуток времени по событию onLoad тега BODY. Вот листинг функции:
    [js]function StartUpdateTheImage(imname, updtime) {
    var img = document.getElementById(imname);
    if (!img) return;
    var src = img.src; // исходный урл
    // если там уже есть вопрос, то &rnd= иначе ?rnd=
    src += (src.indexOf('?') >= 0 ? '&' : '?') + 'rnd=';
    setInterval(function(){
    img.src = src + Math.floor(Math.random() * 1000000);
    }, updtime); // через updtime мс.
    }[/js]
    Непосредственно файл изображения - рнр-скрипт imcreate_05.php, который производит вычисления и по ним генерит изображение. Его путь относительно страницы data/dt_05/imcreate_05.php. Вот его листинг (только то, что относится к проблеме):
    PHP:
    1. <?php
    2. header ("content-type: image/png");
    3. //
    4. //Генерация изображения
    5. $img = imagecreate (581,581) or die ("Не удаётся инициализировать новый поток изображения.");
    6. $bgcolor = imagecolorallocate ($img, 0, 0, 0);      // фоновый цвет
    7. $LScolor = imagecolorallocate ($img, 0, 255, 100);  // цвет линий шкалы
    8. $textcolor = imagecolorallocate ($img, 233, 14, 91);// цвет текста
    9. $fn = 3;                                            // Номер шрифта
    10. $fh = imagefontheight($fn);                         // высота шрифта
    11. $fw = imagefontwidth($fn);                          // ширина шрифта
    12. //
    13. //Рисуем линии
    14. imageline ($img, 5, 290, 575, 290, $LScolor);
    15. imageline ($img, 290, 5, 290, 575, $LScolor);
    16. //
    17. //Рисуем значения шкал линий
    18. imagestring ($img, $fn, 293, 20, "0", $LScolor);
    19. imagestring ($img, $fn, (560 - (2 * $fw) - 1), 290, "90", $LScolor);
    20. imagestring ($img, $fn, (290 - (3 * $fw) - 1), (560 - $fh), "180", $LScolor);
    21. imagestring ($img, $fn, 23, (290 - $fh), "270", $LScolor);
    22. //
    23. //Получаем случайное число - то, которое пришло из JS - используется для тестирования.
    24. $rnd = $_REQUEST['rnd'];
    25. //Если его ещё нет - обнуляем куки
    26. if ( !$rnd )
    27.   {
    28.   setcookie ( 'GloX', '', time() - 1 );
    29.   $rnd = 999;
    30.   }
    31.  
    32. //Вычисления, не относящиеся к проблеме.
    33.  
    34. //Проверка наличия куки
    35. if ( !$_COOKIE['GloX'] )
    36.   {
    37.   $Status = "no";
    38.   $GloX = array();
    39.   }
    40. else
    41.   {
    42.   $Status = "yes";
    43.   imagestring ($img, 1, 200, 200, unserialize ( $_COOKIE['GloX'] ), $textcolor);  // это тестовая строка
    44.   $GloX = unserialize ( $_COOKIE['GloX'] );
    45.   }
    46. $count = count($GloX);
    47. $GloX[$count] = $rnd;
    48. // можно, конечно, короче: $GloX[] = $rnd; , но на этапе тестирования мне так удобней
    49.  
    50. //Выводим текст
    51. imagestring ($img, 1, 5, 15, "Used COOKIE", $textcolor);
    52. imagestring ($img, 1, 5, 25, "Status", $textcolor);
    53. imagestring ($img, 1, 50, 25, $Status, $textcolor);
    54. imagestring ($img, 1, 5, 35, "GloX", $textcolor);
    55. imagestring ($img, 1, 50, 35, $GloX[$count], $textcolor);
    56. imagestring ($img, 1, 5, 45, "rnd", $textcolor);
    57. imagestring ($img, 1, 50, 45, $rnd, $textcolor);
    58.  
    59. //Вывод массива
    60. imagestring ($img, 1, 300, 5, "count", $textcolor);
    61. imagestring ($img, 1, 340, 5, $count, $textcolor);
    62. $vpos = 5;
    63. imagestring ($img, 1, 380, 5, "GloX", $textcolor);
    64. foreach ($GloX as $i => $value)
    65.   {
    66.   imagestring ($img, 1, 420, $vpos, $i, $textcolor);
    67.   imagestring ($img, 1, 440, $vpos, $value, $textcolor);
    68.   $vpos += 10;
    69.   }
    70.  
    71. //Запись в куки
    72. setcookie ( 'GloX', serialize ( $GloX ), 0);
    73. //Запись этой строки имела различные варианты:
    74. //setcookie ( 'GloX', serialize ( $GloX ));
    75. //setcookie ( 'GloX', serialize ( $GloX ), 0);
    76. //setcookie ( 'GloX', serialize ( $GloX ), time());
    77. //Разницы никакой.
    78.  
    79. //Выводим изображение в браузер
    80. imagepng ($img);
    81. ?>
    Что должно быть по идее?
    Пользователь зашёл на страницу. Произошло первое обращение к imcreate_05.php, который сгенерил картинку и выдал её в браузер. Вот как он должен это делать:
    • Проверка наличия случайного числа $rnd. если его нет - JS ещё не включался и следовательно это первое обращение к рисунку. Обнуляем куки.
      Проверка наличия куки. Если нет (и не должно быть на этом этапе) - инициализируем пустой массив.
      После вычислений в конец массива дописывается новое число.
      Запись в куки обновлённого массива.
    Через 5 сек JS запускает imcreate_05.php снова
    • Проверка наличия случайного числа $rnd. Оно должно быть. НЕ обнуляем куки.
      Проверка наличия куки. Если да (и должно быть на этом этапе) - считываем массив данных из куки.
      После вычислений в конец массива дописывается новое число.
      Запись в куки обновлённого массива.
    И так должно происходить до тех пор, пока пользователь на странице.

    Теперь, что происходит на самом деле.
    Первое обращение без ЖС.
    • проверка на случайное число - НЕТ
      Обнуление куки - ДА
      проверка на куки - НЕТ
      инициализируется пустой массив - ДА
      размер массива - 0
      в массив вписывается число 999 (тупо для теста) - ДА.
      элементы: i=0 => Value=999
      массив записывается в куки - ДА
    Второе обращение с ЖС
    • проверка на случайное число - Да
      проверка на куки - Да
      считывается массив - ДА
      размер массива - 1
      в массив вписывается число rnd - ДА.
      элементы: i=0 => Value=999;
      i=1 => Value=rnd1;
      массив записывается в куки - !!! НЕИЗВЕСТНО !!!
    Третье обращение с ЖС
    • проверка на случайное число - Да
      проверка на куки - Да
      считывается массив - !!! НЕИЗВЕСТНО !!!
      размер массива - 1
      в массив вписывается число rnd - ДА.
      элементы: i=0 => Value=rnd2;
      массив записывается в куки - !!! НЕИЗВЕСТНО !!!
    Для меня такая ситуация непонятна. Помогите разобраться, пожалуйста.
     
  2. nuctoh

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

    С нами с:
    22 июл 2010
    Сообщения:
    5
    Симпатии:
    0
    только в одном браузере проверял?
    Если ДА, то твой браузер - ff?
     
  3. MoZart

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

    С нами с:
    28 июн 2010
    Сообщения:
    47
    Симпатии:
    0
    Браузеры:
    • Mozila 3.5
      IE 8
      Opera 9.2
    По-моему, достаточно...