Php在Mysql中序列化数据

ale*_*lla 6 php mysql arrays serialization

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

Whi*_*ity 10

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

string(42) "a:1:{i:0;s:24:"a:4:{i:1;s:7:"fdsfdsf";i";}"
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

  • 由于php序列化数据返回二进制数据,因此不要使用VARCHAR或TEXT,而应使用VARBINARY或BLOB. (3认同)

Ja͢*_*͢ck 7

旧的方式

当你还在使用时mysql_,可以写下这样的查询:

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

推荐的方式

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

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

场长

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