我们如何在数据库中存储数组?
我正在做的是以下内容:
// $ data是一个数组
$v = base64_encode(json_encode($data));
$todo = 'INSERT INTO table (data) VALUES("' . $v . '")';
$sql = mysql_query($todo);
为什么我必须在将数组存储到数据库之前调用base64_encode? p>
答案 0 :(得分:2)
你在做什么可能是错的。你做出的许多决定都不是必要的,也可能不合适。
首先,将“冻结”数组存储在数据库中通常是一个坏主意,因为除了将它们取回之外你不能对它们做任何事情(你不能修改它们或根据它们的内容进行查询)。 “修复”此问题的解决方案是面向数据库的,包括更改表架构。我不知道你要做什么,所以我不会详细介绍。
然后,如果你想在数据库中序列化数组(有合法的用例)(编辑: ,只打算通过PHP代码访问它们 - 正如非常正确指出!),你应该使用的唯一东西是serialize
函数 - 而不是json_encode
或其他任何东西。这就是函数存在的原因。当您从数据库中获取值时,请使用deserialize
来恢复数组。
最后,在将变量注入SQL查询时,需要使用mysql_real_escape_string
(您没有这样做)将其转义。
这样做会更好 :
$sql = sprintf('INSERT INTO table (data) VALUES(\'%s\')',
mysql_real_escape_string(serialize($data)));
$result = mysql_query($sql);
答案 1 :(得分:1)
您不必调用base64_encode,但您必须使用mysql_real_escape_string转义该值。
答案 2 :(得分:1)
您无需调用base64_encode()。 json_encode()已经是一个字符串...当然,你只能使用$data
中的UTF-8编码值。
这是存储数组的合法方法,但您可以将表视为数组并每行存储一个值。此外,如果您的数据内容不与分隔符相互干扰,您可以将数据存储为XML字符串,甚至是CSV / TSV。
最重要的是,它实际上取决于您所处的情况。从您提供的代码中,这将有效,但如果您希望它能够正常/更好地工作,那么肯定需要更多信息。
注意:在输入数据库之前清理数据!
答案 3 :(得分:0)
当然,您不会将数组存储在关系数据库中。
从数组中获取base64似乎是一个技巧,因此您可以在数据库中存储字符串。