Функция serialize

Темы, не касающиеся фреймворка, но относящиеся к программированию в целом.
Ответить
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Функция serialize

Сообщение raketa »

Есть вот такой код не вызывающий никаких подозрений

Код: Выделить всё

            $this->task_data = serialize($this->task_data);
            
            $command = $this->getDbConnection()->createCommand("INSERT INTO tasks_queue (worker, priority, task_name, task_group, task_data, task_id, notice, create_time) VALUES (:worker, :priority, :task_name, :task_group, :task_data, :task_id, :notice, NOW())");
            $command->bindValue(':worker', (int)$this->worker, PDO::PARAM_INT);
            $command->bindValue(':priority', (int)$this->priority, PDO::PARAM_INT);
            $command->bindValue(':task_name', $this->task_name, PDO::PARAM_STR);
            $command->bindValue(':task_group', $this->task_group, PDO::PARAM_STR);
            $command->bindValue(':task_data', $this->task_data, PDO::PARAM_STR);
            $command->bindValue(':task_id', $this->task_id, PDO::PARAM_INT);
            $command->bindValue(':notice', $this->notice, PDO::PARAM_STR);
            
            return $command->execute();
изначально $this->task_data передается как массив
Все бы хорошо, но периодически возникают проблемы когда делаешь unserialize($task_data), единственное что получилось выяснить это то что в базе строка task_data обрезается,
в базе (это окончание сериализованной строки)

Код: Выделить всё

s:149:"<p>Пожалуйста,сбросьте мне сообщение с ссылкой на новый закуп,когда откроется</p>
если попробовать воспроизвести все тоже самое, то уже получаем правильный результат

Код: Выделить всё

s:145:"<p>Пожалуйста,сбросьте мне сообщение с ссылкой на новый закуп,когда откроется</p>";}
-
Первый вывод который лезит в голову это как будто какой то баг в функции serialize, видимо пользователи вводят какой то непонятный символ из за которого съезжает концовка строки, причем ошибки возникают вне зависимости от нагрузки на сайт, вне зависимости от размера данных, столбец task_data' имеет тип mediumtext
-
Не знаю в какую сторону копать? воспроизвести не получается т.к. ошибка бывает редко, примерно один раз на 40000 строк
Аватара пользователя
SiZE
Сообщения: 2817
Зарегистрирован: 2011.09.21, 12:39
Откуда: Perm
Контактная информация:

Re: Функция serialize

Сообщение SiZE »

поле в базе как создано?
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Re: Функция serialize

Сообщение raketa »

не совсем понял вопроса,
сперва тип поля был text, затем поменяли на mediumtext, если это имеет значение помоему через phpMyAdmin
Аватара пользователя
vova07
Сообщения: 1004
Зарегистрирован: 2012.11.29, 14:52
Откуда: Chisinau, Moldova

Re: Функция serialize

Сообщение vova07 »

Возможно строка просто слишком длинная для MEDIUMTEXT, и она обрезается, попадая в нужное поле не полностью.
Верните полю тип LONGTEXT и проверьте что получится, если все заработает, проблему решили, если нет нужно будет уже думать в другом направлении.
Последний раз редактировалось vova07 2013.10.20, 14:04, всего редактировалось 1 раз.
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: Функция serialize

Сообщение Arnowt »

serialize как раз таки самая стабильная функция из всех аналогов.
Так что дело в другом, ищите, вариант от vova07 или подобный очень даже вероятен.
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Re: Функция serialize

Сообщение raketa »

Может я что путаю, но максимальная длина TEXT это 65535, а MEDIUMTEXT это 16777215
Самое интересное, как уже писал, ошибка не зависит от длины строки task_data, в последней ошибке которая произошла длина не более 2000 символов
И самое интересное что когда воспроизводишь с тем же текстом то уже все нормально, если обратить внимание то при ошибке s:149: а если воспроизвести то s:145:, получается как будто какие то 4 символа все сбивают.
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: Функция serialize

Сообщение Arnowt »

serialize работает по разному php4 и 5, но это видно на сложных структурах.
Как варианты:
*избавиться от PDO - проверяйте в ручную.
*trim перед serialize
*перейти на json_encode на 5 пыхе это встроенная функция.

По результатам отпишите плиз :)
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: Функция serialize

Сообщение Arnowt »

PS: с кодировками все в порядке?
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Re: Функция serialize

Сообщение raketa »

Не понял по поводу
*избавиться от PDO - проверяйте в ручную.
*
trim стоит
переходит на json не то чтобы не хотелось бы, очень хочется понять причину, выше писали что serialize одна из стабильных функций, должна же быть какая то причина.
кодировка вся в utf8
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: Функция serialize

Сообщение Arnowt »

Немного не так выразился :) не в ручную конечно
попробуйте проверять эту переменную классическими методами htmlspecialchars или addslashes(для UTF-8 в ней нет уязвимостей)

//$command->bindValue(':task_data', $this->task_data, PDO::PARAM_STR);
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Re: Функция serialize

Сообщение raketa »

пытаюсь воспроизвести ошибку, пока без результативно, буду продолжать истина видимо где то рядом
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Re: Функция serialize

Сообщение raketa »

Поймал все таки ошибку :)
Проблема решается если сменить тем поля в базе на blob.
Ошибка возникает когда пользователи начинают использовать шрифт Эмодзи (смайлики и всякие там знаки)
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Re: Функция serialize

Сообщение raketa »

Код: Выделить всё

Общая ошибка
SQL ERROR [ mysql4 ]

Incorrect string value: '\xF0\x9F\x98\x8A' for column 'post_text' at row 1 [1366]

SQL

INSERT INTO posts (forum_id, poster_id, icon_id, poster_ip, post_time, post_approved, enable_bbcode, enable_smilies, enable_magic_url, enable_sig, post_username, post_subject, post_text, post_checksum, post_attachment, bbcode_bitfield, bbcode_uid, post_postcount, post_edit_locked, topic_id) VALUES (4, 2152, 0, '99.79.958.97', 1382978102, 1, 1, 1, 1, 1, '', 'Re: Функция serialize', 'Привет ', '95831a8d2c96c87402d916d88be8caef', 0, '', '12i4xac2', 1, 0, 14583)

BACKTRACE

FILE: (not given by php)
LINE: (not given by php)
CALL: msg_handler()

FILE: [ROOT]/includes/db/dbal.php
LINE: 757
CALL: trigger_error()

FILE: [ROOT]/includes/db/mysql.php
LINE: 175
CALL: dbal->sql_error()

FILE: [ROOT]/includes/functions_posting.php
LINE: 2000
CALL: dbal_mysql->sql_query()

FILE: [ROOT]/posting.php
LINE: 1134
CALL: submit_post()
Последний раз редактировалось raketa 2013.10.28, 19:57, всего редактировалось 1 раз.
raketa
Сообщения: 131
Зарегистрирован: 2011.07.28, 17:29

Re: Функция serialize

Сообщение raketa »

в предыдущем посте ошибка данного форума которая возникает если попытаться вставить смайлик, тоже надо что то делать.
Может кто подскажет как это исправить, не хочется сохранять данные в поле blob не удобно да и не безопасно.
Кодировку менять тоже не хочется
Аватара пользователя
flashimage
Сообщения: 1517
Зарегистрирован: 2011.01.23, 12:43

Re: Функция serialize

Сообщение flashimage »

Бранчи это гомеоморфические эндофункторы, которые мапятся на субманифолды пространства Гилберта.
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: Функция serialize

Сообщение Arnowt »

Во...
Тогда у меня вопрос в тему, как заставить yii не падать при попытке вставить в БД символ недопустимый кодировкой?
Если работать напрямую PHP, то не может мускул вставить - не вставляет. скрипт не заваливается при этом.
Есть ~3-5 млрд записей, начинаю вставлять(с пред обработкой*) пачками пачками по 1000-3000штук иногда где-нить затёсывается не корректный символ, скрипт ругнулся отвалился.
Остальные записи пошли лесом.

пред обработка такая:

Код: Выделить всё

$href=@iconv($this->encoding,"utf-8//IGNORE",$href);
    preg_match_all("%[^a-z0-9\/\&\=\`\~\@\:\?\%\.\-\_]+%ui",$href,$match);
    if(isset($match[0]) AND is_array($match[0])){
        foreach($match[0] as $val){
            $href=preg_replace('/'.preg_quote($val,'/').'/u',rawurlencode($val),$href,1);
        }
    }
Как туда может попадать что-то кроме latin1 ХЗ, очень редко но такое бывает.
не проблема пожертвовать десятком тысяч записей, из миллиарда. Обиднее когда отваливается пачка.
Аватара пользователя
nizsheanez
Сообщения: 814
Зарегистрирован: 2011.04.29, 13:09
Откуда: Москва

Re: Функция serialize

Сообщение nizsheanez »

try catch - не?
Arnowt
Сообщения: 182
Зарегистрирован: 2013.09.13, 11:11

Re: Функция serialize

Сообщение Arnowt »

ага, спс
Ответить