将PHP数组保存到MySQL?

Jas*_*vis 83 php mysql arrays

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

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

序列化和反序列化答案?

Pet*_*ist 84

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

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

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

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

考虑以下数组

$a = array(
    1 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
    2 => array(
        'a' => 1,
        'b' => 2,
        'c' => 3
    ),
);
Run Code Online (Sandbox Code Playgroud)

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

$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)
    )');
Run Code Online (Sandbox Code Playgroud)

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

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();
Run Code Online (Sandbox Code Playgroud)

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

function connect() {
    $c = mysql_connect($server, $username, $password);
    mysql_select_db('test');
    return $c;
}
Run Code Online (Sandbox Code Playgroud)


Mat*_*chu 26

通常,是的,序列化和反序列化是要走的路.

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

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

  • 既然你在这里,读者,我只是花时间宣布,我已经通过多年的经验发现,这真的不是一条路.接受的答案是一种更强大的方法. (22认同)
  • 正如你在这里,读者我将与你分享,这完全取决于你的要求.如果您不需要按数组值查询并且需要非常快速的东西,您可以安全地将您的数据存储在一个字段中(问题清楚地说明了这一点),在它上面打一个主键然后关闭.如果你想知道应用程序是什么:将数据推入每隔5分钟获得一次cron的que.另一个cron创建了需要更多时间的数组.que获取计算数据并将其传递给第三方API.没有更好的方法. (4认同)

小智 9

只需使用序列化PHP函数:

<?php
$myArray = array('1', '2');
$seralizedArray = serialize($myArray);
?>
Run Code Online (Sandbox Code Playgroud)

但是,如果您正在使用这样的简单数组,那么您也可以使用implode和explode.使用空数组而不是新数组.


sea*_*ass 9

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

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

从PHP手册:

查看页面上的"返回"

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

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

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

编码示例:

$YourSerializedData = base64_encode(serialize($theHTML));
Run Code Online (Sandbox Code Playgroud)

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

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

$theHTML = unserialize(base64_decode($YourSerializedData));
Run Code Online (Sandbox Code Playgroud)


Har*_*rry 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 . "');";
Run Code Online (Sandbox Code Playgroud)

然后,您可以使用简单查询搜索存储在数组中的数据

$query = "SELECT * FROM my_tbl_name WHERE array_data LIKE '%value3%'";
Run Code Online (Sandbox Code Playgroud)

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

$array = explode("array_separator", $array_data);
Run Code Online (Sandbox Code Playgroud)

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

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

$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']);
Run Code Online (Sandbox Code Playgroud)


cee*_*yoz 6

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


小智 5

如前所述-如果您不需要在数组中搜索数据,则可以使用序列化-但这是“仅PHP”。因此,我建议使用json_decode / json_encode-不仅用于性能,而且还用于可读性和可移植性(其他语言,例如javascript可以处理json_encoded数据)。