Php在Mysql中序列化数据

时间:2012-05-31 15:19:40

标签: php mysql arrays serialization

我使用“serialize($array);”将数据保存在我的数据库(mysql)中。此数据来自具有输入字段的表单。我想知道如果我在表单字段中插入类似“a:4:{i:1;s:7:"fdsfdsf";i”的内容会发生什么。可能会破坏我存储在数据库中的数据? 谢谢!

3 个答案:

答案 0 :(得分:10)

我在我的系统上测试了你的例子,序列化后,返回以下值:

string(42) "a:1:{i:0;s:24:"a:4:{i:1;s:7:"fdsfdsf";i";}"

这将添加到数据库中。但是,非常不鼓励在数据库中存储用户输入。您应该首先使用mysql_real_escape_string()格式化普通用户输入,因为它将转义关键字符。

除此之外,如果在从数据库读回的序列化文本上调用 unserialize(),则会正确返回该数组。它应该是安全的,但会产生意想不到的结果。

非常小心将序列化数组存储在数据库中。序列化返回一个字符串,因此存储数据的字段通常是VARCHAR或TEXT。如果您只是用新的覆盖存储的数组,旧数据将完全丢失。要更新数据库,请确保首先将数据库中的数据读入数组并进行更新,然后再将其写回数据库。

虽然不禁止,但在数据库中使用和存储序列化的东西通常会产生很多问题。默认情况下,数据库有很多已知的数据类型,大型序列化数组会产生开销并使执行变得复杂,如果稍后需要修改系统,这只是一个痛苦的问题。并且您不能在序列化字段上使用关系查询。

答案 1 :(得分:7)

旧方式

当您仍在使用mysql_时,您可以编写如下查询:

$sql = sprintf("INSERT INTO mytable (a) VALUES ('%s')",
    mysql_real_escape_string(serialize($myvar))
);
mysql_query($sql) or die("oh no!");

推荐方式

对于PDOmysqli,您可以选择使用预准备语句,强烈建议这些语句用于防止SQL注入攻击向量。 PDO中的一个例子:

$stmt = $db->prepare('INSERT INTO mytable (a) VALUES (:myvar)');
$stmt->execute(array(
    ':myvar' => serialize($myvar),
));

字段长度

另外,请确保序列化数据的长度不超过表字段的列大小;截断的序列化变量几乎没用。

答案 2 :(得分:1)

阻止此操作的一种方法是在将数据插入数据库之前转义引号。

您可以使用mysqli_real_escape_string() http://www.php.net/manual/en/mysqli.real-escape-string.php

执行此操作