@Muffasssa

В чем причина ошибки unserialize(): Error at offset 487 of 868 bytes?

При отправке выходит ошибка:
unserialize(): Error at offset 487 of 868 bytes
*/bff/modules/sendmail/base.php [127]

Строка 127:
$sContentUn = (!empty($sContent) ? @unserialize($sContent) : false);


Часть кода:
/**
     * Получение шаблона письма из файла
     * @param string $sTemplateKey ключ шаблона
     * @return array (body=>string, subject=>string, is_html=>bool, wrapper_id=>int)
     */
    public function getMailTemplateFromFile($sTemplateKey)
    {
        static $cache = array();

        if (!empty($cache[$sTemplateKey])) {
            return $cache[$sTemplateKey];
        }

        $sTemplatePath = $this->_tplPath . $sTemplateKey . $this->_tplExt;

        # получаем шаблон письма
        if (file_exists($sTemplatePath)) {
            $sContent = Files::getFileContent($sTemplatePath);
        } else {
            $sContent = '';
        }
        if (!$sContent) {
            # нигде не нашли, восстанавливаем
            if ($this->restoreMailTemplateFile($sTemplateKey) !== false) {
                $sContent = Files::getFileContent($sTemplatePath);
            }
        }

        $sContentUn = (!empty($sContent) ? @unserialize($sContent) : false);
        if (is_array($sContentUn)) # un-сериализация прошла успешно
        {
            $sContent = $sContentUn;
        } else if (!empty($sContent) && mb_stripos($sContent, ':{')!==false) {
            # пытаемся починить сериализованные данные
            $sContent = strtr($sContent, array("\r\n"=>"\n","\n"=>"\r\n")); // LF (Unix) => CRLF (Windows)
            $sContentUn = @unserialize($sContent);
            if (!is_array($sContentUn)) {
                $sContent = preg_replace_callback('!s:(\d+):"(.*?)";!', function($match) {
                    return ($match[1] == strlen($match[2])) ? $match[0] : 's:' . strlen($match[2]) . ':"' . $match[2] . '";';
                }, $sContent);
                $sContentUn = @unserialize($sContent);
            }
            if (is_array($sContentUn)) {
                $sContent = $sContentUn;
            }
        }

        # сохраняем в кеш и возвращаем шаблон
        if (!is_array($sContent)) {
            $sContent = array('body' => array(), 'subject' => array(), 'is_html' => false, 'wrapper_id' => 0);
            foreach ($this->locale->getLanguages() as $lng) {
                $sContent['body'][$lng] = $sContent['subject'][$lng] = '';
            }
        } else {
            foreach ($this->locale->getLanguages() as $lng) {
                foreach ($sContent as $k => $v) {
                    if (is_array($v)) {
                        if (!isset($sContent[$k][$lng])) {
                            $sContent[$k][$lng] = '';
                        }
                    }
                }
            }
        }

        return ($cache[$sTemplateKey] = $sContent);
    }
  • Вопрос задан
  • 4163 просмотра
Пригласить эксперта
Ответы на вопрос 1
inoise
@inoise Куратор тега PHP
Solution Architect, AWS Certified, Serverless
Сериализация работает некорректно с символами большей длины в utf, такими как русские буквы, смайлики и иже с ним. Распаковать такую строку автоматически невозможно. Ну, мои я ее знаю способов. Дело в том что в сериализации сохраняется неверная длина строки
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы