【问题标题】:Is it safe to search through serialized array as a string? (MySql query)将序列化数组作为字符串搜索是否安全? (MySql 查询)
【发布时间】:2014-02-05 15:11:38
【问题描述】:

我有一个这样的序列化数组

a:6:{i:0;i:6;i:1;i:65;i:2;i:56;i:3;i:87;i:4;i:48;i:5;i:528;}

例如我想做一个这样的mysql查询

$id_serialize = 6;
"SELECT id FROM table WHERE col LIKE '% i:" . $id_serialize . "; %'"

此查询是否可能导致冲突(例如数字重复等)?

是否有另一种更有效、更正确的方法来查找数组中的数字而无需反序列化数组且无需循环?

【问题讨论】:

  • 我不会在序列化字符串上使用 like 。这不可靠。

标签: php mysql arrays serialization


【解决方案1】:

这取决于您要存储的数据。对于整数,这是很有可能的。

a:6:{i:0;i:6;i:1;i:65;i:2;i:56;i:3;i:87;i:4;i:48;i:5;i:528;}

这实际上意味着:

a:6:{...} - array of 6 elements
i:0;i:6; - first element, id 0, value 6
i:1;i:65; - second element, id 1, value 65
and so on

如果您将获得 7 个元素的数组,则第 7 个元素定义将是:i:6;i:34 这将与 i:0;i:6; 冲突。您的查询将返回 id 为 6 的结果以及值为 6 的结果。

更多关于数组解剖http://www.php.net/manual/pl/function.serialize.php#66147

【讨论】:

    【解决方案2】:
    a:1:{i:0;s:5:"i:42;";}
    

    哎呀。

    在允许任意内容的数据格式中进行搜索非常困难。这与正则表达式为simply unsuited for (X|HT)ML 的原因相同。您应该真的对数据进行规范化并将每个值存储在自己的列/行中。

    【讨论】:

    • 哪种方法是获得预期结果的最佳方式?
    • 我不知道想要的结果是什么。您能否规范化您的表结构以单独存储这些值?
    • 在这种情况下不会,因为表格真的太大了,选择起来会更加困难。
    • 我怀疑它的存储大小会比序列化字符串大,或者比不可能更难选择。也许你对我的建议有错误的想法。我是说您应该创建一个新表,其中包含两列 table_id(您当前 table 的主 ID)和 value(您当前正在序列化的值)。然后将每个值作为单独的行插入,并使用JOIN 查询选择它。简单、正确地使用 RDBMS。
    【解决方案3】:

    如果您确定数组的内容 - 也就是说,如果您知道数组中的所有项目都是数字 - 您应该能够使用您的方法而没有太多麻烦。如果有其他东西进入数组,您可能会开始得到错误的结果。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-24
      • 1970-01-01
      • 1970-01-01
      • 2015-12-23
      • 2011-02-07
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      相关资源
      最近更新 更多