是否可以在不反序列化的情况下更新序列化内容

时间:2013-05-24 06:52:35

标签: php mysql serialization

假设该数组内容10个项目名称年龄为第二个项目,值为10 它在序列化后存储在mysql数组中

是否可以直接在序列化的mysql查询中更新该年龄 与这些步骤(一种方式可以是这个) 选择从数据库序列化数据 反序列化它 改变数组 然后再次序列化 然后更新

例如像这样序列化数据somhing

一个:23:{I:10000011;一个:5:{S:15: “social_users_id”; S:8: “10000022”; S:10: “friends_id”; S:8: “10000011”; S :8:“关系”; s:1:“1”; s:6:“status”; s:1:“0”; s:4:“html”; s:41:“Pradeep Kumar有更新个人资料图片。 “;} I:10000015;一个:5:{S:15:” social_users_id “; S:8:” 10000022 “; S:10:” friends_id “; S:8:” 10000015 “S:8:”关系“; s:1:”6“; s:6:”status“; s:1:”0“; s:4:”html“; s:41:”Pradeep Kumar有更新个人资料图片。“;} I:10000016;一个:5:{S:15: “social_users_id”; S:8: “10000022”; S:10: “friends_id”; S:8: “10000016”,S:8: “关系”; S :1:“3”; s:6:“status”; s:1:“0”; s:4:“html”; s:41:“Pradeep Kumar有更新个人资料图片。”;} i:10000018;一:5:

OR Array

[10000015] => Array
    (
        [social_users_id] => 10000022
        [friends_id] => 10000015
        [relation] => 6
        [status] => 0
        [html] => Pradeep Kumar has update profile picture.
    )

[10000016] => Array
    (
        [social_users_id] => 10000022
        [friends_id] => 10000016
        [relation] => 3
        [status] => 0
        [html] => Pradeep Kumar has update profile picture.
    )

我想选择并更新数组'10000015'的'status'索引 我使用了表格coloum的longtext数据类型。

我想首先搜索那个状态索引,然后在更新之后,我们可以使用查询或者我必须使用PHP代码...

它可以比那短吗? 如果我们只是想要更新一件事那里有很多浪费(无情的查询,更新)...特别是如果数组很大

加 我们怎样才能在没有反序列化的情况下进行搜索?(可能吗?)

任何想法...... 谢谢

3 个答案:

答案 0 :(得分:2)

据我所知,这是不可能的,这是在MySQL中使用数组的缺点(你需要一直序列化和反序列化数据)。

接下来我看到你的数组看起来一样,所以把它们放在表格中。

row => social_users_id|friends_id|relation|status|html

如果你想使用数组,你可以看看NoSQL。我使用mongodb取得了很大的成功。 NoSQL数据库的一个巨大缺点是您需要摆脱SQL思维模式。例如,你不能使用JOINS。

但是在MonoDB数组中支持并且“可查询”动态数据集的巨大优势


如果你真的想要它,你可以制作一个表arrayarray_item

使用数组如下: id|name

和array_item: id|array_id|key|value

现在你可以说数组项我想要数组id x的值

但也有很多其他的东西

就像我想要键y和值需要x

的数组一样

请注意,此数据集将超时并且难以阅读

答案 1 :(得分:1)

严格来说,当然可以更新数据库的任何行。重点是:这样做真的是个好主意吗?

不要忘记序列化遵循规则和规范。 s:15:"social_users_id"表示 unserialize()函数将处理15个字符的字符串。这是一个例子,还有其他规则。

所以是的,严格来说,你可以更新你的序列化数组中的字符串,但你必须计算规范,因为你真的不想自己重写序列化程序,你肯定会迟早打破你的序列化弄乱你的数据。

无论如何,如果您想了解有关规格的更多详情,请查看these comments on the PHP manual

另一点是,显然,如果您需要更新字段,则此字段必须作为字段存在,而不是作为子字符串存在。这是弱的数据库设计,这一点迟早会导致你陷入困境。

现在,如果你把两个缺点结合起来,那么......你猜; o)

答案 2 :(得分:0)

简短的回答是否定的,序列化的数据必须是非序列化的,然后进行编辑,然后重新序列化,除非你想运行像preg_replace();那样相当密集处理的正则函数。

我的建议是将值分别存储在数据库中。