2015-09-07 3 views
0

Это работает -десериализации(): Ошибка при смещении 181 849 байт

$serialized = 'a:23:{s:6:"fields";a:5:{s:21:"display_name_creditor";s:1:"1";s:24:"display_name_constituent";s:1:"1";s:14:"email_creditor";s:1:"1";s:14:"phone_creditor";s:1:"1";s:12:"total_amount";s:1:"1";}s:5:"id_op";s:2:"in";s:8:"id_value";a:0:{}s:21:"receive_date_relative";s:1:"0";s:17:"receive_date_from";s:0:"";s:15:"receive_date_to";s:0:"";s:25:"contribution_status_id_op";s:2:"in";s:28:"contribution_status_id_value";a:1:{i:0;s:1:"1";}s:16:"total_amount_min";s:0:"";s:16:"total_amount_max";s:0:"";s:15:"total_amount_op";s:3:"lte";s:18:"total_amount_value";s:0:"";s:6:"gid_op";s:2:"in";s:9:"gid_value";a:0:{}s:8:"tagid_op";s:2:"in";s:11:"tagid_value";a:0:{}s:11:"description";s:20:"Soft Credit details.";s:13:"email_subject";s:0:"";s:8:"email_to";s:0:"";s:8:"email_cc";s:0:"";s:10:"permission";s:21:"access CiviContribute";s:6:"groups";s:0:"";s:9:"domain_id";i:1;}'; 

$ результат = десериализации ($ сериализованная);

Это не -

$serialized = 'a:23:{s:6:"fields";a:5:{s:21:"display_name_creditor";s:1:"1";s:24:"display_name_constituent";s:1:"1";s:14:"email_creditor";s:1:"1";s:14:"phone_creditor";s:1:"1";s:12:"amount";s:1:"1";}s:5:"id_op";s:2:"in";s:8:"id_value";a:0:{}s:21:"receive_date_relative";s:1:"0";s:17:"receive_date_from";s:0:"";s:15:"receive_date_to";s:0:"";s:25:"contribution_status_id_op";s:2:"in";s:28:"contribution_status_id_value";a:1:{i:0;s:1:"1";}s:16:"total_amount_min";s:0:"";s:16:"total_amount_max";s:0:"";s:15:"total_amount_op";s:3:"lte";s:18:"total_amount_value";s:0:"";s:6:"gid_op";s:2:"in";s:9:"gid_value";a:0:{}s:8:"tagid_op";s:2:"in";s:11:"tagid_value";a:0:{}s:11:"description";s:20:"Soft Credit details.";s:13:"email_subject";s:0:"";s:8:"email_to";s:0:"";s:8:"email_cc";s:0:"";s:10:"permission";s:21:"access CiviContribute";s:6:"groups";s:0:"";s:9:"domain_id";i:1;}' 

Я только изменил total_amount поле для amount и я получаю эту ошибку -

unserialize(): Error at offset 181 of 849 bytes 

Я проверил решение, предложенное в unserialize() [function.unserialize]: Error at offset & http://davidwalsh.name/php-serialize-unserialize-issues, но ничего не получилось.

пытался также с помощью base64_encode/decode before serialize/unserialize

Любые намеки?

+2

Несериализуйте рабочую строку, переименуйте индекс в массив и сериализуйте его. Если вы не знаете, что делаете, не меняйте сериализованную строку самостоятельно. –

+1

У нас есть набор сериализованных значений, определенных в db перед установкой нашего программного обеспечения по какой-то известной причине, которая имеет смену field_name. Следовательно, требуется предварительно отредактировать те значения, которые я пытаюсь сделать здесь. – jitendrapurohit

ответ

6

Второй недействителен, потому что в поле s:12:"amount" указано, что это значение является длиной длиной 12. Однако amount имеет только 6 байтов. поэтому вы хотите использовать s:6:"amount"

Это означает, что, вероятно, легче unserialize затем внести изменения, а затем serialize новое значение.

+0

O O - это, попробуйте это. Спасибо за ответ! – jitendrapurohit

+3

@ JitendraPurohit Да, должно быть. В основном это означает 'type: length: content', _s_ обозначает строку. – DeDee