Php сериализация - PullRequest
       7

Php сериализация

0 голосов
/ 22 февраля 2009

Я пытаюсь сохранить сериализованные массивы в моей базе данных 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 ]

6 голосов
/ 22 февраля 2009

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());
}
2 голосов
/ 22 февраля 2009

Как сказано в руководстве:

mysql_fetch_array - извлечение строки результата в виде ассоциативного массива, числового массива или и того, и другого

и

unserialize () берет одну сериализованную переменную и преобразует ее обратно в значение PHP. [...] Возвращенное значение возвращается

Итак, ваш код должен выглядеть следующим образом:

$query = mysql_query("SELECT friends FROM users WHERE id='$myid'"); $row = mysql_fetch_array($query);</p> <p>$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)

0 голосов
/ 22 февраля 2009

Поскольку mysql_fetch_array() возвращает массив, вы не можете напрямую передать его в unserialize(). Вместо

unserialize($friends);

вам нужно использовать первый элемент в массиве:

if (isset($friends[0])) {
  $friendsDataArray = unserialize($friends[0]);
} else {
  // not found.
}
0 голосов
/ 22 февраля 2009

Вот что вам нужно сделать:

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

Т.е. просто захватите результат от десериализации в переменную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...