Проблемы с serialize () и unserialize () - вставка и выбор данных PHP MySQL - PullRequest
0 голосов
/ 13 августа 2010

Я пытаюсь получить дату, указанную с помощью POST, а затем создать список дат за 12-недельный период с указанной даты начала. Эти даты затем попадают в БД и выводится 12-недельное расписание, с которым пользователь может взаимодействовать (добавлять / редактировать / удалять).

Я успешно беру дату начала, генерирую список дат на 12 недель и добавляю его в БД в сериализованной форме, но когда дело доходит до выбора дат для отображения, я получаю следующую ошибку:

Notice: unserialize() [function.unserialize]: Error at offset 0 of xxx bytes in ...

Вот мой код:

1-й файл .php здесь, чтобы взять форму ввода (дату), а затем получить список каждой даты за 12-недельный период с даты начала и вставить в БД:

Массив:

$start = strtotime($_POST['Start_Date']);
$dates=array();
for($i = 0; $i<=84; $i++)
{
    array_push($dates,date('Y-m-d', strtotime("+$i day", $start)));
}

$savetodb = serialize($dates);

Вставка:

$sql = "INSERT INTO programme VALUES (NULL, '20', '".$_POST["Start_Date"]."' , ' ".$savetodb." ', '".$_POST["Programme_Notes"]."')"; 

2-й файл .php здесь - ВЫБРАТЬ и десериализовать:

$result = mysql_query("SELECT Programme_Dates FROM programme");

while($row = mysql_fetch_array($result))
  {
  $dates = unserialize($row["Programme_Dates"]); 
  echo $dates;

  }

Из того, что я прочитал, проблема может быть связана со столбцом БД, в который вставлен сериализованный массив (т. Е. Он слишком мал), но для него установлено значение TEXT, так что все должно быть в порядке, верно? Я также думал, что в дате могут быть определенные символы, вызывающие проблемы, но при тестировании с «обычным» массивом (т. Е. Просто текстом) я получаю те же ошибки.

Любые предложения / советы очень ценятся, спасибо.

Ответы [ 2 ]

2 голосов
/ 13 августа 2010

Почему вы используете стрип-слэш?Моя ставка в том, что это проблема.Удалите это оттуда и посмотрите, работает ли это.

В качестве примечания следует избегать косых черт, так как если данные, вероятно, вставляются в базу данных, их следует экранировать должным образом, то есть не следует добавлять лишние косые черты.Если вам нужно убрать лишние черты из самих данных, я бы предложил использовать что-то вроде array_filter после , когда вы десериализовали массив.

РЕДАКТИРОВАТЬ

Вам также следует изучить SQL-инъекцию и способы ее предотвращения, поскольку ваш код может быть использован для эксплуатации.

ОБНОВЛЕНИЕ

Глядя дальше на свой код, вы вставляете сериализованный массив с двумя дополнительными пробелами: ' ".$savetodb." ', попробуйте использовать это '".$savetodb."', и посмотрите, исправит ли это вашевопрос.

0 голосов
/ 27 мая 2012

Я обнаружил, что значение сериализации, хранящееся в базе данных, преобразуется в другой формат. Так как хранилище данных сериализации заключает в кавычки метки, точку с запятой и скобку, mysql нужно сохранять самостоятельно, поэтому он автоматически помещает «backslash ()», который происходит от 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, хранящийся в таблице.

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