Сергей К.
1649 сообщений
#14 лет назад
Использую serialize для записи информации в БД. Потом читаю ее и пытаюсь через unserialize формировать обратно массив. И не всегда получается. Элементы массива разные по типу и количеству. В чем может быть проблема?

Вот например это не хочет обработать:
Цитата:
a:6:{s:6:"modeli";a:4:{s:5:"label";s:12:"Модель";s:2:"id";s:4:"1779";s:4:"name";s:6:"modeli";s:5:"value";s:3:"100";}s:11:"god-vypuska";a:4:{s:5:"label";s:21:"Год выпуска";s:2:"id";s:4:"1780";s:4:"name";s:11:"god-vypuska";s:5:"value";s:4:"1999";}s:16:"korobka-peredach";a:4:{s:5:"label";s:29:"Коробка передач";s:2:"id";s:4:"1781";s:4:"name";s:16:"korobka-peredach";s:5:"value";s:28:"Механическая ";}s:11:"tip-privoda";a:4:{s:5:"label";s:21:"Тип привода";s:2:"id";s:4:"1782";s:4:"name";s:11:"tip-privoda";s:5:"value";s:20:"Передний ";}s:11:"vid-topliva";a:4:{s:5:"label";s:21:"Вид топлива";s:2:"id";s:4:"1783";s:4:"name";s:11:"vid-topliva";s:5:"value";s:16:"Бензин ";}s:10:"probeg--km";a:4:{s:5:"label";s:18:"Пробег, км";s:2:"id";s:4:"1784";s:4:"name";s:10:"probeg--km";s:5:"value";s:6:"100000";}}
Сергей Д.
326 сообщений
#14 лет назад
А размерность поля в БД достаточна для данных? Может усечение происходит?
Сергей К.
1649 сообщений
#14 лет назад
oren, да. Тип данных TEXT, без каких либо ограничений.
Сергей Д.
326 сообщений
#14 лет назад
У TEXT ограничение в 64КБ вроде, точно не помню сколько...
Но вот в вашей строке ошибка в этом элементе:
s:18:"Пробег, км"
Указана длина строки 18, а фактически записано 10. При записи никаких сжатий не происходит, типа удаления двойных пробелов? Хм... ну тут код надо смотреть, думать...
Роман П.
1599 сообщений
#14 лет назад
Notice: unserialize() : Error at offset 54 of 795 bytes

100% что-то с кавычками - либо конфликты с magic_quotes, либо в данных массива есть кавычки и они не экранируются и т.д. В приведенном примере вообще некоторые кавычки заменены на "
Сергей К.
1649 сообщений
#14 лет назад
Цитата ("Crist"):
В приведенном примере вообще некоторые кавычки заменены на "

Заметил. Но не могу понять откуда се это берется.
Сергей Д.
326 сообщений
#14 лет назад
Crist, Мне так кажется, что quot поставили скрипты форума, а ваша ошибка вызвана тем, что вы не убрали переводы строк, просто скопировав строку с форума :-)

А если переводы строк убрать, то ошибка получится именно на том месте, которое я указал.
Сергей Д.
326 сообщений
#14 лет назад
Я извиняюсь, что привел ограничение для типа TEXT, не спросил, какая СУБД :-)
Ну вот для MySQL ограничения такие:
TINYTEXT или TINYBLOB 255 байт
TEXT или BLOB 65535 байт
MEDIUMTEXT или MEDIUMBLOB 16777215байт
LONGBLOB 4294967295 байт

Вот что заметил: русские буквы у Вас представлены двумя байтами, остальные символы - ASCII - по 1 байту
Дмитрий Засядько
87 сообщений
#14 лет назад
На сколько я помню serialize и unserialize некорректно работают с кирилицей.
Сергей Д.
326 сообщений
#14 лет назад
Если сделаете и покажете var_dump проблемной переменной, то можно будет яснее сказать в чём причина.
Если её сериализация-рассериализация нормально пройдут, то проблема - в сохранении/чтении из БД. Может действительно включено какое-то автоэкранирование дурацкое.
Сергей К.
1649 сообщений
#14 лет назад
Вот в чем проблема. Использую эту функцию для фильтрации данных:
function quote_smart($value){
// если magic_quotes_gpc включена - используем stripslashes
if (get_magic_quotes_gpc()) {
$value = stripslashes($value);
} // Если переменная - число, то экранировать её не нужно
// если нет - то окружем её кавычками, и экранируем
if (!is_numeric($value)) {
$value = mysql_real_escape_string($value);
}
return $value;
}

Отключил, заработало. Но мне нужно все же фильтровать входные данные.

И кстати да, на какие то значения(берутся из формы) добавляется перевод строк. Не могу понять почему.
Цитата:
Array ( => Array ( => Модель => 1779 => modeli => 100 ) => Array ( => Год выпуска => 1780 => god-vypuska => 1999 ) => Array ( => Коробка передач => 1781 => korobka-peredach => Механическая\r\n ) => Array ( => Тип привода => 1782 => tip-privoda => Передний\r\n ) => Array ( => Вид топлива => 1783 => vid-topliva => Бензин\r\n ) => Array ( => Пробег, км => 1784 => probeg--km => 100000 ) )



И что самое интересное, для других данных работает. Другие поля формы.

\r\n добавляет для полей типа SELECT(по ходу у базе есть перевод строки). Тогда еще вопрос.
я имею TEXTAREA. В ней скопировались значения с другого сайта. В базу записываю вот так
str_replace(PHP_EOL, "#",$_POST)
но почему то оставляет лишние \r\n
Сергей Д.
326 сообщений
#14 лет назад
Цитата ("WebDesignStudio"):
Тогда еще вопрос.
я имею TEXTAREA. В ней скопировались значения с другого сайта. В базу записываю вот так
str_replace(PHP_EOL, "#",$_POST)
но почему то оставляет лишние \r\n

А где вопрос? :-)
PHP_EOL в разных операционках разные, Вы это учли?
Сергей К.
1649 сообщений
#14 лет назад
oren, да. Там стоит вот такая конструкция str_replace(PHP_EOL, "#",$_POST). Но оно оставляет лишние \r\n
Сергей Д.
326 сообщений
#14 лет назад
Ну так Вы проверили, что содержит PHP_EOL в той среде, где возникает проблема? Один чел. писал, что у него под FreeBSD в этой константе вообще был "!". Да и сама эта константа не во всех версиях PHP есть. Проверьте, что там...
Сергей К.
1649 сообщений
#14 лет назад
А. Значит получается следующее:
текст скопирован с какого то сайта. Там переводы строк свои. У меня свои. И вот они отличаются и не пашет. Но дело в том что # между значениями по любому добавляет. И переводы еще оставляет. Мистика.
Как же от этого избавится?
Сергей Д.
326 сообщений
#14 лет назад
Мистика возникает там, где чего-то не знают :-)
У вас все данные в руках, что мешает проверить их побитно?
Что получится со строкой "This is \n\n\r simple text"?
Вот что: "This is \n# simple text". И никакой мистики.

А если у Вас ещё некорректная обработка <br>, которую Вы тут не указали... а другие неуказанные мелочи...
Сергей К.
1649 сообщений
#14 лет назад
И что в данном случае можно делать? Просто пользователь будет копипастить с разных сайтов.
Сергей Д.
326 сообщений
#14 лет назад
Что делать зависит от того, что надо. Я этого точно не знаю, но может Вам подойдёт такой алгоритм:
1. Заменить все "\r" на пустую строку
2. Заменить все "\n" на "\#"
Сергей К.
1649 сообщений
#14 лет назад
Цитата ("oren"):
Вот что: "This is \n# simple text". И никакой мистики.
Вы правы. Но так же может быть "This is \n\n\n\r simple text" или "This is \n\r simple text"
Может есть какая та функция? Конечно могу ее и сам писать, но это дольше.
Игорь Ткаченко
65 сообщений
#14 лет назад
Json пробовать не использовали?