更新 MYSQL 数据库上的 base64_encode() 序列化数组? [关闭]
Posted
技术标签:
【中文标题】更新 MYSQL 数据库上的 base64_encode() 序列化数组? [关闭]【英文标题】:updating base64_encode() serialized array on MYSQL Databases? [closed] 【发布时间】:2012-02-13 21:53:35 【问题描述】:现在保存 base64_encode() 序列化数组后,我确实遇到了如何更新数据的问题
Array
(
[dates] => Array
(
[0] => 2012-01-18
[1] => 2012-02-18
[2] => 2012-03-18
[3] => 2012-04-18
[4] => 2012-05-18
)
[amount] => Array
(
[0] => 2000
[1] => 2000
[2] => 2000
[3] => 2000
[4] => 2000
)
[deposit] => Array
(
[0] => 0
[1] => 0
[2] => 0
[3] => 0
[4] => 0
)
)
例如我想更新[deposit][2]
的值,其中[dates][2]
2012-03-18
我不知道如何更新 base64_encode() 序列化数组,这可能吗?
-> 在听取专家的回答后,我确实根据上校 Shrapnel 的建议更改了我的数据库结构,非常感谢所有回复
【问题讨论】:
大概你必须从数据库中获取数据,base64_decode()
它,反序列化,更改值,然后重新序列化,重新编码,更新数据库记录(s)。在关系数据库中的编码、序列化结构中查询没有明智的方法,更不用说更新它们了,这是您应该使用数据库的内置数据类型而不是针对它们的几个原因之一。
您需要提取数据、base64_decode、更新数组、base64_encode 并将其保存回数据库。当您在整个数据库中循环查找匹配记录时,可能是将数据存储更改为您将来可以查询的内容的好时机。
谢谢大家的回复,有示例代码吗?
有大量示例代码如何更新数据库中的字段。在这里提问之前请先做一些功课。社区将尊重这一点。
【参考方案1】:
不要使用任何编码、序列化方法存储经常更新的数据。您实际上是以编码形式存储数组,它没有被序列化。
base64
编码数组会遇到更多问题,您无法轻松地以原始形式取回它们。 base64_decode
将字符串返回给您。
如果返回的字符串是有效的数组语法,您仍然可以使用eval
将其转换回数组。但是,我不建议使用这种方法。
如果您需要在数据库中存储数组或对象,请使用serialize
方法,在检索数组和对象时,您可以使用unserialize
方法。
【讨论】:
好的,谢谢,我只使用序列化保存到数据库中,但不知道如何更新你知道它应该如何从我上面的示例中保存基础吗? 另一个不错的序列化是json_encode
- json_decode
。它比serialize
和unserialize
更冗长一些,但人类可读并且可以被提取到javascript。
通过反序列化函数传递序列化数据后,您将拥有原始数组,更新数组并将其转换回序列化形式并更新数据库
别管我的答案。如果您有异议,请留下评论并标记答案。但请不要把手放在文字上。谢谢。【参考方案2】:
这就是为什么在数据库中存储 base64 编码的序列化数据是非常糟糕的主意。
您必须重新设计您的数据库,摆脱 base64_encode 和序列化数据。 虽然使用base64和数据库绝对没有任何意义,但将序列化的数据存储在数据库中就像用石锤修补电子设备一样。
数据库和古老的羊皮纸卷轴之间的主要区别在于允许个人访问任何信息,而您使用石器时代存储数据的方式完全破坏了这个目的。请自学并学习使用数据库的正确方法。
数据库本身是您示例中数据结构的完美存储。您只需添加另一个包含字段 date
、amount
、deposit
和 record_id
的表,并将该表链接到当前包含该 base64 编码数组的表。
【讨论】:
感谢您的建议,我现在正在考虑如何重组我的桌子以上是关于更新 MYSQL 数据库上的 base64_encode() 序列化数组? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章
openssl pem转cer文件 并用base64编码解码过程
JavaScript CryptoJS.enc.Base64 等效 C#