【问题标题】:Storing an array in a MySQL table将数组存储在 MySQL 表中
【发布时间】:2013-03-28 09:29:51
【问题描述】:

我有一个 5 级多维数组。数组中键的数量会波动,但我需要将其存储在数据库中,以便稍后使用 PHP 访问它。有什么简单的方法可以做到这一点?

我的想法是使用几个不同的分隔符(如#*%*)将数组转换为单个字符串,然后在需要时使用一系列explode() 将数据转换回数组。

此时我还没有编写任何代码,因为我希望有更好的方法来做到这一点。但我确实有一个潜在的解决方案,我试图在下面概述:

这是我的数组的概述:

n=button number
i=item number
btn[n][0]               = button name
btn[n][1]               = button desc
btn[n][2]               = success or not (Y or N)
btn[n][3]               = array containing item info
    btn[n][3][i][0]     = item intput type (Default/Preset/UserTxt/UserDD)
    btn[n][3][i][1]     = array containing item value - if more than one index then display as drop down

以下是我将要使用的分隔符的简要说明:

#*Button Title                      //button title
    &*val1=*usr1234                 //items and values
    &*val2=*FROM_USER(_TEXT_$*name:)        //if an items value contains "FROM_USER" then extract the data between the perenthesis
    &*val3=*FROM_USER(_TEXT_$*Time:)        //if the datatype contains _TEXT_ then explode AGAIN by $* and just display a textfield with the title
    &*val4=*FROM_USER($*name1@*value1$*name2@*value2)       //else explode AGAIN by $* for a list of name value pairs which represent a drop box - name2@*value2

//sample string - a single button
#*Button Title%*val1=*usr1234&*val2=*FROM_USER(_TEXT_$*name:)&*val3=*FROM_USER(_TEXT_$*date:)&*val4=*FROM_USER($*name1@*value1$*name2@*value2)

总之,我正在寻找一些关于如何将多维数组存储在单个数据库表中的想法。

【问题讨论】:

  • 您可以在单个表中使用子父关系想要存储在行级别,或者您可以将数组编码为 json。
  • 您可以对其进行 json_encode 并保存该字符串。
  • 你可以使用 php 的序列化/反序列化来将数组转换为字符串
  • 不需要发明序列化方法,PHP已经实现了不止一种。尝试使用serialize() 或更通用的json_encode()
  • 你可以只使用一个会话。

标签: php mysql arrays multidimensional-array


【解决方案1】:

你想要的是一个data serialization 方法。不要自己发明,那里已经有很多了。最明显的候选者是 JSON (json_encode) 或 PHP 特定的 serialize。 XML 也是一种选择,特别是如果您的数据库可能在某种程度上原生支持它。

【讨论】:

  • 序列化是完美的!我不敢相信我真的会做所有这些工作。你刚刚挽救了我几个小时的生命。
  • 请注意,PHP 的序列化格式几乎只受 PHP 支持。为了使存储在数据库中的数据尽可能保持中立,我更喜欢 JSON。
  • 谢谢,不过没关系。我没有在这个项目中使用 PHP 以外的任何东西。
【解决方案2】:

【讨论】:

    【解决方案3】:

    最适合您的决定是json_encode

    json_encode 除了序列化存储在数据库中之外,还有一些优点。

    1. 采取更小的尺寸
    2. 如果你 必须在db中手动修改数据,序列化会出现一些问题,因为这种格式存储了已经序列化的值的大小,修改这个值你必须计算和修改这个参数。

    【讨论】:

      【解决方案4】:

      SQL(无论是 mySQL 还是任何其他变体)不支持数组数据类型。

      您应该在 SQL 中处理此类数据的方式是将其存储在多个表中。

      因此,在此示例中,您将拥有一个包含 buttonIDbuttonNamebuttonSuccess 等字段的表,以及另一个包含 buttonInputTypebuttonInputValue 字段的表,以及 @987654326 @ 链接回父表。

      这将是推荐的“关系”做事方式。这样做的意义在于,在时机成熟时,可以更轻松地从 DB 中查询数据。

      不过还有其他选择。

      一种选择是使用 mySQL 的enum 功能。由于您有一组可用于输入类型的固定值,因此您可以为其使用 enum 字段,这样您就无需为此准备一个额外的表。

      当然,另一种选择是其他人所建议的,只需使用json_encode() 或类似方法对数据进行序列化,然后将其全部存储在一个大文本字段中。

      如果数据将用作简单的数据块,而无需运行查询来检查其中的一部分,那么这有时可能是最简单的解决方案。这不是数据库专家想要看到的,但从实用的角度来看,如果它完成了工作,那么请随意使用它。

      但是,请务必注意这些限制。通过使用序列化解决方案,您基本上是在说“这些数据根本不需要以任何方式管理,所以我不会为它做适当的数据库设计而烦恼。”。这很好,只要您不需要管理它或在其中搜索值。如果你这样做了,你需要更加努力地思考你的数据库设计,并小心选择“简单”的选项。

      【讨论】:

        猜你喜欢
        • 2015-08-23
        • 1970-01-01
        • 2016-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-14
        • 2014-05-16
        相关资源
        最近更新 更多