ФорумПрограммированиеPHP для идиотов → Проблема с сессиями

Проблема с сессиями

  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 21 февраля 2011 г. 16:50

    Решил переделать под себя массовый загрузчик файлов uploadify. Всё вроде работает, но какой-то глюк с сессиями. Выбираю несколько файлов и жму Загрузить. Все данные отлично добавляются в базу и загружаются в папку. При это каждый раз при добавлении в базу записываю id записи в сессию
    mysql_query("INSERT INTO `images` VALUES (…)");
    $id = mysql_insert_id();
    $_SESSION['img_upload'][] = $id;

    В конце загрузки всех файлов пытаюсь вывести данные сессии (например кол-во элементов массива). При этом ИЕ всё замечательно и правильно выводит. А Опера и Фокс утверждают, что такая сессия вообще не существует.
    В чем может быть проблема?
    На всякий случай выкладываю код:
    if (!empty($_FILES)) {

    // EXT
    $arr = explode(".", $_FILES['Filedata']['name']);
    $ext = $arr[(count($arr)-1)]; // получаем расширение файла
    $url = "../img/upload/";

    mysql_query("INSERT INTO `images` VALUES (NULL, '$ext', NULL, NULL)") or die(mysql_error());

    $id = mysql_insert_id(); // id последней картинки
    $_SESSION['img_upload'][] = $id;

    mysql_query("UPDATE `images` SET `imgname` = '".$id.".".$ext."' WHERE `id` = '$id'") or die(mysql_error()); // добавляем реальные данные о картинке

    move_uploaded_file($_FILES['Filedata']['tmp_name'],$url.$id.".".$ext);

    echo str_replace($_SERVER['DOCUMENT_ROOT'],'',$url.$id.".".$ext);
    }

    А тут пытаюсь вывести только что загруженные картинки
    for($i=0; $i<count($_SESSION['img_upload']); $i++) {

    $result = mysql_query("SELECT * FROM `images` WHERE `id` = '".$_SESSION['img_upload'][$i]."'");
    $row = mysql_fetch_assoc($result);

    $echo .= "<table cellspacing='0' cellpadding='4'>
    <tr valign='top'>
    <td rowspan='3'><img src='../img/upload/".$row['imgname']."' border='0' width='100'></td>
    <td>".cp1251_to_utf8("Название:")."</td>
    <td><input type='text' name='name".$row['id']."' value='".cp1251_to_utf8($row['name'])."'></td>
    <tr><td>ALT:</td>
    <td><input type='text' name='alt".$row['id']."' value='".cp1251_to_utf8($row['altname'])."'></td>
    <tr><td colspan='2'><a href=>".cp1251_to_utf8("удалить")."</a></td>
    </table>";
    }

    echo $echo;


    И вот таким образом через жуквери вывожу данные
    $.post(
    'action.php',
    { action: 'inf_new_img_tmp' },
    function(data) {

    $('#i').show();
    $('#i').html(data);
    }
    );


    session_start(); везде стоит. Опять же повторюсь, ИЕ всё идеально выводит.
    from TRIAL with LOVE
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 21 февраля 2011 г. 17:05, спустя 14 минут 10 секунд

    разберись что куда пишешь
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 21 февраля 2011 г. 17:18, спустя 13 минут 23 секунды

    сделай [tt]var_dump($_SESSION['img_upload'])[/tt] в момент записи и в момент вывода, и посмотри что там
  • Sinkler

    Сообщения: 7958 Репутация: N Группа: в ухо

    Spritz 21 февраля 2011 г. 17:34, спустя 15 минут 54 секунды

    у меня, кстати, в бекэнде тоже сессии не работают, тоже в аплоадифи
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 21 февраля 2011 г. 17:43, спустя 8 минут 55 секунд

    Так почему ж они в ИЕ работают?
    from TRIAL with LOVE
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 21 февраля 2011 г. 18:22, спустя 39 минут 21 секунду

    Нашел на официальном следующую инфу:
    How Do I Send the Session ID to the Back-End Script?Since the Flash file is what is communicating with your back-end script, the session information is not sent when a file is being uploaded. you'll have to send the session ID via the scriptData option.


    JavaScript
    $("#upload").uploadify({

    'scriptData': { 'session': '<?php echo session_id();?>'}

    });


    PHP
    Then call the session ID in your back-end script:
    if ($_REQUEST['session']) session_id($_REQUEST['session']);


    Я не до конца понял как это всё работает. Кто может объяснить на моем примере как это должно выглядеть?
    from TRIAL with LOVE
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 21 февраля 2011 г. 18:49, спустя 26 минут 51 секунду

    Данная хрень решает проблему, но только для 1 файла. Т.е. один раз данные в сессию запишутся и всё, повторный вызов скрипта опять ничего не будет делать.
    Оказывается это проблема FLASH, он считывает данные только у ИЕ, другие браузеры он игнорит. Проблема старая, но фиксить ее видимо никто не собирается. Придется искать альтернативу. Подумываю на счет временной таблицы. Кто что еще из альтернатив предложит?
    from TRIAL with LOVE
  • Faster

    Сообщения: 1159 Репутация: N Группа: Кто попало

    Spritz 21 февраля 2011 г. 19:50, спустя 1 час 31 секунду

    весь прикол в том, что клиент общается с сервером через флеш загрузчик. поэтому данные лучше передавать явно - как POST переменные например (чуть подпилить дефолтный JS uploadfly - в доке есть как передать переменные).
    вообще не понятно зачем здесь сессии нужны
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 22 февраля 2011 г. 10:14, спустя 14 часов 24 минуты 54 секунды

    Ну я скрипт решил дополнить под себя. После того как фотки загружены они через жуквери тут же выводятся на сайт с формой заполнения названия и альта, возможностью удалить (и в будущем наверное изменить/перезалить).
    Поскольку все фотки у меня записываются в одну таблицу, то в другие я просто записываю id этих фоток из таблицы. И пока какая-то новая запись не добавлена, планировал хранить id вновь загруженных фоток в сессии.
    PS. Чего-то как-то криво всё написал :) Но смысл в том что сессии нужны )))
    from TRIAL with LOVE
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 22 февраля 2011 г. 10:52, спустя 37 минут 47 секунд

    TRIAL, храни (точнее добавляй) АйДи в скрытом поле в форме (там же, где будут поля для ввода названия и альта), и так для каждой картинки ну или подобное. Тогда не нужно будет "сессии" мучать.
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 22 февраля 2011 г. 10:58, спустя 6 минут 15 секунд

    Да это-то я сделал бы, суть в том что там отдельный скрипт на добавление в бд и загрузку. Скрипт ничего не возвращает в принципе. А копаться в исходниках мне не очень хочется. Тем более пол часа этот исходник в читаемый вид приводить пробелами и табуляциями желания нет :) щас с временной таблицей попробую. Потом может попробую расковырять и заставить скрипт возвращать новый id записи.
    from TRIAL with LOVE
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 22 февраля 2011 г. 12:53, спустя 1 час 54 минуты 54 секунды

    приводить пробелами и табуляциями желания нет

    используй IDE

Пожалуйста, авторизуйтесь, чтобы написать комментарий!