将PHP数组保存到MySQL?

时间:2009-12-30 04:33:31

标签: php mysql arrays

将数据数组保存到单个mysql字段的好方法是什么?

一旦我在mysql表中查询该数组,有什么方法可以将它恢复为数组形式?

序列化和反序列化答案吗?

14 个答案:

答案 0 :(得分:82)

没有良好的方法将数组存储到单个字段中。

您需要检查关系数据并对架构进行适当的更改。有关此方法的参考,请参见下面的示例。

如果必须将数组保存到单个字段中,那么serialize()unserialize()函数就可以完成。但是您无法对实际内容执行查询。

作为序列化功能的替代方案,还有json_encode()json_decode()

考虑以下数组

$a = array(
    1 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    2 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
);

要将其保存在数据库中,您需要创建一个这样的表

$c = mysql_connect($server, $username, $password);
mysql_select_db('test');
$r = mysql_query(
    'DROP TABLE IF EXISTS test');
$r = mysql_query(
    'CREATE TABLE test (
      id INTEGER UNSIGNED NOT NULL,
      a INTEGER UNSIGNED NOT NULL,
      b INTEGER UNSIGNED NOT NULL,
      c INTEGER UNSIGNED NOT NULL,
      PRIMARY KEY (id)
    )');

要处理记录,您可以执行这些查询(是的,这是一个示例,请注意!)

function getTest() {
    $ret = array();
    $c = connect();
    $query = 'SELECT * FROM test';
    $r = mysql_query($query,$c);
    while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) {
        $ret[array_shift($o)] = $o;
    }
    mysql_close($c);
    return $ret;
}
function putTest($t) {
    $c = connect();
    foreach ($t as $k => $v) {
        $query = "INSERT INTO test (id,".
                implode(',',array_keys($v)).
                ") VALUES ($k,".
                implode(',',$v).
            ")";
        $r = mysql_query($query,$c);
    }
    mysql_close($c);
}

putTest($a);
$b = getTest();

connect()函数返回一个mysql连接资源

function connect() {
    $c = mysql_connect($server, $username, $password);
    mysql_select_db('test');
    return $c;
}

答案 1 :(得分:26)

通常,是的,序列化和反序列化是可行的方法。

如果您的数据很简单,那么保存为逗号分隔的字符串可能会更好地存储空间。例如,如果你知道你的数组只是一个数字列表,那么你应该使用implode / explode。这是1,2,3a:3:{i:0;i:1;i:1;i:2;i:2;i:3;}之间的差异。

如果没有,则为所有情况序列化和反序列化工作。

答案 2 :(得分:8)

只需使用序列化PHP函数:

<?php
$myArray = array('1', '2');
$seralizedArray = serialize($myArray);
?>

但是,如果你使用这样的简单数组,你也可以使用implode和explode。使用空白数组而不是新数组。

答案 3 :(得分:8)

我发现自己最好的方法是将数组保存为带分隔符的数据字符串

$array = array("value1", "value2", "value3", "...", "valuen");
$array_data = implode("array_separator", $array);

$query = "INSERT INTO my_tbl_name (id, array_data) VALUES(NULL,'" . $array_data . "');";

然后,您可以使用简单查询

搜索存储在数组中的数据
$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";

使用explode()函数将“array_data”字符串转换为数组

$array = explode("array_separator", $array_data);

请注意,这不适用于多维数组,并确保“array_separator”是唯一的,并且在数组值中不存在。

小心!!!如果您只是将表单数据放入数据库,那么您将处于陷阱状态,因为表单数据不是SQL安全的!你必须处理你的表格价值 使用mysql_real_escape_string或使用MySQLi mysqli::real_escape_string 或者如果value是整数或boolean cast(int)(布尔值)

$number = (int)$_POST['number'];
$checked = (boolean) $_POST['checked'];

$name = mysql_real_escape_string($db_pt, $_POST['name']);
$email = mysqli_obj->real_escape_string($_POST['email']);

答案 4 :(得分:8)

序列化/反序列化数组以便在数据库中存储

访问http://php.net/manual/en/function.serialize.php

从PHP手册:

查看页面上的“返回”

返回一个字符串,其中包含可以存储在任何位置的值的字节流表示。

请注意,这是一个二进制字符串,可能包含空字节,需要像这样存储和处理。例如,serialize()输出通常应存储在数据库的BLOB字段中,而不是存储在CHAR或TEXT字段中。

注意:如果要将html存储到blob中,请确保对其进行base64编码,否则可能会破坏序列化功能。

编码示例:

$YourSerializedData = base64_encode(serialize($theHTML));

$YourSerializedData现已准备好存储在blob中。

从blob获取数据后,您需要base64_decode然后反序列化 解码示例:

$theHTML = unserialize(base64_decode($YourSerializedData));

答案 5 :(得分:5)

序列化和反序列化非常常见。您还可以通过json_encode和json_decode使用JSON,以获得更少PHP特定的格式。

答案 6 :(得分:4)

如前所述 - 如果您不需要在数组中搜索数据,可以使用序列化 - 但这只是“仅限php”。所以我建议使用 json_decode / json_encode - 不仅是为了性能而且是为了便携性!

答案 7 :(得分:3)

呃,我不知道为什么每个人都建议序列化数组。

我说,最好的方法是将其真正适合您的数据库架构。我不知道(并且你没有提供线索)关于数组中数据的实际语义含义,但通常有两种方法来存储这样的序列

create table mydata (
  id int not null auto_increment primary key,
  field1 int not null,
  field2 int not null,
  ...
  fieldN int not null
)

这样您就可以将数组存储在一行中。

create table mydata (
    id int not null auto_increment primary key,
    ...
)

create table myotherdata (
    id int not null auto_increment primary key,
    mydata_id int not null,
    sequence int not null,
    data int not null
)

第一种方法的缺点显然是,如果你的数组中有很多项,那么使用该表将不是最优雅的。它也是不切实际的(可能,但也非常不优雅 - 只需使列可以为空)使用可变长度的序列。

对于第二种方法,您可以使用任何长度的序列,但只能使用一种类型。当然,您可以创建一个类型的varchar或类似的序列化数组的项目。不是最好的事情,但肯定比串行化整个阵列更好,对吗?

无论哪种方式,任何一种方法都能明显地获得能够访问序列中任意元素的优点,而且您不必担心序列化数组和类似丑陋的事情。

至于取回它。好吧,用查询得到适当的行/行序列,好吧,使用循环 ..对吗?

答案 8 :(得分:2)

您可以将数组保存为json 有json数据类型的文档:https://dev.mysql.com/doc/refman/5.7/en/json.html
我认为这是最好的解决方案,并且可以通过避免疯狂的功能来帮助您保持代码的可读性 我希望这对你有所帮助。

答案 9 :(得分:1)

检查implode函数,因为值在数组中,您希望将数组的值放入一个将值插入表中的mysql查询。

$query = "INSERT INto hardware (specifications) VALUES (".implode(",",$specifications).")";

如果数组中的值是文本值,则需要添加引号

$query = "INSERT INto hardware (specifications) VALUES ("'.implode("','",$specifications)."')";

mysql_query($query);

此外,如果您不想要重复值,请将“INto”切换为“IGNORE”,并且只会将唯一值插入表格中。

答案 10 :(得分:1)

我建议将implode / explode与您知道不会包含在任何单个数组项中的字符一起使用。然后将其作为字符串存储在SQL中。

答案 11 :(得分:0)

是的,序列化/反序列化是我在许多开源项目中看到的最多。

答案 12 :(得分:0)

您可以将序列化的对象(数组)插入mysql,例如serialize($object),还可以取消序列化对象的实例unserialize($object)

答案 13 :(得分:-4)

不是将其保存到数据库,而是将其保存到文件中,然后再调用它。

许多php应用程序(如sugarcrm)只是使用var_export将数组的所有数据回显到文件中。 这是我用来保存配置数据的内容:

private function saveConfig() {
    file_put_contents($this->_data['pathtocompileddata'],'<?php' . PHP_EOL . '$acs_confdata = ' . var_export($this->_data,true) . ';');        
}

我认为这是保存数据的更好方法!