Php序列化

时间:2009-02-22 20:28:15

标签: php mysql serialization

我试图将序列化数组保存到我的mysql数据库中然后检索它们并取消它们但是我无法解决它们如何反序列化它们。这是我到目前为止:

$query = mysql_query("SELECT friends FROM users WHERE id='$myid'");
$friends = mysql_fetch_array($query);

unserialize($friends);

被困在这里?????

array_push($friends, $id);
$friendsUpdated = serialize($friends);

mysql_query("UPDATE users SET friends='$friendsUpdated' WHERE id='$myid'");

4 个答案:

答案 0 :(得分:6)

mysql_fetch_array返回一个数组,因此您需要选择所需数组的位:

$row = mysql_fetch_array($query);

$data=unserialize($row['friends']);

你也应该养成检查错误的习惯,例如

$result = mysql_query("SELECT friends FROM users WHERE id='$myid'");
if ($result) 
{
    if ($row = mysql_fetch_array($result))
    {
         $data=unserialize($row['friends']);

    }
    else
    {
         //empty result, set up empty data?
         $data=array();
    }

} 
else 
{
    die('Invalid query: ' . mysql_error());
}

答案 1 :(得分:2)

正如手册所说:

mysql_fetch_array - 将结果行作为关联数组,数字数组或两者获取

unserialize()接受一个序列化变量并将其转换回PHP值。 [...]返回转换后的值

所以你的代码应该是这样的:

$query = mysql_query("SELECT friends FROM users WHERE id='$myid'");
$row = mysql_fetch_array($query);

$friends = unserialize($row[0]);

对于进入数据库查询的任何变量,请始终转义用户输入,否则您可能会打开SQL注入的大门:(对于$ myid也是如此,以防您将其作为输入;如果你做了,请检查是否允许用户操纵该数据行)

mysql_query("UPDATE users SET friends='".mysql_real_escape_string($friendsUpdated)."' WHERE id='$myid'");

将某些内容回显给浏览器(以避免HTML注入/ XSS):html_entities($output)

答案 2 :(得分:0)

以下是您需要做的事情:

$query = mysql_query("SELECT friends FROM users WHERE id='$myid'");
$friendsFromDatabase = mysql_fetch_array($query);
$friends = unserialize($friendsFromDatabase[0]);

我只是将unserialize的结果抓到变量中。

答案 3 :(得分:0)

由于mysql_fetch_array()返回一个数组,因此无法将其直接传递给unserialize()。而不是

unserialize($friends);

你需要使用数组中的第一个元素:

if (isset($friends[0])) {
  $friendsDataArray = unserialize($friends[0]);
} else {
  // not found.
}