На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Serafim, fatalist
  
    > Ошибка Error at offset 65531 of 65535 bytes
      function.unserialize: Error at offset 65531 of 65535 bytes
      что это за ошибка и как выяснить какие данные ее вызывают?

      у меня проблемная строчка в функции которая вызывается из разных мест много раз
        Цитата orb @
        у меня проблемная строчка в функции которая вызывается из разных мест много раз

        Ну есть отладчики, да и в лоб: эхать перед каждым вызовом данные. Эхо перед ошибкой и будет данными ведь. В чем сложность?
          unserialize десериализирует объект из строки, в самой строке ошибка, на 65531 байте.
          эхом тут мало чего прояснишь, можно лишь увидеть что конкретно "не те данные" функции скармливаете.

          добавлю:
          вот пример сериализованного массива array(a, b, c, d, e)
          ExpandedWrap disabled
            a:5:{i:0;s:1:"a";i:1;s:1:"b";i:2;s:1:"c";i:3;s:1:"d";i:4;s:1:"e";}

          если строка битая, например таккая
          ExpandedWrap disabled
            a:5:{i:0;s:1:"a";i:1;s:1:"b";i:2;s1:"c";i:3;s:1:"d";i:4;s:1:"e";}

          (убрал одно двоеточие перед элементом с)
          то это вызовет ошибку
          ExpandedWrap disabled
            Notice: unserialize() [function.unserialize]: Error at offset 33 of 65 bytes in
          Сообщение отредактировано: KirSSS -
            Цитата Pr0[)!9Y @
            Эхо перед ошибкой и будет данными ведь

            ошибка на 65531 символе :whistle:
              Цитата orb @
              ошибка на 65531 символе

              Я в PHP так еще не делал, но полагаю, что можно try ... catch и вывести подстроку +-5 символов от 65531-го... :rolleyes:
                Цитата fatalist @
                try ... catch и

                не ловит
                  ExpandedWrap disabled
                    class ENotice extends Exception
                    {
                    }
                     
                    function te($code, $message, $file, $line)
                    {
                    if ($code == E_NOTICE) {
                      throw new ENotice($message, $code);
                    }
                    }
                    set_error_handler('te', E_NOTICE);
                     
                    ...
                     
                     
                    try {
                     unserialize(...);
                    } catch (ENotice $e) {
                     var_dump($e->getTrace());
                    }
                  а так ловит?
                    Цитата orb @
                    of 65535

                    Уж не закончилась ли строка раньше времени, если она из базы например? Слишком уж число круглое =)
                      ExpandedWrap disabled
                        s:3:"url";s:30:"http://svet/shop/4/1/5/page_1/";}i:709;a:2:{s:4:"name";s:31
                        )

                      вот так заканчивается массив сбойный

                      Добавлено
                      ExpandedWrap disabled
                        static $i = 0;
                        if ($i == 2) {
                              print_r($data);
                              die;
                            }
                        $data = unserialize($data[0]);
                      вот таким скриптом отладки выловил сбойные данные

                      Добавлено
                      теперь другая проблема - как пофиксить ошибку :(
                        Цитата Pr0[)!9Y @
                        Уж не закончилась ли строка раньше времени, если она из базы например?


                        Добавлено
                        1) Данные откуда?
                        2) Исходные данные сериализуй и посмотри, может быть это на этапе сериализации проявляется.
                          1. электронный магазин. самопал. Кто творец я не знаю
                          данные я знаю что такое
                          ExpandedWrap disabled
                            a:2:{s:4:"name";s:21:"Modern 317";s:3:"url";s:25:"http://site/shop//page_1/";}}i:14;

                          это один элемент товара, его линка для меню

                          Добавлено
                          когда начала проявлять ошибка я не знаю
                          жду хозяина магазина и листаю логи
                            orb,ну откуда данные то сериализованные беруться? Из сессии наврядли, из файла? из базы?
                            Так вот к чему клоню, если из базы, то посмотри что в этой таблице? Данные целы? Например может быть там тип поля TEXT, разработчик подумал что ему хватит навсегда, а туда помещается только 65535 символов.

                            Добавлено
                            Тогда менять тип поля и заносить битые данные заново.
                              из базы данных
                              но проблема в том что неизвестно когда произошла ошибка
                              и сколько данных находится в таком побитом виде
                                Мне кажется проблему надо по шагам решать, сначала убедись что проблема в базе. Реши задачу программистскую. А пользовательскую будешь решать когда все будет работать.

                                Цитата orb @

                                но проблема в том что неизвестно когда произошла ошибка
                                Если мое предположние верно, тогда началось ровно тогда когда появился объект с длинными данными.
                                  Цитата orb @
                                  ExpandedWrap disabled
                                    s:3:"url";s:30:"http://svet/shop/4/1/5/page_1/";}i:709;a:2:{s:4:"name";s:31
                                    )

                                  вот так заканчивается массив сбойный

                                  тут видно что массив недозаписан
                                    orb, ты видимо меня не слушаешь или упорно игноришь. Я это уже читал.

                                    Знаешь что будет если попытаться за писать 100кб в поле типа TEXT? Запишется 64кб и даже ошибки не выведится никакой в момент записи. Ведь мало кто делает в движках SHOW WARNINGS.
                                      не могу понять наверное :wacko:

                                      Добавлено
                                      мозг уже не варит
                                        В базе битые данные.
                                        Восстановить их нельзя, даже если ты заново занесешь они не поместятся. Всё что от тебя нужно это озвучить тип поля.
                                          это я тебя выслушал и понял :)
                                          ты полностью прав там тип "text"
                                            Ну вот, измени на MEDIUMTEXT (16 метров текста) и начинай перебивать битые позиции =) Проблема, так сказать, решена.
                                              Цитата Pr0[)!9Y @
                                              Ну вот, измени на MEDIUMTEXT (16 метров текста) и начинай перебивать битые позиции
                                              это я тоже понял
                                              но тут и проблема. когда возникла проблема никто не знает и сколько боков уже есть/было/будет никто не знает
                                              да и перевести данные проблемно. разработчик не предусмотрел этой ситуации и поэтому при записи данных: данные делились на 7 таблиц и частично записывались, кроме этой таблицы

                                              Добавлено
                                              спасибо, за советы
                                              буду учить схему досконально
                                                Цитата orb @
                                                когда возникла проблема никто не знает и сколько боков уже есть/было/будет никто не знает

                                                Запрос всех строк где длина данных равна 65535 символов, даст тебе прекрасный результат. Разве что там может попасться несколько небитых строк. Вероятность есть, но думаю что небольшая.

                                                Цитата orb @
                                                да и перевести данные проблемно
                                                Почему? Смена типа поля никак не повлияет на уже записанные данные.
                                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                                0 пользователей:


                                                Рейтинг@Mail.ru
                                                [ Script execution time: 0.1079 ]   [ 15 queries used ]   [ Generated: 10.07.26, 11:01 GMT ]