【问题标题】:Save array in mysql database在mysql数据库中保存数组
【发布时间】:2012-05-28 00:25:06
【问题描述】:

我想在将总订单发送到 Paypal 之前保存额外信息。对于每个项目,我在我的 MySQL 数据库中创建了一个我想要存储它的列。现在我正在考虑将其保存为一个数组,以便稍后读取以创建 PHP 页面。额外字段取自输入表单字段。

使用数组可以确保不混淆信息吗?

【问题讨论】:

  • “我对每个项目都有一个列”...你的意思是行还是?
  • 将数组存储在单个 mysql 字段中违背了数据库的目的。您当前的代码是什么样的?
  • MySQL 5.7.8 及更高版本现在具有原生 JSON 支持,这意味着您可以将 JSON 字符串直接放在数据库的表字段中。

标签: php mysql arrays


【解决方案1】:

您可以使用 MySQL JSON 数据类型来存储数组

mysql> CREATE TABLE t1 (jdoc JSON);

查询正常,0 行受影响(0.20 秒)

mysql> INSERT INTO t1 VALUES('{"key1": "value1", "key2": "value2"}');

查询正常,1 行受影响(0.01 秒)

在PHP中获取上述对象

json_encode(["key1"=> "value1", "key2"=> "value2"]);

更多内容请关注https://dev.mysql.com/doc/refman/8.0/en/json.html

【讨论】:

    【解决方案2】:

    要使用 PHP 将任何数组(或任何对象)转换为字符串,请调用 serialize():

    $array = array( 1, 2, 3 );
    $string = serialize( $array );
    echo $string;
    

    $string 现在将保存数组的字符串版本。上述代码的输出如下:

    a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}
    

    要将字符串转换回数组,请使用 unserialize():

    // $array will contain ( 1, 2, 3 )
    $array = unserialize( $string );
    

    【讨论】:

      【解决方案3】:

      在 RDBMs 表中使用逗号分隔符将其存储在多值列中。

      【讨论】:

        【解决方案4】:

        您可以使用serialize/unserialize 存储数组。使用该解决方案,它们不能轻易地从其他编程语言中使用,因此您可以考虑使用 json_encode/json_decode 代替(这为您提供了广泛支持的格式)。 避免为此使用implode/explode,因为您最终可能会遇到错误或安全漏洞。

        请注意,这会使您的表非规范化,这可能是个坏主意,因为您无法轻松查询数据。因此,在继续之前仔细考虑这一点。您可能需要查询数据以进行统计或其他方式吗?是否有其他原因需要对数据进行规范化?

        另外,不要保存原始的 $_POST 数组。有人可以轻松地制作自己的 Web 表单并将数据发布到您的网站,从而发送一个占用大量空间的非常大的表单。保存您想要的那些字段,并确保在保存之前验证数据(这样您就不会得到无效值)。

        【讨论】:

        • 请您详细说明围绕implode()explode() 的安全漏洞。
        • verbumSapienti,考虑这段代码:implode(':', ['12','34','5:6']),它会产生这个字符串:12:34:5:6。如果您有正确的输入验证,这首先不应该发生(这样任何值都不能是5:6),但使用参数化和/或始终输出有效明确数据的函数也总是更好,例如json_encode.
        • 首先,您的答案中有一个拼写错误(应该是序列化而不是序列化)。其次,序列化/反序列化是将整个结构存储为 PHP 中的字符串的标准方法。您可以序列化对象,包括它们的属性等。如果您只想存储数组,那么 JSON 是最好的,因为它是在 PHP 之外使用的最兼容的解决方案。您可以轻松阅读 Javascript 或其他语言的 JSON。
        【解决方案5】:

        这样的事情的完成方式是序列化数组,这意味着“用它制作一个字符串”。为了更好地理解这一点,请查看以下内容:

        $array = array("my", "litte", "array", 2);
        
        $serialized_array = serialize($array); 
        $unserialized_array = unserialize($serialized_array); 
        
        var_dump($serialized_array); // gives back a string, perfectly for db saving!
        var_dump($unserialized_array); // gives back the array again
        

        【讨论】:

        • 仅供参考,现在也可以将数组作为 JSON 直接保存到 MySQL 数据库中(当然也可以保存其他数据库类型)。 MySQL 然后能够将 JSON 作为字符串和真实数组数据读取。这很有用,但速度很慢,但可能正是您所需要的。
        【解决方案6】:
        <?php
        $myArray = new array('1', '2');
        $seralizedArray = serialize($myArray);
        ?>
        

        【讨论】:

          【解决方案7】:

          使用 PHP 函数 serialize() 将数组转换为字符串。这些字符串可以很容易地存储在 MySQL 数据库中。如果需要,可以使用unserialize() 再次将它们转换为数组。

          【讨论】:

          • 保存前 $store = serizalize($someData); $sql = "插入 PaypalLogs (store, created) 值 ('{$store}', NOW())";在 $someData = unserizalize($row['store']); 之后
          猜你喜欢
          • 2021-11-01
          • 1970-01-01
          • 2012-09-29
          • 2015-09-22
          • 1970-01-01
          • 1970-01-01
          • 2014-01-12
          • 2011-06-18
          相关资源
          最近更新 更多