unserialize() [function.unserialize]:在 49151 字节的偏移量 49151 处出错

2024-04-21

在将对象存储到数据库中并检索它之后,我遇到了像网站上的许多错误一样的偏移错误。如果我不存储它,一切都会正常:

$serializedObject = serialize($this);
$unSerializedObject = unserialize($serializedObject);

此外,我在保存数据并从数据库检索数据时使用base64编码,但这没有帮助。但我不做任何逃避。 我的对象处理一些字符串。我发现这个字符串:

A woman is travelling around the world. She is 28 years old and she is from Great Britain.
She cannot use a car or a plane on her

效果很好。但是当我再添加一个空格和单词[旅程]时,就会弹出错误。这是包含这个单词的字符串:

A woman is travelling around the world. She is 28 years old and she is from Great Britain.
She cannot use a car or a plane on her journey

我的问题是为什么会弹出错误?

Here http://pastebin.com/vKm2rkLt是的输出serialize($this)在没有单词的情况下运行文本journey

Here http://pastebin.com/5NQzphTX是的输出serialize($this)用这个词来对抗文本journey

UPDATE

我将对象保存到的表具有字符集utf-8以及未定义字符集的列,因为它是 BLOB 类型。 这mb_detect_encoding(serialize($this))回报UTF-8

没有什么可以逃避的$sql。这是我正在使用的 Kohana 框架内执行查询的方式:

$result = mysql_query($sql, $this->_connection)

原答案:

MySQL 中的 TEXT 字段最多可存储 65535 个字节,所以我猜测它被截断了。

请改用 MEDIUMTEXT 或 LONGTEXT。

除此之外,如何将数据传入和传出数据库还存在潜在问题。 PHP 序列化字符串可能包含空字节(字节 0),这似乎是未正确传输的原因。

解决这个问题的一种方法是通过类似的方式对字符串进行编码base64_encode()它使用非常友好的字母数字/符号字母表。如果你增加你的能力,这将解决你的问题BLOB键入至MEDIUMBLOB or LONGBLOB.

但是,如果您正确地将查询发送到数据库,则可以安全地发送原始字符串。由于您使用的是 Kohana,所以这里有一个非常适合我的示例。

简洁版本:

$sql = 'INSERT INTO serialized_object (data) VALUES (:data)';
DB::query(Database::INSERT, $sql)->
  param(':data', $serialization)->
  execute();

Code:

<?php 
class Article {}
class Word {}

class Controller_Welcome extends Controller
{
    public function action_index()
    {
        $object = unserialize(hex2bin(file_get_contents('/tmp/data.hex')));
        $serialization = serialize($object);

        $sql = 'INSERT INTO serialized_object (data) VALUES (:data)';
        DB::query(Database::INSERT, $sql)->
            param(':data', $serialization)->
            execute();

        $saved_length = DB::query(Database::SELECT, '
            SELECT LENGTH(data) AS l
            FROM serialized_object
            ORDER BY id DESC
            LIMIT 1
        ')->execute()->get('l');

        if ($saved_length != strlen($serialization))
        {
            throw new Exception("Database length is incorrect. Value is corrupted in database.");
        }

        $saved_serialization = DB::query(Database::SELECT, '
            SELECT data
            FROM serialized_object
            ORDER BY id DESC
            LIMIT 1
        ')->execute()->get('data');

        $saved_object = unserialize($saved_serialization);

        if (!$saved_object)
        {
            throw new Exception("Unable to unserialize object.");
        }

        if ($saved_object != $object)
        {
            throw new Exception("Saved object is not equal to object.");
        }

        $this->response->body('Everything is fine.');
    }

} 

数据库.php:

<?php

return array
(
    'default' => array(
        'type'       => 'PDO',
        'connection' => array(
            /**
             * The following options are available for PDO:
             *
             * string   dsn         Data Source Name
             * string   username    database username
             * string   password    database password
             * boolean  persistent  use persistent connections?
             */
            'dsn'        => 'mysql:host=127.0.0.1;dbname=test',
            'username'   => 'root',
            'password'   => '****',
            'persistent' => FALSE,
        ),
        /**
         * The following extra options are available for PDO:
         *
         * string   identifier  set the escaping identifier
         */
        'table_prefix' => '',
        'charset'      => 'utf8',
        'caching'      => FALSE,
    ),
);

Schema:

CREATE TABLE `serialized_object` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `data` longblob NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

unserialize() [function.unserialize]:在 49151 字节的偏移量 49151 处出错 的相关文章

  • 使用 Webmin 设置 cron 作业

    我正在尝试使用 Webmin 设置一个 Cron 作业每 5 分钟运行一次 它需要定位 php 文件并运行该文件中的 php 脚本 当我在 命令 字段中输入文件路径时 它不起作用 我只是想知道我做错了什么 以及我需要 Cron 作业运行的文
  • Google Drive 服务帐户上传的位置

    我正在尝试使用服务帐户将文件上传到我的 Google 云端硬盘 当我部署此代码时 我不希望用户给予授权 我希望他们上传到我的帐户 我通过 PHP 使用它 下面是我到目前为止的情况 这段代码是基于官方文档给出的例子 当我运行 php 脚本时
  • 如何统计订单总价?

    我有这些表 Orders id status user id address id 1 await 1 1 products id name price quantity 1 test1 100 5 2 test2 50 5 order p
  • 如何仅在 PHP 中使用 str_replace() 删除文本一定次数?

    我试图从字符串中删除单词 John 一定次数 我在 php 手册上读到 str replace 除了第四个参数 count 所以我想可以用来指定应该删除多少个搜索实例 但事实似乎并非如此 因为以下情况 string Hello John h
  • 是否存在用于解析 ASN.1 或基于它生成 PHP 代码的 PHP 库?

    我已经审视过自己了 但今天我的 Google fu 似乎并不强 我正在努力开发一种标准化协议 用于通过 TCP IP 连接在 Apache PHP 服务器和微控制器上的嵌入式 C 代码之间交换数据结构 我们使用 ASN 1 表示法 我真正想
  • 仅当用户打印时如何重定向到另一个页面

    我一直在尝试找到一种在用户实际打印时重定向到另一个页面的方法 也就是说 只有当他们从打印时打开的选项卡中单击该打印按钮时 我才想重定向 我不想要这种方法 function myFunction window print window loc
  • 从 PHP 使用 linux 'dialog' 命令

    我正在尝试编写一个帮助程序脚本 用于在服务器上执行各种管理任务 这些任务只能从命令行完成 并尝试使用 dialog 命令来显示消息框 输入 密码提示等 但是 需要这项任务要求我用 PHP 处理数据 我在让对话框命令以这种方式工作时遇到问题
  • StrRev() 不支持 UTF-8 [重复]

    这个问题在这里已经有答案了 我正在尝试编写一个代码来替换非阿拉伯支持的程序中支持的阿拉伯文本因为我需要在替换后反转文本 但它显示一些垃圾内容而不是想要的结果 这是代码 结果 After Reverse 我需要它是原来的样子 但相反 不是垃圾
  • 使用 php 将 swf 转为 pdf

    有没有办法使用 php 将 SWF 转换为 pdf 我的意思是该页面有一个按钮 单击它必须将 swf 内容导出为 pdf 格式 您可以尝试的一种方法是使用ffmpeg http www ffmpeg org 使用 image2 输出编解码器
  • 如何使用Google API PHP SDK获取用户信息

    我正在尝试为拥有 Google 帐户的用户添加登录选项到我的网站 我已经能够实现这个 Facebook 但在使用 Google 获取用户帐户信息时遇到问题 我正在使用位于此处的 Google PHP SDK https github com
  • Laravel - 重复键批量插入更新大数据集

    我有大约 80k 条记录 每天需要多次运行插入 更新脚本 INSERT INTO my rankings id rank VALUES 1 100 2 99 3 102 80000 3 ON DUPLICATE KEY UPDATE ran
  • 获取 PHP 网站的根 URL

    我目前正在开发一个 PHP 项目 正在寻找一种方法来获取网站根目录的 URL 我的根目录有一个配置文件 所以我正在考虑使用它来找出 基本 URL 我正在寻找一种动态执行此操作的方法 以便我可以找到网站根目录的 URL 即http domai
  • 避免刷新时上传图片

    我正在使用最简单的图像上传形式 我非常希望保持这种方式 只需要一些 php 代码看起来像这样
  • 美化html输出

    我想知道是否有类或类似的东西可以包含在我的 PHP 页面中以美化 HTML 输出 例如在标签后添加新行并正确缩进 以便我的源代码不仅仅是一行 我知道对于浏览器来说这并不重要 但我希望这样做 我听说过http www php net manu
  • 无法访问扩展 Symfony\Bundle\FrameworkBundle\Controller\Controller 的控制器中的 Symfony2 容器

    原始问题 我已经阅读了 book http symfony com doc current book service container html 关于服务容器 我仍然感到困惑 因为几乎每次我尝试使用时 事情似乎都随机不起作用 this g
  • 如何确定网站的语言

    我有一个网站的网址 需要找出该网站使用哪种语言 无论是西班牙语 法语 意大利语等 该网站的顶级域名是 com 这根本没有帮助 我无法简单地检查字符串是否包含 de fr 或任何其他国家 地区代码 我试图得到lang的属性html标签 但有很
  • 使用 Hudson 将构建与部署分开

    我们已经开始使用Hudson 目前的工作流程是 本地签出 gt 代码 gt 运行测试 gt 更新 gt 运行测试 gt 提交 Hudson 并不进行轮询 而是只是坐在那里 直到我们实例化构建 然后它 本地结帐 gt 运行 Phing 脚本
  • 返回导航缓存 - IE

    当我在 IE 11 上运行 Web 应用程序时 收到如下警告消息 DOM7011 此页面上的代码禁用了后退和前进缓存 为了 更多信息 请参阅 http go microsoft com fwlink LinkID 291337 http g
  • 在 PHP 上发送不带 SMTP 标头的 SMS

    我正在尝试使用以下对我有用的代码通过 PHP 发送短信验证码 但我越来越 email protected cdn cgi l email protecti
  • PHP Session Id 在页面之间发生变化

    我有一个问题 我在 2 个页面之间丢失了 PHP 会话 session start 包含在一个名为 session inc php 的文件中 该文件包含在每个需要设置会话的页面中 这适用于网站上除一个特定页面 member profile

随机推荐

  • 包装 API 以支持依赖注入

    我正在与一个只有静态函数的 API 进行交互 并且无法打开和更改 public class WindowsNativeGraphAPI public static IEnumerable
  • 练习:网络爬虫 - 并发不起作用

    我正在经历 golang 之旅 并致力于最后的练习 以将网络爬虫更改为并行爬行而不是重复爬行 http tour golang org 73 http tour golang org 73 我所改变的只是抓取功能 var used make
  • Android Resources$NotFoundException:无法找到资源 ID

    我从 Firebase 收到一份活动报告 由于找不到我的资源而导致活动失败 我真的很困惑为什么找不到它 因为我相信所有文件都在正确的目录中 并且用户使用的是 Android v8 1 它并不古老 应该能够处理我认为有的东西自 v1 1 以来
  • 强制用户注销会话 PHP

    我似乎无法找到这个问题的直接答案 有没有办法强制登录用户注销 我的登录系统本质上只依赖于包含用户唯一 ID 存储在 mysql 数据库中 的会话 所以本质上只是 if isset SESSION user id echo You re lo
  • Delphi XE2:为什么 FireMonkey 应用程序是高清的?

    根据 Delphi XE2 的发行说明 FireMonkey可以创建高清应用程序 HD 代表高清晰度 为什么是高清 VCL应用程序不能像FireMonkey一样创建高清应用程序吗 这里是Firemonkey 的文档 http docwiki
  • 来自 post 请求的有效负载在 Node.js 函数中不可用

    我刚刚开始摆弄三个新的 对我来说 框架 产品 MongoDB NodeJS 和 AngularJS 我想要完成的是让一个简单的表单提交一个值并将该值写入数据库 我已经到了这样的地步 在我的 Angular 应用程序中使用 http post
  • jQuery 中的对象或方法链接如何工作?

    我不是问链接的适当语法是什么 我知道它可能是这样的 myDiv removeClass off addClass on 据我所知 链接是相对于其他著名框架的优势之一 有人可以向我解释一下链接在这里是如何工作的吗 如果您有一个具有某些方法的对
  • 参数“sectionGroupName”无效

    我正在尝试添加服务引用 然后收到此错误 参数 sectionGroupName 无效 参数名称 sectionGrouName 项目运行 Net 3 5 当我将项目升级到 Net 4 0 时 它就可以工作了 但这对我来说不是一个选择 因为其
  • 为什么按钮不绘制?

    我不明白为什么按钮不绘制在它之前工作的背景上 这不会显示错误 这是代码 gt 这段代码是错误的吗 我的问题是否可以重现 它可能在按钮的代码中 我将不胜感激 import pygame pygame init screen pygame di
  • Kafka服务器未远程连接zookeeper服务器

    我正在尝试将 kafka 服务器 在 Windows 系统上 连接到 Zookeeper 服务器 我面临着 Opening socket connection to server 10 160 10 25 10 160 10 25 2181
  • Postmates 与 Shopify Shipping/Carrier 服务集成

    我们正在寻求集成此应用程序 https postmates com developer docs https postmates com developer docs进入我们的 Shopify 平台 有关其工作原理 请检查 http blo
  • 如何替换ng-view中的部分节?

    我倾向于 Angular 的路线 很清楚如何通过简单的设置将视图加载到 ng view 中template属性 假设我在视图上有一个小部件 当用户导航到 changeWidget 时 如何仅替换小部件内容 在我看来 我只能使用单个ng vi
  • android:errorMessageBackground 在 styles.xml 中找不到资源错误

    我正在研究EditText验证并使用 setError 显示错误消息 我的主要座右铭是根据我的应用程序设计更改错误弹出窗口 我用的是 android errorMessageBackground 风格但不幸的是我得到了 No Resourc
  • 将非标准 svn 转换为 git

    我们有一个非标准的 svn 设置 如下所示 Root gt Trunk gt Projects gt Project 1 gt Project 2 gt Project 3 gt Libraries gt Library 1 gt Libr
  • 使用 ggplot 包 R 更改图中 yaxis 面的标签

    这是我的数据集和生成绘图的代码 library reshape library ggplot2 set seed 357 myLetters lt function length out a lt rep letters length ou
  • 使用 Google Sign-In Android 获取用户的出生日期和性别

    我已经集成了Google Sign In在我的应用程序中 我可以获得用户的Email and DisplayName 现在 我想获取用户的Birthdate and Gender 我已经添加了所有必需的requests Scopes int
  • 对象和 console.log 的奇怪行为[重复]

    这个问题在这里已经有答案了 这段代码 foo id 1 id 2 id 3 id 4 id 5 console log foo1 foo foo length foo splice 2 1 console log foo2 foo foo
  • 创建的线程数超出预期

    你可以找到该程序here https pastebin com H5fq732a 我正在消息传递框架 0MQ 中构建一个程序 我尝试执行我发布的内容here https stackoverflow com questions 4409620
  • 从因子创建列并进行计数[重复]

    这个问题在这里已经有答案了 一个看似简单的问题却让我非常忙碌 我有一个数据框 gt df1 Name Score 1 Ben 1 2 Ben 2 3 John 1 4 John 2 5 John 3 我想创建这样的表格摘要 gt df2 N
  • unserialize() [function.unserialize]:在 49151 字节的偏移量 49151 处出错

    在将对象存储到数据库中并检索它之后 我遇到了像网站上的许多错误一样的偏移错误 如果我不存储它 一切都会正常 serializedObject serialize this unSerializedObject unserialize ser