从mySQL反序列化值

时间:2011-03-03 10:20:20

标签: php mysql

我正在使用分类脚本并在wp_usermeta表中保存user_meta数据。 meta_key字段称为user_address_info,其中包含以下所有数据:

s:204:"a:7:{s:9:"user_add1";s:10:"my address";s:9:"user_add2";N;s:9:"user_city";s:7:"my city";s:10:"user_state";s:8:"my phone";s:12:"user_country";N;s:15:"user_postalcode";s:10:"comp phone";s:10:"user_phone";N;}";

我没有使用脚本上的所有字段,但是user_add1,user_city,user_state和user_postalcode

我无法使用SQL获取数据,如下例所示(wordpress):

$mylink = $wpdb->get_row("SELECT * FROM $wpdb->links WHERE link_id = 10", ARRAY_A);

我想在这里提供一些帮助,以便我可以在任何地方(我不介意使用任何类型的SQL查询)显示所请求的信息,例如当前作者ID的user_city(例如25)

我得到了以下示例,但我想要一些动态的

<?php
$s = 's:204:"a:7:{s:9:"user_add1";s:10:"my address";s:9:"user_add2";N;s:9:"user_city";s:7:"my city";s:10:"user_state";s:8:"my phone";s:12:"user_country";N;s:15:"user_postalcode";s:10:"comp phone";s:10:"user_phone";N;}"';
$u = unserialize($s);
$u2 = unserialize($u);
foreach ($u2 as $key => $value) {
   echo "<br />$key == $value";
}
?>

非常感谢。

2 个答案:

答案 0 :(得分:5)

不,您不能使用SQL来反序列化 这就是将序列化数据存储在数据库中的原因一个非常糟糕的主意

两次序列化的次数是两倍。

所以,除了使用你给出的代码之外,你什么都没有 虽然我看到的并不多 你遇到任何问题吗?
或者你只是想修复一些但不知道要修复什么?摆脱序列化然后

答案 1 :(得分:0)

我发现存储到数据库的序列化值转换为其他一些格式。由于序列化数据存储引号,分号,culry括号,mysql需要自己保存,所以它会自动放入来自gpc_magic_quotes(CMIIW)的“反斜杠()”。因此,如果您存储序列化数据并且想要使用它,则应在界面中使用html_entity_decode()以确保您具有PHP读取的实际格式。

这是我的样本:

$ser = $data->serialization; // assume it is the serialization data from database
$arr_ser = unserialize(html_entity_decode($ser));

nb:我已经尝试了它并且确实可以避免将这种类型存储在表格中(有风险)。这种方式也可以解决存储在表中的json格式。