Ошибка Error at offset 65531 of 65535 bytes
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.217.20] |
|
|
Ошибка Error at offset 65531 of 65535 bytes
|
Сообщ.
#1
,
|
|
|
|
function.unserialize: Error at offset 65531 of 65535 bytes
что это за ошибка и как выяснить какие данные ее вызывают? у меня проблемная строчка в функции которая вызывается из разных мест много раз |
|
Сообщ.
#2
,
|
|
|
|
Цитата orb @ у меня проблемная строчка в функции которая вызывается из разных мест много раз Ну есть отладчики, да и в лоб: эхать перед каждым вызовом данные. Эхо перед ошибкой и будет данными ведь. В чем сложность? |
|
Сообщ.
#3
,
|
|
|
|
unserialize десериализирует объект из строки, в самой строке ошибка, на 65531 байте.
эхом тут мало чего прояснишь, можно лишь увидеть что конкретно "не те данные" функции скармливаете. добавлю: вот пример сериализованного массива array(a, b, c, d, e) ![]() ![]() 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";} если строка битая, например таккая ![]() ![]() 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";} (убрал одно двоеточие перед элементом с) то это вызовет ошибку ![]() ![]() Notice: unserialize() [function.unserialize]: Error at offset 33 of 65 bytes in |
|
Сообщ.
#4
,
|
|
|
|
Цитата Pr0[)!9Y @ Эхо перед ошибкой и будет данными ведь ошибка на 65531 символе |
|
Сообщ.
#5
,
|
|
|
|
Цитата orb @ ошибка на 65531 символе Я в PHP так еще не делал, но полагаю, что можно try ... catch и вывести подстроку +-5 символов от 65531-го... |
|
Сообщ.
#6
,
|
|
|
|
Цитата fatalist @ try ... catch и не ловит |
|
Сообщ.
#7
,
|
|
|
|
![]() ![]() 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()); } |
|
Сообщ.
#8
,
|
|
|
|
Цитата orb @ of 65535 Уж не закончилась ли строка раньше времени, если она из базы например? Слишком уж число круглое =) |
|
Сообщ.
#9
,
|
|
|
|
![]() ![]() s:3:"url";s:30:"http://svet/shop/4/1/5/page_1/";}i:709;a:2:{s:4:"name";s:31 ) вот так заканчивается массив сбойный Добавлено ![]() ![]() static $i = 0; if ($i == 2) { print_r($data); die; } $data = unserialize($data[0]); Добавлено теперь другая проблема - как пофиксить ошибку |
|
Сообщ.
#10
,
|
|
|
|
Цитата Pr0[)!9Y @ Уж не закончилась ли строка раньше времени, если она из базы например? Добавлено 1) Данные откуда? 2) Исходные данные сериализуй и посмотри, может быть это на этапе сериализации проявляется. |
|
Сообщ.
#11
,
|
|
|
|
1. электронный магазин. самопал. Кто творец я не знаю
данные я знаю что такое ![]() ![]() a:2:{s:4:"name";s:21:"Modern 317";s:3:"url";s:25:"http://site/shop//page_1/";}}i:14; это один элемент товара, его линка для меню Добавлено когда начала проявлять ошибка я не знаю жду хозяина магазина и листаю логи |
|
Сообщ.
#12
,
|
|
|
|
orb,ну откуда данные то сериализованные беруться? Из сессии наврядли, из файла? из базы?
Так вот к чему клоню, если из базы, то посмотри что в этой таблице? Данные целы? Например может быть там тип поля TEXT, разработчик подумал что ему хватит навсегда, а туда помещается только 65535 символов. Добавлено Тогда менять тип поля и заносить битые данные заново. |
|
Сообщ.
#13
,
|
|
|
|
из базы данных
но проблема в том что неизвестно когда произошла ошибка и сколько данных находится в таком побитом виде |
|
Сообщ.
#14
,
|
|
|
|
Мне кажется проблему надо по шагам решать, сначала убедись что проблема в базе. Реши задачу программистскую. А пользовательскую будешь решать когда все будет работать.
Цитата orb @ Если мое предположние верно, тогда началось ровно тогда когда появился объект с длинными данными. но проблема в том что неизвестно когда произошла ошибка |
|
Сообщ.
#15
,
|
|
|
|
Цитата orb @ ![]() ![]() s:3:"url";s:30:"http://svet/shop/4/1/5/page_1/";}i:709;a:2:{s:4:"name";s:31 ) вот так заканчивается массив сбойный тут видно что массив недозаписан |
|
Сообщ.
#16
,
|
|
|
|
orb, ты видимо меня не слушаешь или упорно игноришь. Я это уже читал.
Знаешь что будет если попытаться за писать 100кб в поле типа TEXT? Запишется 64кб и даже ошибки не выведится никакой в момент записи. Ведь мало кто делает в движках SHOW WARNINGS. |
|
Сообщ.
#17
,
|
|
|
|
не могу понять наверное
Добавлено мозг уже не варит |
|
Сообщ.
#18
,
|
|
|
|
В базе битые данные.
Восстановить их нельзя, даже если ты заново занесешь они не поместятся. Всё что от тебя нужно это озвучить тип поля. |
|
Сообщ.
#19
,
|
|
|
|
это я тебя выслушал и понял
![]() ты полностью прав там тип "text" |
|
Сообщ.
#20
,
|
|
|
|
Ну вот, измени на MEDIUMTEXT (16 метров текста) и начинай перебивать битые позиции =) Проблема, так сказать, решена.
|
|
Сообщ.
#21
,
|
|
|
|
Цитата Pr0[)!9Y @ это я тоже понялНу вот, измени на MEDIUMTEXT (16 метров текста) и начинай перебивать битые позиции но тут и проблема. когда возникла проблема никто не знает и сколько боков уже есть/было/будет никто не знает да и перевести данные проблемно. разработчик не предусмотрел этой ситуации и поэтому при записи данных: данные делились на 7 таблиц и частично записывались, кроме этой таблицы Добавлено спасибо, за советы буду учить схему досконально |
|
Сообщ.
#22
,
|
|
|
|
Цитата orb @ когда возникла проблема никто не знает и сколько боков уже есть/было/будет никто не знает Запрос всех строк где длина данных равна 65535 символов, даст тебе прекрасный результат. Разве что там может попасться несколько небитых строк. Вероятность есть, но думаю что небольшая. Цитата orb @ Почему? Смена типа поля никак не повлияет на уже записанные данные. да и перевести данные проблемно |